一、單例模式的對象何時被建立?是使用getBean()方法獲取對象的時候建立呢?仍是建立spring容器的時候建立?java
咱們能夠測試一下:spring
先定義一個example類,爲其定義一個無參數的構造方法:app
public class ExampleBean { public ExampleBean() { System.out.println("建立了ExampleBean對象"); } public void execute() { System.out.println("調用了execute方法"); } public void init() { System.out.println("正在執行初始化方法中的操做。。。。"); } public void destroy() { System.out.println("對象資源釋放。。。"); } }
咱們在applicationContext.xml文件中指定其爲單例模式:測試
<!-- 建立一個ExampleBean對象 --> <bean id ="example" class="com.zlc.test.ExampleBean" init-method = "init" destroy-method="destroy" scope="singleton"> </bean>
運行如下的代碼:spa
public static void main(String[] args) { String conf = "applicationContext.xml"; //建立容器對象 AbstractApplicationContext ac = new ClassPathXmlApplicationContext(conf); }
運行結果爲:code
由此咱們能夠看出,單例模式的對象,是在建立spring容器時就會立刻建立的。可是非單例模式的對象並不會在此時立刻建立xml
咱們也能夠設置單例模式的對象延遲加載,並不在建立spring容器時立刻建立,而是在須要使用時再建立,也就是使用getBean()方法獲取時再加載,設置延遲加載的方法是:對象
<bean lazy-init="true"></bean>blog
添加這個屬性後的xml配置以下所示;資源
<bean id ="example" class="com.zlc.test.ExampleBean" init-method = "init" destroy-method="destroy" scope="singleton" lazy-init="true">
加了這樣的設置之後,就不會在建立spring容器時立刻建立單例模式的對象了
還能夠爲一組bean設置懶加載,初始化方式等:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"
default-lazy-init="true" default-init-method="init"> <bean id = "computer" class="com.zlc.test.Computer"> <constructor-arg index="0" ref="date"></constructor-arg> </bean> <bean id="date" class="java.util.Date"> </bean> </beans>
這樣設置,便可爲<beans></beans>中包含的bean統一指定懶加載方式以及初始化方法等。