Spring中的單例模式是通過Bean實(shí)例的緩存來實(shí)現(xiàn)的。當(dāng)Spring容器創(chuàng)建一個(gè)Bean時(shí),它首先檢查是否已經(jīng)存在一個(gè)該類型的Bean的實(shí)例,如果已經(jīng)存在就返回現(xiàn)有的實(shí)例,否則就創(chuàng)建一個(gè)新的實(shí)例并緩存起來,下次請(qǐng)求時(shí)再返回緩存中的實(shí)例。
具體實(shí)現(xiàn)方式如下:
<bean id="exampleBean" class="com.example.ExampleBean" scope="singleton">
</bean>
默認(rèn)情況下,Spring容器創(chuàng)建的Bean都是單例的,即在整個(gè)應(yīng)用程序中只有一個(gè)實(shí)例被創(chuàng)建和維護(hù)。
可以在Bean的配置文件中通過設(shè)置scope屬性為"singleton",來顯式地聲明該Bean為單例的,如下所示:
Spring還可以支持自定義的作用域,例如“prototype”等,通過實(shí)現(xiàn)Scope接口來完成。一個(gè)Scope的實(shí)現(xiàn)只需要 override Scope#get() 方法返回一個(gè)對(duì)象,這個(gè)對(duì)象需要是線程安全的,以及實(shí)現(xiàn)一些生命周期方法,如registerDestructionCallback來釋放資源等。
總結(jié)起來,Spring通過緩存已經(jīng)創(chuàng)建的Bean的實(shí)例來實(shí)現(xiàn)單例模式,既提高了應(yīng)用程序的執(zhí)行效率,又能夠保證Bean的唯一性。