Spring Bean的生命周期

2020-09-07  本文已影响0人  远去的桅杆_

Spring Bean 的生命周期大致分为:Bean定义,Bean初始化,Bean的生存期,Bean的销毁四个部分。

  1. 资源定位:
    Spring 通过我们的配置 如@ComponentScan 定义扫描路径去找带有@Component的类,
    这个过程就是一个资源定位的过程。

  2. Bean定义:
    一旦找到了资源,他就开始解析,并将信息保存起来。注意此时还没有初始化Bean,也就没有Bean实例,它 有的仅仅是Bean的定义。然后将Bean定义发送到IOC容器中。
    此时依然只有定义。

  3. 初始化:
    经过上述步骤,spring 会继续完成Bean 实例化和依赖注入。
    如果不想让spring继续初始化,可在@ComponentScan中设置lazyInit =true(默认为false)

  4. 初始化实例
    spring 在完成依赖注入后,提供了一系列接口和配置完成Bean初始化过程

Bean的生命周期

演示代码如下:

@Component
public class Person implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {

    private String name=null;

    public void changeName(String name) {
        this.name = name;
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("【" + this.getClass().getSimpleName() + "】 BeanFactoryAware 的setBeanFactory方法");
    }

    @Override
    public void setBeanName(String s) {
        System.out.println("【" + this.getClass().getSimpleName() + "】 调用 beanFactoryAware 的 setBeanName ");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("【" + this.getClass().getSimpleName() + "】 DisposableBean的destroy 方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("【" + this.getClass().getSimpleName() + "】 调用 initializingBean的 afterPropertiesSet 方法");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("【" + this.getClass().getSimpleName() + "】 调用ApplicationContextAware 的setApplicationContext");
    }

    @PostConstruct
    public void init() {
        System.out.println("【" + this.getClass().getSimpleName() + "】 注解PostConstruct定义的自定义初始化方法");

    }

    @PreDestroy
    public void destory1() {
        System.out.println("【" + this.getClass().getSimpleName() + "】注解@PreDestroy定义的自定义销毁方法");
    }

}
@Component
public class BeanPostProcessorExample  implements BeanPostProcessor {


    @Override
    public Object postProcessBeforeInitialization(Object bean, String s) throws BeansException {

        log.info("BeanPostProcessor 调用 " + " postProcessBeforeinitialization 方法,参数 【" + bean.getClass ().getSimpleName()+"|"+ s);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String s) throws BeansException {
        log.info("BeanPostProcessor 调用 " + " postProcessAfterinitialization 方法,参数 【" + bean.getClass ().getSimpleName()+"|"+ s);
        return bean;
    }
}
@SpringBootApplication
public class LearnApplication {

    /*public static void main(String[] args) {
        SpringApplication.run(LearnApplication.class, args);
    }*/

    public static void main (String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        Person person = ctx.getBean(Person.class);
        person.changeName("Jack");
        ctx.close();
    }
}
@Configuration
@ComponentScan(value = "com.caril.*",lazyInit = true)
public class AppConfig {
}

下面Spring的Bean初始化的调用的流程

image.png image.png image.png image.png 20200907004258.png image.png image.png
上一篇下一篇

猜你喜欢

热点阅读