下面看實驗:
調用下面時,就建立了容器和對象
ApplicationContext ctx = new ClassPathXmlApplicationContext("cycle.xml");
那它又是怎樣一步步建立的呢?要銷毀怎麼銷毀?
用一個例子來看
package com.beans.cycle.Car;
public class Car {
private String brand;
public Car(){
System.out.println("構造函數。。");
}
public String getBrand() {
System.out.println("傳回屬性。。");
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
System.out.println("設定屬性。。");
}
public void init(){
System.out.println("init()。。");
}
public void destroy(){
System.out.println("destroy()。。");
}
}
xml中用init-mehod、 destroy-method表示調用初始化函數和銷毀函數
<bean id="car" class="com.beans.cycle.Car" init-method="init" destroy-method="destroy">
<property name="brand" value="Aodi"></property>
</bean>
運作主類
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("cycle.xml");
Car car=(Car)ctx.getBean("car");
System.out.println(car);
//關閉IOC容器
ctx.close();
輸出:
構造函數。。//構造器
設定屬性。。//setter方法
init()。。
car[brand=Aodi] //傳回這個bean
destroy()。。//容器關閉時調用這個方法
先調用構造函數和設定屬性,然後再init()。
建立Bean後置處理器
Bean後置處理器允許在調用初始化方法前後對Bean進
行額外的處理.
Bean後置處理器對I0C容器裡的所有Bean執行個體逐一處
理,而非單一執行個體.其典型應用是:檢查Bean屬性的正确性鹹根據特定的标準更改Bean的屬性.
對Bean 後置處理器而言,需要實作BeanPostProcessor接口.在初始化方法被調用前後,Spring将把每個Bean執行個體分别傳遞給上述接口的以下兩個方法:postProcessBeforeInitialization和postProcessAfterInitialization
bean後置處理器:檢查bean屬性的正确性或根據需要修改屬性,要實作BeanPostProcessor接口
寫一個實作類MyBeanPostProcessor
package com.beans.cycle.Car;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override //before
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessBeforeInitialization: "+bean +beanName);
return bean;
}
@Override //after
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessAfterInitialization: "+bean +beanName);
return bean;
}
}
xml
<bean id="car" class="com.beans.cycle.Car" init-method="init" destroy-method="destroy">
<property name="brand" value="Aodi"></property>
</bean>
<!--配置bean後置處理器,不需要配置id-->
<bean class="com.beans.cycle.Car"></bean>
跑一下,注意:一個再init之前調用,一個再init之後調用
構造函數。。
設定屬性。。
postProcessBoforeInitialization: car[brand=Aodi], car
init()。。
postProcessAfterInitialization: car[brand=Aodi], car
car[brand=Aodi]
destroy()。。
如何修改屬性? 在接口函數中修改
package com.beans.cycle.Car;
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);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessAfterInitialization: "+bean +beanName);
Car car = (Car) bean; // 擷取要修改的bean對象
car.setBrand("Ford"); //修改屬性
return bean;
}
}
注意:上面的bean是bean執行個體本身;beanName指IOC容器配置的bean的名字
這樣,就成功修改了屬性,輸出:
構造函數。。
設定屬性。。
postProcessBoforeInitialization:car[brand=Aodi], car
init()。。
postProcessAfterInitialization: car[brand=Aodi], car
car[brand=Ford]
destroy()。。
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessBeforeInitialization: "+bean +beanName);
if("car".equals(beanName)){
//過濾的操作
}
return bean;
}