模拟 Spring Bean 生命周期

来源:互联网 发布:广告设计用什么软件 编辑:程序博客网 时间:2024/05/19 17:10



<?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-2.5.xsd">    <bean id="car" class="com.spring.lief_cycle.Car"          init-method="myInit"          destroy-method="myDestroy" scope="singleton">        <property name="brand" value="红旗CA72"></property>        <property name="maxSpeed" value="100"></property>    </bean></beans>



2016-11-02 17:25:54,952 DEBUG (DefaultSingletonBeanRegistry.java:215) - Creating shared instance of singleton bean 'car'2016-11-02 17:25:54,954 DEBUG (AbstractAutowireCapableBeanFactory.java:435) - Creating instance of bean 'car'InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation===========>调用Car构造函数.2016-11-02 17:25:54,978 DEBUG (AbstractAutowireCapableBeanFactory.java:509) - Eagerly caching bean 'car' to allow for resolving potential circular referencesInstantiationAwareBeanPostProcessor.postProcessAfterInstantiation2016-11-02 17:25:54,990 DEBUG (SpringFactoriesLoader.java:75) - Loaded [org.springframework.beans.BeanInfoFactory] names: [org.springframework.beans.ExtendedBeanInfoFactory]2016-11-02 17:25:54,994 DEBUG (CachedIntrospectionResults.java:231) - Getting BeanInfo for class [com.spring.lief_cycle.Car]2016-11-02 17:25:55,003 DEBUG (CachedIntrospectionResults.java:259) - Caching PropertyDescriptors for class [com.spring.lief_cycle.Car]2016-11-02 17:25:55,004 DEBUG (CachedIntrospectionResults.java:271) - Found bean property 'beanFactory' of type [org.springframework.beans.factory.BeanFactory]2016-11-02 17:25:55,007 DEBUG (CachedIntrospectionResults.java:271) - Found bean property 'beanName' of type [java.lang.String]2016-11-02 17:25:55,008 DEBUG (CachedIntrospectionResults.java:271) - Found bean property 'brand' of type [java.lang.String]2016-11-02 17:25:55,011 DEBUG (CachedIntrospectionResults.java:271) - Found bean property 'class' of type [java.lang.Class]2016-11-02 17:25:55,013 DEBUG (CachedIntrospectionResults.java:271) - Found bean property 'color' of type [java.lang.String]2016-11-02 17:25:55,014 DEBUG (CachedIntrospectionResults.java:271) - Found bean property 'maxSpeed' of type [int]InstantiationAwareBeanPostProcessor.postProcessPropertyValues2016-11-02 17:25:55,048 DEBUG (AbstractEnvironment.java:112) - Initializing new StandardEnvironment2016-11-02 17:25:55,051 DEBUG (MutablePropertySources.java:107) - Adding [systemProperties] PropertySource with lowest search precedence2016-11-02 17:25:55,053 DEBUG (MutablePropertySources.java:107) - Adding [systemEnvironment] PropertySource with lowest search precedence2016-11-02 17:25:55,055 DEBUG (AbstractEnvironment.java:116) - Initialized StandardEnvironment with PropertySources [systemProperties,systemEnvironment]2016-11-02 17:25:55,058 DEBUG (AbstractEnvironment.java:112) - Initializing new StandardEnvironment2016-11-02 17:25:55,060 DEBUG (MutablePropertySources.java:107) - Adding [systemProperties] PropertySource with lowest search precedence2016-11-02 17:25:55,062 DEBUG (MutablePropertySources.java:107) - Adding [systemEnvironment] PropertySource with lowest search precedence2016-11-02 17:25:55,064 DEBUG (AbstractEnvironment.java:116) - Initialized StandardEnvironment with PropertySources [systemProperties,systemEnvironment]2016-11-02 17:25:55,068 DEBUG (AbstractEnvironment.java:112) - Initializing new StandardEnvironment2016-11-02 17:25:55,070 DEBUG (MutablePropertySources.java:107) - Adding [systemProperties] PropertySource with lowest search precedence2016-11-02 17:25:55,072 DEBUG (MutablePropertySources.java:107) - Adding [systemEnvironment] PropertySource with lowest search precedence2016-11-02 17:25:55,074 DEBUG (AbstractEnvironment.java:116) - Initialized StandardEnvironment with PropertySources [systemProperties,systemEnvironment]2016-11-02 17:25:55,080 DEBUG (AbstractEnvironment.java:112) - Initializing new StandardEnvironment2016-11-02 17:25:55,082 DEBUG (MutablePropertySources.java:107) - Adding [systemProperties] PropertySource with lowest search precedence2016-11-02 17:25:55,084 DEBUG (MutablePropertySources.java:107) - Adding [systemEnvironment] PropertySource with lowest search precedence2016-11-02 17:25:55,086 DEBUG (AbstractEnvironment.java:116) - Initialized StandardEnvironment with PropertySources [systemProperties,systemEnvironment]2016-11-02 17:25:55,091 DEBUG (AbstractEnvironment.java:112) - Initializing new StandardEnvironment2016-11-02 17:25:55,093 DEBUG (MutablePropertySources.java:107) - Adding [systemProperties] PropertySource with lowest search precedence2016-11-02 17:25:55,095 DEBUG (MutablePropertySources.java:107) - Adding [systemEnvironment] PropertySource with lowest search precedence2016-11-02 17:25:55,098 DEBUG (AbstractEnvironment.java:116) - Initialized StandardEnvironment with PropertySources [systemProperties,systemEnvironment]2016-11-02 17:25:55,108 DEBUG (TypeConverterDelegate.java:413) - Converting String to [int] using property editor [org.springframework.beans.propertyeditors.CustomNumberEditor@e425743]设置Brand属性.调用BeanNameAware.setBeanName()调用BeanFactoryAware.setBeanFactory()调用BeanPostProcessor.postProcessBeforeInitialization(),color为空,默认设置成黑色2016-11-02 17:25:55,112 DEBUG (AbstractAutowireCapableBeanFactory.java:1529) - Invoking afterPropertiesSet() on bean with name 'car'调用InitializingBean.afterPropertiesSet()2016-11-02 17:25:55,113 DEBUG (AbstractAutowireCapableBeanFactory.java:1586) - Invoking init method  'myInit' on bean with name 'car'调用init-method所指定的myInit(),将maxSpeed设置为240调用BeanPostProcessor.postProcessAfterInitialization(),maxSpeed大于200 ,将maxSpeed调整为2002016-11-02 17:25:55,119 DEBUG (AbstractAutowireCapableBeanFactory.java:463) - Finished creating instance of bean 'car'brand:红旗CA72,color:黑色,maxSpeed:2002016-11-02 17:26:09,581 DEBUG (AbstractBeanFactory.java:246) - Returning cached instance of singleton bean 'car'car1==car2:true2016-11-02 17:26:28,440 DEBUG (DisposableBeanAdapter.java:226) - Invoking destroy() on bean with name 'car'调用DisposableBean.destroy()2016-11-02 17:26:28,442 DEBUG (DisposableBeanAdapter.java:302) - Invoking destroy method 'myDestroy' on bean with name 'car'调用destroy-method所指定的myDestroy()Disconnected from the target VM, address: '127.0.0.1:6638', transport: 'socket'Process finished with exit code 0





