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();
}