@PostConstruct注解作用

@PostConstruct注解作用从 JavaEE5 规范开始 Servlet 中增加了两个影响 Servlet 生命周期的注解 PostConstruc 和 PreDestroy 这两个注解被用来修饰一个非静态的 void 方法 并且被修饰的方法不能抛出异常 写法有如下两种方式 PostConstruc public PostConstruc

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

写法有如下两种方式:

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

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

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

服务器加载Servlet过程:

                                                @PostConstruct注解作用                            @PostConstruct注解作用

另外,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的构造方法,此时b还未被注入: b = null 执行B的构造方法 @PostConstruct将在依赖注入完成后被自动调用: b = com.nss.B@51841ac6

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178505.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午5:08
下一篇 2026年3月26日 下午5:08


相关推荐

  • navicat激活码 最新[在线序列号]

    navicat激活码 最新[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    73
  • Java 线程间通信

    Java 线程间通信Java 线程间通信

    2026年3月17日
    2
  • C++ char 转 int[通俗易懂]

    C++ char 转 int[通俗易懂]charcc[20]=”-100″;intdd;dd=atoi(cc);

    2022年10月2日
    7
  • Nova Conductor服务

    Nova Conductor服务NovaConducto 服务的大部分方法都是数据库的查询操作 nova conductor manager pyConductorM 类 主要作用是避免 NovaCompute 服务直接访问数据库 增加系统的安全性 一 引入 novaconducto 服务 1 novacompute 服务的数据库查询更新操作都需要通过向 novaconducto 服务发送 RPC

    2026年3月16日
    1
  • performSelector的方法[通俗易懂]

    performSelector的方法[通俗易懂]在此我对performSelector系列方法进行了总结1、-(id)performSelector:(SEL)aSelector;-(id)performSelector:(SEL)aSe

    2022年7月1日
    27
  • make wildcard_其在古文中的用法

    make wildcard_其在古文中的用法
    在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcardPATTERN…)。在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。需要注意的是:这种情况下规则中通配符的展开和上一小节匹配通配符的区别。
    一般我们可以使用“$(wildcard*.c)”来获取工作

    2025年8月25日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号