spring_(10)IOC容器中Bean的生命週期
阿新 • • 發佈:2018-11-21
- SpringIOC容器可以管理Bean的生命週期,Spring允許在Bean生命週期的特定點執行定製的任務
- SpringIOC容器對Bean的生命週期進行管理的過程:
- 通過構造器或工廠方法建立Bean例項
- 為Bean的屬性設定值和對其他Bean的引用
- 呼叫Bean的初始化方法
- Bean可以使用了
- 當容器關閉時,呼叫Bean的銷燬方法
- 在Bean的聲明裡設定 init-method 和 destroy-method 屬性,為 Bean 指定初始化和銷燬方法.
例子程式
基本結構
Car.java
package com.spring.beans.cycle;
public class Car {
public Car(){
System.out.println("Car's Constructor...");
}
private String brand;
public void setBrand(String brand) {
this.brand = brand;
System.out.println("set...");
}
public void init(){
System.out.println("init...");
}
public void destroy(){
System.out.println("destroy...");
}
}
beans-cycle.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">
<bean id = "car" class="com.spring.beans.cycle.Car"
init-method="init"
destroy-method="destroy">
<property name="brand" value="Audi"></property>
</bean>
</beans>
Main.java
package com.spring.beans.cycle;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args){
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car);
//關閉IOC容器
ctx.close();
}
}
執行結果
建立Bean後置處理器
- Bean後置處理器允許在呼叫初始化方法前後對Bean進行額外的處理
- Bean後置處理器對IOC容器裡的所有Bean例項逐一處理,而非單一例項.其典型應用是:檢查Bean屬性的正確性或根據特定的標準更改Bean的屬性
- 對Bean後置處理器而言,需要實現Interface BeanPostProcessor介面。在初始化方法被呼叫前後,Spring將把每個Bean例項分別傳遞給上述介面的以下兩個方法
新增Bean後置處理器後Bean的生命週期
-
SpringIOC容器對Bean的生命週期進行管理的過程:
- 通過構造器或工廠方法建立Bean例項
- 為Bean的屬性設定值和對其他Bean的引用
- 將Bean例項傳遞給Bean後置處理器的postProcessBeforeInitialization方法
- 呼叫Bean的初始化方法
- 將Bean例項傳遞給Bean後置處理器的postProcessAfterInitialization方法
- Bean可以使用了
- 當容器關閉時,呼叫Bean的銷燬方法
例子程式
基本結構
Car.java 同上
MyBeanPostProcessor.java (實現了 BeanPostProcessor 介面)
package com.spring.beans.cycle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization: "+ bean+", "+beanName);
if("car".equals(beanName)){
//...
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization: "+ bean+", "+beanName);
Car car = new Car();
car.setBrand("Ford");
return car;
}
}
beans-cycle.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">
<bean id = "car" class="com.spring.beans.cycle.Car"
init-method="init"
destroy-method="destroy">
<property name="brand" value="Audi"></property>
</bean>
<!--
實現BeanPostProcessor介面,並具體提供
public Object postProcessBeforeInitialization(Object bean, String beanName): init-method 之前被呼叫
public Object postProcessAfterInitialization(Object bean, String beanName) : init-mrthod 之後被呼叫
的實現
bean: bean 例項本身
beanName: IOC 容器配置的bean的名字
返回值:是實際上返回給使用者的那個Bean,注意:可以在以上兩個方法中修改返回的bean,甚至返回一個新的bean
-->
<!--配置bean的後置處理器: 不需要配置id,IOC容器自動識別是一個BeanPostProcessor-->
<bean class="com.spring.beans.cycle.MyBeanPostProcessor"></bean>
</beans>
Main.java
package com.spring.beans.cycle;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args){
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car);
//關閉IOC容器
ctx.close();
}
}