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