Spring建立物件的三種方式
阿新 • • 發佈:2018-12-21
1.建立物件的三種方式和bean的生命週期的驗證:
Animal介面程式碼:
package cn.pb.dao; /** * 動物介面 */ public interface Animal { //吃飯 String eat(); //睡覺 void sleep(); }
Animal介面的實現類Dog的程式碼:
package cn.pb.dao.impl; /** * animal的實現類 */ import cn.pb.dao.Animal; public class Dog implements Animal{ /** * 無參構造 驗證什麼時候例項被建立 */ public Dog(){ System.out.println("dog被例項化了!"); } public String eat() { System.out.println("吃飯的方法"); return null; } public void sleep() { System.out.println("睡覺的方法"); } //初始化之後的方法 public void init(){ System.out.println("初始化之後的方法"); } //銷燬之前的方法 public void destroy(){ System.out.println("銷燬之前的方法"); } }
01.通過構造方法建立物件(常用的方式):
001.appicationContext.xml配置檔案
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--配置我們的Dog類 spring 框架在底層 通過反射的機制 執行了我們的構造方法-->
<bean id="dog" class="cn.pb.dao.impl.Dog"></bean>
</beans>
002.測試程式碼:
@Test public void test05(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println("********"); /** * 因為我們在容器中定義了id 根據id找到對應的類 * 這裡的dog是通過構造方法建立的 */ Animal dog=(Animal) context.getBean("dog"); dog.eat(); dog.sleep(); }
02.通過靜態工廠方法建立物件:
001.靜態工廠類:
package cn.pb.dao; import cn.pb.dao.impl.Dog; /** * AnimalFactory靜態工廠類 */ public class AnimalFactory { /** * 可以看到程式沒有走構造方法 */ public AnimalFactory(){ System.out.println("靜態工廠的無參構造===="); } //靜態工廠,不會走無參構造 public static Animal getDog(){ System.out.println("工廠中靜態獲取Dog例項的方法"); return new Dog(); } }
002.applicationContext.xml配置檔案:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--配置我們的Dog類 spring 框架在底層 01. 通過反射的機制 執行了我們的構造方法 <bean id="dog" class="cn.pb.dao.impl.Dog"></bean> --> <!--02.通過靜態工廠 來建立我們物件的例項 工廠的本身構造不會執行 因為我們的方法是靜態的 !類只會被載入,不會被例項化! getDog必須是靜態的--> <bean id="dog" class="cn.pb.util.AnimalFactory" factory-method="getDog"></bean>
</beans>
003.測試程式碼:
//使用靜態工廠來建立物件 @Test public void test06(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println("*************************"); /** * 因為我們在容器中定義了id 根據id找到對應的類 * 是通過靜態工廠來建立的 不走靜態工廠的構造方法 * 工廠的本身構造不會執行 因為我們的方法是靜態的 !類只會被載入,不會被例項化! */ Animal dog=(Animal) context.getBean("dog"); dog.eat(); dog.sleep(); }
03.通過動態工廠方法建立物件:
001.動態工廠類:
package cn.pb.dao; import cn.pb.dao.impl.Dog; /** * AnimalFactory動態工廠類 */ public class AnimalFactory { /** * 程式會先建立工廠例項 再呼叫getDog()方法 */ public AnimalFactory(){ System.out.println("動態工廠的無參構造===="); } //動態工廠 會先走無參構造 建立例項 public Animal getDog(){ System.out.println("工廠中動態工廠獲取Dog例項的方法"); return new Dog(); } }
002.applicationContext.xml配置檔案:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--配置我們的Dog類 spring 框架在底層 01. 通過反射的機制 執行了我們的構造方法 <bean id="dog" class="cn.pb.dao.impl.Dog"></bean> --> <!--02.通過靜態工廠 來建立我們物件的例項 工廠的本身構造不會執行 因為我們的方法是靜態的 !類只會被載入,不會被例項化! getDog必須是靜態的 <bean id="dog" class="cn.pb.util.AnimalFactory" factory-method="getDog"></bean> --> <!--03.動態工廠建立 物件的例項--> <bean id="factory" class="cn.pb.util.AnimalFactory"></bean><!-- 呼叫哪個工廠裡的哪個方法 來建立物件 物件的id是dog--> <bean id="dog" factory-bean="factory" factory-method="getDog"/> </beans>
003.測試程式碼:
//使用動態工廠來建立物件 @Test public void test06(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println("*************************"); /** * 因為我們在容器中定義了id 根據id找到對應的類 * 是通過動態工廠來建立的 首先要獲得動態工廠的bean * 然後再dog的bean */ Animal dog=(Animal) context.getBean("dog"); dog.eat(); dog.sleep(); }
04.驗證bean的生命週期:
001.在Dog類中新增兩個方法:
//初始化之後的方法 public void init(){ System.out.println("初始化之後的方法"); } //銷燬之前的方法 public void destroy(){ System.out.println("銷燬之前的方法"); }
002.applicationContext.xml配置檔案程式碼:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--配置我們的Dog類 spring 框架在底層 01. 通過反射的機制 執行了我們的構造方法 <bean id="dog" class="cn.pb.dao.impl.Dog"></bean> --> <!--02.通過靜態工廠 來建立我們物件的例項 工廠的本身構造不會執行 因為我們的方法是靜態的 !類只會被載入,不會被例項化! getDog必須是靜態的 <bean id="dog" class="cn.pb.util.AnimalFactory" factory-method="getDog"></bean> --> <!--03.動態工廠建立 物件的例項 <bean id="factory" class="cn.pb.util.AnimalFactory"></bean>例項化工廠--> <!-- 呼叫哪個工廠裡的哪個方法 來建立物件 物件的id是dog <bean id="dog" factory-bean="factory" factory-method="getDog2"/>--> <!-- 設定bean的生命始末 --> <bean id="dog" class="cn.pb.dao.impl.Dog" init-method="init" destroy-method="destroy"></bean> </beans>
003.測試程式碼:
/** * 設定bean的生命週期始末 * 01.在Dog類中新增兩個方法 init() destroy() * 02.在容器中 配置 * init-method="init" destroy-method="destroy" */ @Test public void test08(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println("*************************"); Animal dog=(Animal) context.getBean("dog"); System.out.println(dog); /* * 想看到destroy-method="destroy" 的效果 有兩個前提 * 01.bean必須是單例的 * 02.容器需要手動的關閉 */ ((ClassPathXmlApplicationContext)context).close(); }