該注解可以實現在運行工程時,自動運行該注解下的方法;
@PostConstruct是java5的時候引入的注解,指的是在項目啟動的時候執行這個方法,也可以理解為在spring容器啟動的時候執行,可作為一些數據的常規化加載,比如數據字典之類的。
被@PostConstruct修飾的方法會在服務器加載Servle的時候運行,並且只會被服務器執行一次。PostConstruct在構造函數之后執行
也就是加載順序
服務器加載Servlet -> servlet 構造函數的加載 -> postConstruct ->init(init是在service 中的初始化方法. 創建service 時發生的事件.) ->Service->destory->predestory->服務器卸載serlvet
那么問題:spring中Constructor、@Autowired、@PostConstruct的順序
Constructor >> @Autowired >> @PostConstruct
依賴注入的字面意思就可以知道,要將對象p注入到對象a,那么首先就必須得生成對象p與對象a,才能執行注入。所以,如果一個類A中有個成員變量p被@Autowired注解,那么@Autowired注入是發生在A的構造方法執行完之后的。
@PostConstruct應用場景:
如果想在生成對象時候完成某些初始化操作,而偏偏這些初始化操作又依賴於依賴注入,那么就無法在構造函數中實現。為此,可以使用@PostConstruct注解一個方法來完成初始化,@PostConstruct注解的方法將會在依賴注入完成后被自動調用。
現在的工程是啟動消息隊列時用到了這個注解
@PostConstruct public void start() { try { int connect = producer.connect(); if (connect == 0) { log.info("producer start success! groupName:{},namesrvAddr:{}", rocketMqProperties.getProducer().getGroupName(), rocketMqProperties.getNamesrvAddr()); } } catch (MQException e) { e.printStackTrace(); } } @PreDestroy public void stop() { try { if (producer != null) { producer.close(); log.info("producer closed"); } }catch (MQException a) { a.printStackTrace(); } }