@PostConstruct使用总结

https://blog.csdn.net/qq_37636695/article/details/84791468

https://www.jianshu.com/p/aba99a49a459

 

@PostConstruct
从Java
EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct。这两个注解被用来修饰一个非静态的void()方法.而且这个方法不能有抛出异常声明。
@PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。
PreConstruct还未用到,PostConstruct最近做项目用到了2次,在这里做一个总结
@PostConstruct在项目中的用处
1.spring项目加载数据字典
@PostConstruct注解的方法在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可作为一些数据的常规化加载,比如数据字典之类的。

2.spring项目的定时任务
spring自带的@schedule,没有开关,项目启动总会启动一个线程;
做项目的时候就使用Java的timer,这个设置开关即可自由的控制,关闭的时候,不会启动线程;
Java的timer也需要找到一个启动类,可以放到main函数里面启动,这样的话,代码的耦合性太高了,而使用PostConstruct是很干净的。

spring中Constructor、@Autowired、@PostConstruct的顺序
其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p与对象a,才能执行注入。所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入是发生在A的构造方法执行完之后的。

如果想在生成对象时候完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。

Constructor >> @Autowired >> @PostConstruct 

________________________________________________________________________________________________________________________________________________

InitializingBean和DisposableBean >> afterPropertiesSet 和 destory

__________________________________________________________________________________________________________

spring中Constructor、@Autowired、@PostConstruct的顺序 

1、其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p与对象a,才能执行注入。所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入是发生在A的构造方法执行完之后的。

如果想在生成对象时候完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。

Constructor >> @Autowired >> @PostConstruct

举个例子:

public Class AAA {
    @Autowired
    private BBB b;
    
    public AAA() {
        System.out.println("此时b还未被注入: b = " + b);
    }
 
    @PostConstruct
    private void init() {
        System.out.println("@PostConstruct将在依赖注入完成后被自动调用: b = " + b);
    }
}

 

2、还有一个加载的方法就是实现InitializingBean接口其中重写afterPropertiesSet()方法,这个方法在@postConstruct方法之后运行,还有另外一个方法就是init-mathod方法该方法在afterPropertiesSet()方法之后运行,总结之后的顺序为:

constructor(构造方法)——>@Autowired——>@postConstruct——>afterPropertiesSet()——》init-mathod

3、spring 中构造Constructor、@Autowired、@PostConstruct、静态方法的执行顺序 :

    构造方法  ——> @Autowired —— > @PostConstruct ——> 静态方法 

补充说明

1.@PostConstruct说明

     被@PostConstruct修饰的方法会在服务器加载Servlet(bean)的时候运行,并且只会被服务器调用一次,类似于Servlet的init()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。

2.@PreDestroy说明

     被@PreDestroy修饰的方法会在服务器卸载Servlet(bean)的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前

 

感谢:https://blog.csdn.net/jiangyu1013/article/details/89924480?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.nonecase

https://blog.csdn.net/zpflwy1314/article/details/80797756?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.nonecase

https://blog.csdn.net/u014515854/article/details/78832790

https://www.cnblogs.com/fnlingnzb-learner/p/10758848.html

 

posted @ 2019-08-06 16:01  kelelipeng  阅读(12572)  评论(5编辑  收藏  举报