@PostConstruct,@PreDestroy注解作用

本文介绍了Java EE中的@PostConstruct和@PreDestroy注解,它们分别用于Servlet生命周期的初始化和销毁阶段。@PostConstruct注解的方法在构造函数后,init()方法前执行;@PreDestroy注解的方法在destroy()方法后,Servlet卸载前执行。文章通过实例解释了这两个注解的工作原理,并探讨了它们在Spring框架中的应用顺序:Constructor > @Autowired > @PostConstruct。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

前言

从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法,并且被修饰的方法不能抛出异常

案例

@PostConstruct写法有如下两种方式:

@PostConstruct
public void method(){}
 
public @PostConstruct void method(){}

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

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

服务器加载Servlet过程:

在这里插入图片描述
另外,spring中Constructor、@Autowired、@PostConstruct的顺序:

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

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

Constructor >> @Autowired >> @PostConstruct

举个栗子:

@Component
public class A {
 
    @Autowired
    private B b;
 
    public A() {
        System.out.println("执行A的构造方法,此时b还未被注入: b = " + b);
    }
 
    @PostConstruct
    private void init() {
        System.out.println("@PostConstruct将在依赖注入完成后被自动调用: b = " + b);
    }
}
 
@Component
public class B {
    public B(){
        System.out.println("执行B的构造方法");
    }
}

测试

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:application-context.xml"})
public class MessageTest {
 
    @Resource

    A a;
 
    @Test
    public void testAB(){
    }
}

执行testAB()方法结果:

执行A的构造方方法
@PostConstruct将在依赖注入完成后被自动调用: b => com.nss.B@51841ac6

通过以上结果可以看出:被@PostConstruct注解的方法将在该类中所有注入操作完成之后执行。

写在最好

我们在工作中会用到各种注解方法,这两种只是沧海一角,以后工作中多多留意其他注解,了解其原理。。

码字不易,谢谢关注哦

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值