Spring注解开发生命周期原理解析

 更新时间:2020年09月14日 09:17:38   作者:Jimmyhe  
这篇文章主要介绍了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;
      }
    }

步骤:

populateBean给Bean赋值

initializeBean{ applyBeanPostProcessorsBeforeInitialization,

​ invokeInitMethods, // 自定义初始化

​ applyBeanPostProcessorsAfterInitialization}

底层使用

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring Boot 直接用jar运行项目的方法

    Spring Boot 直接用jar运行项目的方法

    这篇文章主要介绍了Spring Boot 直接用jar运行项目的方法,非常不错,具有参考借鉴价值,需要的朋友参考下
    2018-02-02
  • java在网页上面抓取邮件地址的方法

    java在网页上面抓取邮件地址的方法

    这篇文章主要介绍了java在网页上面抓取邮件地址的方法,是比较典型的Java正则匹配应用实例,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • SpringBoot注解梳理(小结)

    SpringBoot注解梳理(小结)

    这篇文章主要介绍了SpringBoot注解梳理(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • java切分字符串的2种方法实例

    java切分字符串的2种方法实例

    在我们日常工作中经常遇到截取字符串的需求,下面这篇文章主要给大家介绍了关于java切分字符串的2种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Java系统的高并发解决方法详解

    Java系统的高并发解决方法详解

    这篇文章主要介绍了Java系统的高并发解决方法,内容十分丰富,在这里分享给大家,需要的朋友可以参考。
    2017-09-09
  • Java中实现获取路径的方法汇总

    Java中实现获取路径的方法汇总

    本文给大家汇总分享的是Java中实现获取路径的方法,非常的简单实用,需要的小伙伴可以参考下。
    2015-03-03
  • logback的AsyncAppender高效日志处理方式源码解析

    logback的AsyncAppender高效日志处理方式源码解析

    这篇文章主要为大家介绍了logback的AsyncAppender高效日志处理方式源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 使用Spring Retry实现业务异常重试

    使用Spring Retry实现业务异常重试

    在系统中经常遇到业务重试的逻辑,比如三方接口调用,timeout重试三遍,异常处理重试的兜底逻辑等,本文给大家介绍一下如何使用Spring Retry优雅的实现业务异常重试,需要的朋友可以参考下
    2024-01-01
  • Java中为什么start方法不能重复调用而run方法可以?

    Java中为什么start方法不能重复调用而run方法可以?

    这篇文章主要介绍了Java中为什么start方法不能重复调用而run方法可以?带着疑问一起学习下面文章的详细内容吧
    2022-05-05
  • feign调用第三方接口,编码定义GBK,响应中文乱码处理方式

    feign调用第三方接口,编码定义GBK,响应中文乱码处理方式

    这篇文章主要介绍了feign调用第三方接口,编码定义GBK,响应中文乱码处理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论