Spring注解开发之生命周期相关

生命周期

initMethod和destroyMethod

Bean定义

public class Car {
    public Car() {
        System.out.println("car constructor");
    }

    public void init(){
        System.out.println("car init");
    }

    public void destroy(){
        System.out.println("car destroy");
    }
}

配置类

  • bean创建--初始化--销毁

  • 可以自定义初始化和销毁方法

  • 初始化:对象创建完成,并赋值完成,调用初始化方法

  • 销毁: 容器关闭进行销毁(单实例)

    多实例容器不会管理这个bean

@Configuration
public class MyCOnfigOfLifeCycle {

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

获取容器

    @Test
    public void test01(){
        printBeans(applicationContext);

        // 关闭容器
        applicationContext.close();
    }

    private void printBeans(AnnotationConfigApplicationContext applicationContext){
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
    }

InitializingBean和DisposableBean

Bean定义

public class Cat implements InitializingBean, DisposableBean {
    @Override
    public void destroy() throws Exception {
        System.out.println("cat destroy");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("cat initialize");
    }
}

实现了InitializingBean和Disposable后,也可以实现初始化和销毁的方法

PostConstruct和PreDestroy

Bean定义

public class Dog {
    public Dog(){
        System.out.println("dog constructor");
    }

    @PostConstruct
    public void init(){
        System.out.println("dog init");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("dog destroy");
    }
}

BeanPostProcessor

bean

定义

public class MyBeanPostProcessor implements BeanPostProcessor {


    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("before init" + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("after init" + beanName);
        return bean;
    }
}

加入到bean中,可以发现每个bean初始化前后都会执行功能

  • postProcessBeforeInitialization将在一个bean被完全初始化前进行回调,此时对应的bean已经实例化了,但是对应的属性注入等还没有进行,即在调用InitializingBean的afterPropertiesSet()方法或bean对应的init-method之前
  • postProcessAfterInitialization将在bean被完全初始化后进行回调,此时对应的依赖注入已经完成,即在调用InitializingBean的afterPropertiesSet()方法或对应init-method方法之后。

postProcessBeforeInitialization方法的返回值会被Spring容器作为处理后的Bean注册到容器中。如果你在postProcessBeforeInitialization方法中重新构造了一个Bean进行返回,而不是返回参数中的bean;那么你返回的Bean将会被注册到Spring容器中。而原来在Spring中配置的Bean(被Spring实例化的Bean)将会被覆盖。

一旦这两个方法返回null,就不会执行后面的postProcessBefore/AfterInitialization,(在applyBeanPostProcessorsBeforeInitialization中)

        for(Iterator var4 = this.getBeanPostProcessors().iterator(); var4.hasNext(); result = current) {
            BeanPostProcessor processor = (BeanPostProcessor)var4.next();
            current = processor.postProcessBeforeInitialization(result, beanName);
            if (current == null) {
                return result;
            }
        }

步骤:

  1. populateBean给Bean赋值

  2. initializeBean{ applyBeanPostProcessorsBeforeInitialization,

    ​ invokeInitMethods, // 自定义初始化

    ​ applyBeanPostProcessorsAfterInitialization}

底层使用

bean赋值,bean注入,@autowire,生命周期注解功能,@Async

posted @ 2020-09-13 16:07  Jimmyhe  阅读(170)  评论(0编辑  收藏  举报