博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《精通Spring4.X企业应用开发实战》读后感第四章(BeanFactory生命周期)
阅读量:4977 次
发布时间:2019-06-12

本文共 6557 字,大约阅读时间需要 21 分钟。

 

package com.smart;import org.springframework.beans.BeansException;import org.springframework.beans.factory.*;public class Car implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean{    private String brand;    private String color;    private int maxSpeed;    private BeanFactory beanFactory;    private String beanName;    //默认构造函数    public Car(){System.out.println("调用Car()构造函数");}    //带参构造函数    public Car(String brand, String color, int maxSpeed) {        this.brand = brand;        this.color = color;        this.maxSpeed = maxSpeed;    }    //未带参方法    public void introduce() {        System.out.println("brand:" + brand + ";color:" + color + ";maxSpeed:" + maxSpeed);    }    public String getBrand() {        return brand;    }    public void setBrand(String brand) {        System.out.println("调用setBrand()设置属性");        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;    }    // BeanFactoryAware接口方法    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {        System.out.println("调用BeanFactoryAware.setBeanFactory().");        this.beanFactory = beanFactory;    }    // BeanNameAware接口方法    public void setBeanName(String s) {        System.out.println("调用BeanNameAware.setBeanName().");        this.beanName = s;    }    // DisposableBean接口方法    public void destroy() throws Exception {        System.out.println("调用DisposableBean.destroy().");    }    // InitializingBean接口方法    public void afterPropertiesSet() throws Exception {        System.out.println("调用InitialingBean.afterPropertiesSet().");    }    // 通过
的init-method属性指定的初始方法 public void myInit() { System.out.println("调用init-method属性指定的myInit(), 将maxSpeed设置为240"); this.maxSpeed = 240; } //同过
的destroy-method属性指定的销毁方法 public void myDestroy() { System.out.println("调用destroy-method属性指定的myDestroy()."); }}

package com.smart.beanfactory;import org.springframework.beans.BeansException;import org.springframework.beans.PropertyValues;import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;import java.beans.PropertyDescriptor;public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {    @Override    // 1.接口方法,在实例化Bean前调用    public Object postProcessBeforeInstantiation(Class
beanClass, String beanName) throws BeansException { // 1-1. 仅对容器中的car Bean进行处理 if ("car".equals(beanName)) { System.out.println("调用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()."); } return null; } @Override // 2.接口方法,在实例化Bean后调用 public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { if ("car".equals(beanName)) { System.out.println("调用InstantiationAwarePostProcessor.postProcessorAfterInstantiation()."); } return true; } @Override // 3.接口方法,在设置某个属性时调用 public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { // 3-1. 仅对容器中的car Bean进行处理, 还可以同过pds入参进行过滤 if ("car".equals(beanName)) { System.out.println("调用InstantiationAwarePostProcessor.postProcessPropertyValues()."); } return pvs; }}

package com.smart.beanfactory;import com.smart.Car;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor {    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        if ("car".equals(beanName)) {            Car car = (Car) bean;            if (car.getColor() == null) {                System.out.println("调用BeanPostProcessor.postProcessBeforeInitialization()," +                        "若color为空,设置为默认黑色");                car.setColor("黑色");            }        }        return bean;    }    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        if ("car".equals(beanName)) {            Car car = (Car) bean;            if (car.getMaxSpeed() >= 200) {                System.out.println("调用BeanPostProcessor.postProcessAfterInitialization()," +                        "将maxSpeed设置为200");                car.setMaxSpeed(200);            }        }        return bean;    }}

package com.smart.beanfactory;import com.smart.Car;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.config.ConfigurableBeanFactory;import org.springframework.beans.factory.support.DefaultListableBeanFactory;import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.core.io.ClassPathResource;import org.springframework.core.io.Resource;public class BeanLifeCycle {    public static void lifeCycleInBeanFactory() {        // 1. 装载配置文件并启动容器        Resource res = new ClassPathResource("beans.xml");        BeanFactory bf = new DefaultListableBeanFactory();        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader((DefaultListableBeanFactory) bf);        reader.loadBeanDefinitions(res);        //后处理器的实际调用顺序与注册顺序无关,在具有多个后处理器的情况下,必须通过实现        //org.springframework.core.Ordered接口来确定调用顺序        // 2. 向容器中注册MyBeanPostProcessor后处理器        ((ConfigurableBeanFactory) bf).addBeanPostProcessor(new MyBeanPostProcessor());        // 3. 向容器中注册MyInstantiationAwareBeanPostProcessor后处理器        ((ConfigurableBeanFactory) bf).addBeanPostProcessor(new MyInstantiationAwareBeanPostProcessor());        // 4. 第一次从容器中获得car, 将触发容器实例化该Bean,这将引发Bean生命周期方法的调用        Car car1 = (Car) bf.getBean("car");        car1.introduce();        car1.setColor("红色");        // 5. 第二次从容器中获取car, 直接从缓存池中获取        Car car2 = (Car) bf.getBean("car");        // 6. 查看car1和car2是否指向同一引用        System.out.println("car1==car2: " + (car1 == car2));        // 7. 关闭容器        ((DefaultListableBeanFactory) bf).destroySingleton("car");    }    public static void main(String[] args) {        lifeCycleInBeanFactory();    }}

 

转载于:https://www.cnblogs.com/Michael2397/p/7933195.html

你可能感兴趣的文章
doGet & doPost
查看>>
jQuery动画
查看>>
Windows Phone 7 和 Iphone 联系人带头像同步方案
查看>>
jquery判断两次密码不一致
查看>>
三、oneinstack
查看>>
ASP.NET数据格式的Format-- DataFormatString
查看>>
1.3 将临时变量内联化
查看>>
Android onLowMemory()和onTrimMemory()
查看>>
TextView 设置maxLength
查看>>
大道至简 读后有感
查看>>
让git不再跟踪配置文件的变化
查看>>
项目管理
查看>>
CentOS7下安装MySQL
查看>>
Ajax 应用六个需要注意的事项
查看>>
RDD认知
查看>>
9.实现多重继承
查看>>
逆向pomelo记录(1)
查看>>
CMS
查看>>
spring使用rssfeed
查看>>
JS之try..catch...
查看>>