栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

@PostConstruct使用讲解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

@PostConstruct使用讲解

1、定义

从JavaEE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。

2、执行顺序及其使用场景

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

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

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

静态方法 >> Constructor >> @Autowired >> @PostConstruct

3、代码演示

我们知道:如果对象p注入到对象a,在服务启动时,会先执行p的构造方法,在执行a的构造方法。
那么如果对象p注入到对象a,且在对象p和对象a中都有@PostConstruct注解,那么在服务启动时,他的初始化顺序是什么呢,我们做个小测试,相关代码如下:

@Service
public class RoleService {

    static {
        System.out.println("RoleService static");
    }

    public RoleService(){
        System.out.println("RoleService Constructor");
    }

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

}
@Service
public class UserService {
    @Resource
    private RoleService roleService;

    static {
        System.out.println("UserService static");
    }

    public UserService(){
        System.out.println("userService Constructor");
    }

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

我们可以看到,RoleService注入到了UserService中,我们启动程序,输出结果如下:

RoleService static
RoleService Constructor
RoleService PostConstruct
UserService static
userService Constructor
UserService PostConstruct

结论:

如果对象p注入到对象a,且在对象p和对象a中都有@PostConstruct注解,那么在服务启动时,他的初始化顺序是:
p static -> p Constructor -> p PostConstruct -> a static -> a Constructor -> a PostConstruct

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/884860.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号