Pertanyaan Pola desain Singleton vs kacang Singleton di Spring container


Seperti yang kita semua tahu kita memiliki kacang sebagai tunggal secara default dalam kontainer Spring dan jika kita memiliki aplikasi web berdasarkan pada kerangka Spring maka dalam hal itu kita benar-benar perlu menerapkan pola desain Singleton untuk menyimpan data global daripada hanya menciptakan kacang melalui musim semi .

Harap bersabarlah jika saya tidak dapat menjelaskan apa yang sebenarnya ingin saya tanyakan.


76
2018-04-14 13:47


asal


Jawaban:


Kacang tunggal di musim semi dan pola tunggal sangat berbeda. Pola Singleton mengatakan bahwa satu dan hanya satu contoh dari kelas tertentu yang akan dibuat per classloader.

Ruang lingkup Musim Semi tunggal digambarkan sebagai "per kontainer per kacang". Ini adalah ruang lingkup definisi kacang untuk contoh objek tunggal per kontainer Spring IoC. Cakupan default di Spring adalah Singleton.

Meskipun ruang lingkup default adalah tunggal, Anda dapat mengubah lingkup kacang dengan menentukan atribut lingkup <bean ../> elemen.

<bean id=".." class=".." scope="prototype" />

49
2018-04-14 20:25



Lingkup Singleton di musim semi berarti satu contoh dalam konteks Musim Semi ..
Spring container hanya mengembalikan contoh yang sama lagi dan lagi untuk panggilan berikutnya untuk mendapatkan kacang.
 
 
Dan musim semi tidak mengganggu jika kelas kacang dikodekan sebagai tunggal atau tidak, sebenarnya jika kelas dikodekan sebagai tunggal yang konstruktor sebagai pribadi, Spring menggunakan BeanUtils.instantiateClass (javadoc sini) untuk mengatur konstruktor agar dapat diakses dan menjalankannya.

Atau, kita dapat menggunakan atribut pabrik-metode dalam definisi kacang seperti ini

    <bean id="exampleBean" class="example.Singleton"  factory-method="getInstance"/>

25
2018-06-20 15:27



Mari kita ambil contoh yang paling sederhana: Anda memiliki aplikasi dan Anda hanya menggunakan classloader default. Anda memiliki kelas yang, karena alasan apa pun, Anda memutuskan bahwa itu tidak boleh memiliki lebih dari satu contoh dalam aplikasi. (Pikirkan skenario di mana beberapa orang bekerja pada bagian aplikasi).

Jika Anda tidak menggunakan framework Spring, pola Singleton memastikan bahwa tidak akan ada lebih dari satu instance dari kelas dalam aplikasi Anda. Itu karena Anda tidak dapat memberi contoh pada kelas dengan melakukan 'baru' karena konstruktor itu pribadi. Satu-satunya cara untuk mendapatkan instance dari kelas adalah memanggil beberapa metode statis kelas (biasanya disebut 'getInstance') yang selalu mengembalikan instance yang sama.

Mengatakan bahwa Anda menggunakan framework Spring dalam aplikasi Anda, hanya berarti bahwa selain cara biasa mendapatkan instance dari kelas (metode baru atau statis yang mengembalikan instance kelas), Anda juga dapat meminta Spring untuk mendapatkan Anda sebuah instance dari kelas itu dan Spring akan memastikan bahwa kapan pun Anda memintanya untuk sebuah instance dari kelas itu, ia akan selalu mengembalikan instance yang sama, bahkan jika Anda tidak menulis kelas menggunakan pola Singleton. Dengan kata lain, bahkan jika kelas memiliki konstruktor publik, jika Anda selalu meminta Spring untuk sebuah instance dari kelas itu, Spring hanya akan memanggil konstruktor itu sekali selama kehidupan aplikasi Anda.

Biasanya jika Anda menggunakan Spring, Anda seharusnya hanya menggunakan Spring untuk membuat instance, dan Anda dapat memiliki konstruktor publik untuk kelas. Tetapi jika konstruktor Anda tidak bersifat pribadi Anda tidak benar-benar mencegah siapa pun membuat contoh baru dari kelas secara langsung, dengan melewati Spring.

Jika Anda benar-benar menginginkan satu instance dari kelas, bahkan jika Anda menggunakan Spring di aplikasi Anda dan tentukan kelas di Spring untuk menjadi tunggal, satu-satunya cara untuk memastikan itu juga menerapkan kelas menggunakan pola Singleton. Itu memastikan bahwa akan ada satu contoh, apakah orang menggunakan Spring untuk mendapatkan instance atau memotong Spring.


18
2018-05-08 09:58



