spring中bean生命周期

一  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、示例

@Component
public 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

时间: 2024-10-07 06:58:09

spring中bean生命周期的相关文章

spring 中bean生命周期

从头开始学习spring(一) 传统编程中,依赖关系比较多的情况下,导致维护成本直线上升,spring 采用Ioc对bean进行管理,减少了开发人员的工作量 正确理解spring bean 的生命周期非常重要 package com.study.spring.beans; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org

Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析

在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近吧整个流程化成了一个流程图.待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程.注意因为代码比较多,这里的流程图只画出了大概的流程,具体的可以深入代码 一.获取Bea 第一阶段获取Bean 这里的流程图的入口在 AbstractBeanFactory类的 doGetBean方法,这里可以配合前面的 getBean方法分析文章进行阅读.主要流程就是 1.先处理Bean 的名称,因为如果以“&”开头的Bean名称

Spring中Bean的生命周期

Spring中Bean的生命周期过程: 1.Spring对Bean进行实例化(相当于程序中的new Xx()) 2.Spring将值和Bean的引用注入进Bean对应的属性中 3如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法 (实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有在Bean的ID的) 4.如果Bean实现了BeanFactoryAware接口,Spring将调用se

Spring中Bean的生命周期解读

Spring容器中的Bean拥有明确的生命周期,由多个特定的生命阶段组成,每个生命阶段都允许外界对Bean施加控制.在Spring中,我们从Bean的作用范围和实例化Bean时所经历的一系列阶段来描述Bean的生命周期: BeanFactory中的Bean的生命周期 简单可分为三类 1.Bean自身的方法 (调用Bean的构造函数实例化Bean,调用setter方法设置Bean的属性值,以及通过配置文件当中的Bean的Init-method和Destory-method方法) 2.Bean生命周

JAVA面试题:Spring中bean的生命周期

Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全(Thread-safe)的议题,防止多个线程同时存取共享资源所引发的数据不同步问题. 然而在spring中 可以设定每次从BeanFactory或Appl

Spring中bean对象的生命周期

Spring提供了一些接口来提供一些方法,体现了bean对象在Spring容器中的生命周期 具体的过程可以体现为: 读取权限类名->构建一个类对象->用这个类对象通过无参构造器newInstance()构建对象 ↓ 调用set方法注入依赖 ↓ 如果这个Bean已经实现了BeanNameAware接口 调用它实现的setBeanName(String name)方法 此处传递的就是Spring配置文件中Bean的name值 ↓ 如果这个Bean已经实现了BeanFactoryAware接口 容器

Spring:Spring中bean的生命周期

Spring中,从BeanFactory或ApplicationContext取得的实例为Singleton(单例模式),就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全(Thread-safe)的议题,防止多个线程同时存取共享资源所引发的数据不同步问题. 然而在spring中 可以设定每次从BeanFactory或ApplicationContext指定别名并

深究Spring中Bean的生命周期

一.Bean 的完整生命周期 在传统的Java应用中,bean的生命周期很简单,使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了.一旦bean不再被使用,则由Java自动进行垃圾回收. 相比之下,Spring管理Bean的生命周期就复杂多了,正确理解Bean 的生命周期非常重要,因为Spring对Bean的管理可扩展性非常强,下面展示了一个Bean的构造过程 Bean 的生命周期 如上图所示,Bean 的生命周期还是比较复杂的,下面来对上图每一个步骤做文字描述:

Spring点滴四:Spring Bean生命周期

Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. --------------------------------------------------------------------------------------------------------------------------------------------------- spring-service.xml: <?xml version=