• Spring-postConstruct参考-转载


    Spring@PostConstruct注解和构造方法的调用顺序

    先看下@PostConstruct的注解

    复制代码
     * The PostConstruct annotation is used on a method that needs to be executed
     * after dependency injection is done to perform any initialization. This
     * method MUST be invoked before the class is put into service. This
     * annotation MUST be supported on all classes that support dependency
     * injection. The method annotated with PostConstruct MUST be invoked even
     * if the class does not request any resources to be injected. Only one
     * method can be annotated with this annotation. The method on which the
     * PostConstruct annotation is applied MUST fulfill all of the following
     * criteria -
    复制代码

    自己翻译一下,意思是:

    PostConstruct注解用于方法上,该方法在初始化的依赖注入操作之后被执行。这个方法必须在class被放到service之后被执行,这个注解所在的类必须支持依赖注入。

    父类class,被@component注解修饰,说明会被spring扫描并创建。在默认构造方法里加上输出打印,init方法被@PostConstruct修饰

    复制代码
     1 @Component
     2 public class ParentBean implements InitializingBean{
     3     
     4     public ParentBean() {
     5         System.out.println("ParentBean construct");
     6     }
     7     
     8     @PostConstruct
     9     public void init(){
    10         System.out.println("ParentBean init");
    11     }
    12 
    13     public void afterPropertiesSet() throws Exception {
    14         System.out.println("ParentBean afterPropertiesSet");
    15     }
    16 
    17 }
    复制代码

    子类class,也被 @component注解修饰,其余配置和父类class一样

    复制代码
     1 @Component
     2 public class SonBean extends ParentBean{
     3     public SonBean() {
     4         System.out.println("SonBean construct");
     5     }
     6     
     7     @PostConstruct
     8     public void init(){
     9         System.out.println("SonBean init");
    10     }
    11     @Override
    12     public void afterPropertiesSet() throws Exception {
    13         System.out.println("SonBean afterPropertiesSet");
    14     }
    15     
    16 }
    复制代码

    然后我们使用maven命令 jetty:run,控制台输出如下:

    复制代码
    [INFO] Initializing Spring root WebApplicationContext
    ParentBean construct
    ParentBean init
    ParentBean afterPropertiesSet
    ParentBean construct
    SonBean construct
    SonBean init
    SonBean afterPropertiesSet
    [INFO] Set web app root system property: 'webapp.root' = [J:androidworkspacecomsrcmainwebapp]
    [INFO] Initializing log4j from [classpath:log4j.properties]
    [INFO] Started SelectChannelConnector@0.0.0.0:8088
    [INFO] Started Jetty Server
    [INFO] Starting scanner at interval of 3 seconds.
    复制代码

    可以看出优先执行依然是构造方法,这个是java的语言决定的,毕竟spring只是建立在java之上的框架。然后才是被PostConstruct修饰的方法,要注意的是这个方法在对象的初始化和依赖都完成之后才会执行,所以不必担心执行这个方法的时候有个别成员属性没有被初始化为null的情况发生。在init方法之后执行的才是afterPropertiesSet方法,这个方法必须实现InitializingBean接口,这个接口很多spring的bean都实现了他,从他的方法名就能看出在属性都被设置了之后执行,也属于springbean初始化方法。

    其实spring提供了很多接口以供开发者在bean初始化后调用,可以在官网上查阅相关文档。

    参考:https://my.oschina.net/wwwd/blog/810530

  • 相关阅读:
    Stm32ADC-内部温度传感器的使用
    Stm32 ADC学习
    wpf数据绑定
    06 MyBatis——实体类注意事项
    05 MyBatis——环境搭建及demo
    96 项目导jar包
    04 SSM框架概述
    03 MVC开发模式
    02 Mybaits——包名的命名规范
    26 监听器实现网站在线人数统计
  • 原文地址:https://www.cnblogs.com/longxok/p/11088458.html
Copyright © 2020-2023  润新知