public class BeanLifeCycle {    private static void LifeCycleInBeanFactory() {        //装在配置文件并启动容器        Resource res = new ClassPathResource("config/lief_cycle/beans.xml");        BeanFactory bf = new XmlBeanFactory(res);        //向容器中注册MyBeanPostProcessor后处理器        ((ConfigurableBeanFactory) bf).addBeanPostProcessor(new MyBeanPostProcessor());        //向容器中注册MyInstantiationAwareBeanPostProcessor后处理器        ((ConfigurableBeanFactory) bf).addBeanPostProcessor(new MyInstantiationAwareBeanPostProcessor());        //第一次从容器中获取car,将触发容器实例化该Bean,这将引发Bean生命周期方法的调用        Car car1 = (Car) bf.getBean("car");        car1.introduce();        car1.setColor("红色");        //第二次从容器中获取car,是从缓存池中取得的        Car car2 = (Car) bf.getBean("car");       System.out.println("car1==car2:"+(car1==car2));        //关闭容器        ((XmlBeanFactory)bf).destroySingleton("car");    }    public static void main(String args[]){        LifeCycleInBeanFactory();    }}


public class MyBeanPostProcessor implements BeanPostProcessor {    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        if(beanName.equals("car")){            Car car  = (Car) bean ;            if(car.getColor()==null){                System.out.println("调用BeanPostProcessor.postProcessBeforeInitialization(),color为空,默认设置成黑色");                car.setColor("黑色");            }        }        return bean;    }    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        if(beanName.equals("car")){            Car car  = (Car) bean ;            if(car.getMaxSpeed()>200){                System.out.println("调用BeanPostProcessor.postProcessAfterInitialization(),maxSpeed大于200 ,将maxSpeed调整为200");                car.setMaxSpeed(200);            }        }        return bean;    }}

public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {    //接口方法:在实例化Bean前进行调用    @Override    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {        if ("car".equals(beanName)) {            System.out.println("InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation");        }        return null;    }    //接口方法:在实例化Bean后进行调用    @Override    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {        if ("car".equals(beanName)) {            System.out.println("InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation");        }        return true;    }    //接口方法,在设置某个属性时调用    @Override    public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {        //仅对容器中Car Bean进行处理,还可以通过post入参进行过滤。        //仅对car的某个特定属性进行处理        if ("car".equals(beanName)) {            System.out.println("InstantiationAwareBeanPostProcessor.postProcessPropertyValues");        }        return pvs;    }}





public class Car implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {//    private > default > protected > public    private String brand;    private String color;    private int maxSpeed;    private BeanFactory beanFactory;    private String beanName;    public Car() {        System.out.println("===========>调用Car构造函数.");    }    public String getBrand() {        return brand;    }    public void setBrand(String brand) {        System.out.println("设置Brand属性.");        this.brand = brand;    }    public String getColor() {        return color;    }    public void setColor(String color) {        this.color = color;    }    public int getMaxSpeed() {        return maxSpeed;    }    public void setMaxSpeed(int maxSpeed) {        this.maxSpeed = maxSpeed;    }    public void introduce() {        System.out.println("brand:" + brand + ",color:" + color + ",maxSpeed:" + maxSpeed);    }    @Override    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {        System.out.println("调用BeanFactoryAware.setBeanFactory()");        this.beanFactory = beanFactory;    }    @Override    public void setBeanName(String beanName) {        System.out.println("调用BeanNameAware.setBeanName()");        this.beanName = beanName;    }    @Override    public void destroy() throws Exception {        System.out.println("调用DisposableBean.destroy()");    }    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("调用InitializingBean.afterPropertiesSet()");    }    public void myInit() {        System.out.println("调用init-method所指定的myInit(),将maxSpeed设置为240");        this.maxSpeed = 240;    }    public void myDestroy() {        System.out.println("调用destroy-method所指定的myDestroy()");    }}





0 0
原创粉丝点击