Lingkup Singleton di Spring berarti bahwa kacang ini hanya akan dipakai sekali oleh Spring. Berbeda dengan ruang lingkup prototipe (contoh baru setiap kali), lingkup permintaan (sekali per permintaan), lingkup sesi (sekali per sesi HTTP).

Ruang lingkup Singleton secara teknis berkaitan dengan pola desain tunggal. Anda tidak harus menerapkan kacang Anda sebagai lajang untuk mereka untuk dimasukkan ke dalam lingkup tunggal.


9
2018-04-14 17:00



Kacang singleton di musim semi dan kelas berdasarkan pola desain Singleton sangat berbeda.

Pola Singleton memastikan bahwa satu dan hanya satu contoh dari kelas tertentu yang akan dibuat per classloader di mana sebagai lingkup kacang Spring singleton digambarkan sebagai 'per kontainer per kacang'. Lingkup Singleton di Spring berarti bahwa kacang ini hanya akan dipakai sekali oleh Spring. Spring container hanya mengembalikan contoh yang sama lagi dan lagi untuk panggilan berikutnya untuk mendapatkan kacang.


2
2017-11-27 18:29



Saya menemukan "per kontainer per kacang" sulit untuk dipahami. Saya akan mengatakan "satu kacang per kacang id". Mari kita punya contoh untuk memahaminya. Kami memiliki sampel kelas kacang. Saya telah mendefinisikan dua biji dari kelas ini dalam definisi kacang, seperti:

<bean id="id1" class="com.example.Sample" scope="singleton">
        <property name="name" value="James Bond 001"/>    
</bean>    
<bean id="id7" class="com.example.Sample" scope="singleton">
        <property name="name" value="James Bond 007"/>    
</bean>

Jadi ketika saya mencoba untuk mendapatkan kacang dengan id "id1", wadah musim semi akan membuat satu kacang, menyimpannya dan mengembalikan kacang yang sama yang pernah disebut id1. Jika saya mencoba mendapatkannya dengan id7, kacang lain akan dibuat dari kelas Sampel, yang sama akan di-cache dan dikembalikan setiap kali Anda merujuk itu dengan id7.

Ini tidak mungkin dengan pola Singleton. Dalam pola Singlton, satu objek per loader kelas selalu dibuat. Tapi di musim semi banyak objek sedang dibuat untuk kelas yang sama. Namun di Spring membuat ruang lingkup sebagai Singleton mengembalikan objek yang sama untuk id yang sama. Referensi


2
2018-01-01 20:11



"tunggal" di musim semi menggunakan pabrik kacang mendapatkan contoh, lalu simpan; pola desain tunggal yang ketat, contoh hanya dapat diambil dari metode statis get, dan objek tidak pernah dapat publik instantiated.


1
2017-10-01 06:20



EX: "per kontainer per kacang".

        <bean id="myBean" class="com.spring4hibernate4.TestBean">
            <constructor-arg name="i" value="1"></constructor-arg>
            <property name="name" value="1-name"></property>
        </bean>

        <bean id="testBean" class="com.spring4hibernate4.TestBean">
            <constructor-arg name="i" value="10"></constructor-arg>
            <property name="name" value="10-name"></property>
        </bean>
    </beans>



    public class Test {

        @SuppressWarnings("resource")
        public static void main(String[] args) {
            ApplicationContext ac = new ClassPathXmlApplicationContext("ws.xml");
            TestBean teatBean = (TestBean) ac.getBean("testBean");
            TestBean myBean1 = (TestBean) ac.getBean("myBean");
            System.out.println("a : " + teatBean.test + " : "   + teatBean.getName());
            teatBean.setName("a TEST BEAN 1");
            System.out.println("uPdate : " + teatBean.test + " : "  + teatBean.getName());
            System.out.println("a1 : " + myBean1.test + " : " + myBean1.getName());
            myBean1.setName(" a1 TEST BEAN 10");
            System.out.println("a1 update : " + teatBean.test + " : " + myBean1.getName());
        }
    }

public class TestBean {
    public int test = 0;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name = "default";

    public TestBean(int i) {
        test += i;
    }
}

JAVA SINGLETON:

public class Singleton {
    private static Singleton singleton = new Singleton();
    private int i = 0;

    private Singleton() {
    }

    public static Singleton returnSingleton() {

        return singleton;
    }

    public void increment() {
        i++;
    }

    public int getInt() {
        return i;
    }
}

public static void main(String[] args) {
        System.out.println("Test");

        Singleton sin1 = Singleton.returnSingleton();
        sin1.increment();
        System.out.println(sin1.getInt());
        Singleton sin2 = Singleton.returnSingleton();
        System.out.println("Test");
        sin1.increment();
        System.out.println(sin1.getInt());
    }

1
2017-09-16 10:15