博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring中bean生命周期
阅读量:4983 次
发布时间:2019-06-12

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

一  bean指定初始化和销毁方法

1、bean的生命周期:bean的创建 ---> 初始化 ---> 销毁的过程

   bean的生命周期有容器来管理

   单例的bean在创建时执行初始化方法,在spring关闭时执行销毁方法

   原型的bean在每次获取时执行初始化方法,没有销毁方法

   我们可以自己指定初始化和销毁方法,要指定的方法必须是bean所属的类的方法。注意:这个方法必须是个无参的方法

2、创建实体类

public class Car {        private String name;        public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public  Car() {            }        public  Car(String name) {        this.name = name;    }        public void init() {        System.out.println("car init");    }        public void destroy() {        System.out.println("car destroy");    }}

3、创建bean

@Bean(initMethod="init",destroyMethod="destroy")    public Car getCar() {        return new Car("car");    }

4、创建测试方法

public static void main(String[] args) {        ApplicationContext application = new AnnotationConfigApplicationContext(MainConfig.class);                ((AnnotationConfigApplicationContext)application).close();    }

这样就能看到后台先打印初始化方法,执行 ((AnnotationConfigApplicationContext)application).close()后打印销毁方法

 

二  InitializingBean和DisposableBean创建初始化和销毁方法

1、bean所属的类实现 InitializingBean和DisposableBean并重写他们的方法就可以创建初始化和销毁方法

2、示例

public class Dog implements InitializingBean,DisposableBean{        private String name;        public void setName(String name) {        this.name = name;    }    public  Dog() {            }        public  Dog(String name) {        this.name = name;    }        /* 初始化方法 */    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("dog init");    }        /* 销毁方法 */    @Override    public void destroy() {        System.out.println("dog destroy");    }}

 

三  使用 @PostConstruct和@PreDestroy 创建初始化和销毁方法

1、示例

public class Mouse {        private String name;        public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }        public  Mouse(String name) {        this.name = name;    }        @PostConstruct    public void init() {        System.out.println("mouse init");    }        @PreDestroy    public void destroy() {        System.out.println("mouse destroy");    }}

 

四 BeanPostProcessor的应用

1、BeanPostProcessor 是一个接口,实现了 BeanPostProcessor 的类在注册为bean时作为一个AOP拦截bean的初始化方法

2、BeanPostProcessor 中的方法:

  Object postProcessBeforeInitialization(Object bean, String beanName)  //初始化方法执行之前拦截执行的方法

  Object postProcessAfterInitialization(Object bean, String beanName)   //初始化方法return之前拦截执行的方法。

3、示例

@Componentpublic class MyBeanPostProcessor implements BeanPostProcessor{    /**     * 初始化方法执行之前拦截的方法     *      * Object: 创建的bean     * beanName: bean的id     * @return 返回bean的原始实例或包装的实例,返回为null将会报错     */    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean);        return bean;    }    /**     * 初始化方法return之前拦截的方法     *      * Object: 创建的bean     * beanName: bean的id     * @return 返回bean的原始实例或包装的实例,返回为null将会报错     */    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);        return bean;    }}

 

五  BeanPostProcessor的原理:

AbstractAutowireCapableBeanFactory.doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args){  //从这一步开始进入创建bean的方法  ...  populateBean(beanName, mbd, instanceWrapper);  //给bean进行属性赋值  initializeBean(beanName, exposedObject, mbd){  //进入初始化bean方法    applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);  //执行初始化方法执行之前拦截的方法    invokeInitMethods(beanName, wrappedBean, mbd);  //执行自定义初始化方法    applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);  //执行初始化方法return之前拦截的方法  }  ...}

 

六  BeanPostProcessor在spring底层的使用:

1、spring中的所有注解的具体工作实现都是有BeanPostProcessor家族的类来完成的,比如:

  AutowiredAnnotationBeanPostProcessor  //处理所有@Autowired注解完成自动注入

  

 

转载于:https://www.cnblogs.com/programmlover/p/10140798.html

你可能感兴趣的文章
[批处理]批量将文件名更名为其上级目录名
查看>>
如何查找ORACLE中的跟踪文件
查看>>
SQL Server将一列的多行内容拼接成一行
查看>>
Spring Controller RequestMapping
查看>>
socket
查看>>
小程序 跳转问题 (来源见注明)
查看>>
JBPM4入门——9.自动节点单线执行
查看>>
//停止关联的进程
查看>>
SQL 生成公曆和農曆對照數據,公曆查找農曆和農曆查找公曆函數
查看>>
为何场效应管要用UGD与UGS(off)来比较判断夹断情况?
查看>>
.pem证书转xml格式字符串(.net)
查看>>
js构建ui的统一异常处理方案(二)
查看>>
三线程连续打印ABC
查看>>
ECharts
查看>>
初识网络爬虫
查看>>
git push 时不用每次都输入密码的方法
查看>>
54点提高PHP编程效率 引入缓存机制提升性能
查看>>
编解码-marshalling
查看>>
CDN原理
查看>>
java.lang.outofmemoryerror android
查看>>