spring学习笔记八 bean生命周期

来源:互联网 发布:大腿内侧黑色素知乎 编辑:程序博客网 时间:2024/05/24 01:47

一、首先建立一个cycle包,里面有三个类:

Car.java

package cycle;public class Car {public Car() {System.out.println("car construct...");}    private String brand;    public void setBrand(String brand) {    System.out.println("set brand..");this.brand = brand;}    public void init(){    System.out.println("init...");    }    public void destroy(){    System.out.println("destry...");    }@Overridepublic String toString() {return "Car [brand=" + brand + "]";}    }
Main.java

package cycle;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {// TODO Auto-generated method stub    ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("cycle.xml");    Car car =(Car) ctx.getBean("car");    System.out.println(car);    ctx.close();}}

MyBeanPostProcessor.java对BeanPostProcessor继承

package cycle;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("postProcessAfterInitialization "+" , "+bean+" , "+beanName);Car car =new Car();car.setBrand("DaZhong");/* * 通常情况下BeanPostProcessor是处理所有的bean的,所以操作指定的bean,要设置一个过滤; *  * */if("car".equals(beanName)){//....}return car;}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("postProcessBeforeInitialization "+" , "+bean+" , "+beanName);return bean;}}


二、配置cycle.xml文件

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="cycle.Car"    init-method="init" destroy-method="destroy">     <property name="brand" value="Audi"></property>    </bean>            <!-- 配置bean的后置处理器-->    <bean class="cycle.MyBeanPostProcessor"></bean></beans>



运行结果:

九月 06, 2017 3:20:19 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3f91beef: startup date [Wed Sep 06 15:20:19 CST 2017]; root of context hierarchy
九月 06, 2017 3:20:20 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [cycle.xml]

car construct...
set brand..
postProcessBeforeInitialization  , Car [brand=Audi] , car
init...
postProcessAfterInitialization  , Car [brand=Audi] , car
car construct...
set brand..
Car [brand=DaZhong]
九月 06, 2017 3:20:20 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@3f91beef: startup date [Wed Sep 06 15:20:19 CST 2017]; root of context hierarchy

destry...


1、配置bean的后置处理器:不需要配置id,IOC容器自动识别 

2、实现BeanPostProcessor接口,并具提供两个方法的实现:
    postProcessBeforeInitialization:init-method方法之前被调用
    postProcessAfterInitialization:init-method方法之后被调用
    
     bean:bean的本身
     benaName:IOC容器配置的bean的名字
     返回值:是实际上返回给用户的那个bean,注意可以再这两个方法中修改放回的bean,甚至返回一个新的bean


原创粉丝点击