精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

七種方式,教你在SpringBoot初始化時搞點事情!

開發 后端
我們經常需要在容器啟動的時候做一些鉤子動作,比如注冊消息消費者,監聽配置等,今天就總結下SpringBoot留給開發者的7個啟動擴展點。

[[390889]]

 我們經常需要在容器啟動的時候做一些鉤子動作,比如注冊消息消費者,監聽配置等,今天就總結下SpringBoot留給開發者的7個啟動擴展點。

容器刷新完成擴展點

1、監聽容器刷新完成擴展點ApplicationListener<ContextRefreshedEvent>

基本用法

熟悉Spring的同學一定知道,容器刷新成功意味著所有的Bean初始化已經完成,當容器刷新之后Spring將會調用容器內所有實現了ApplicationListener<ContextRefreshedEvent>的Bean的onApplicationEvent方法,應用程序可以以此達到監聽容器初始化完成事件的目的。 

  1. @Component  
  2. public class StartupApplicationListenerExample implements   
  3.   ApplicationListener<ContextRefreshedEvent> {  
  4.     private static final Logger LOG   
  5.       = Logger.getLogger(StartupApplicationListenerExample.class);  
  6.     public static int counter;  
  7.     @Override public void onApplicationEvent(ContextRefreshedEvent event) {  
  8.         LOG.info("Increment counter");  
  9.         counter++;  
  10.     }  

易錯的點

這個擴展點用在web容器中的時候需要額外注意,在web 項目中(例如spring mvc),系統會存在兩個容器,一個是root application context,另一個就是我們自己的context(作為root application context的子容器)。如果按照上面這種寫法,就會造成onApplicationEvent方法被執行兩次。解決此問題的方法如下: 

  1. @Component  
  2. public class StartupApplicationListenerExample implements   
  3.   ApplicationListener<ContextRefreshedEvent> {  
  4.     private static final Logger LOG   
  5.       = Logger.getLogger(StartupApplicationListenerExample.class);  
  6.     public static int counter;  
  7.     @Override public void onApplicationEvent(ContextRefreshedEvent event) {  
  8.         if (event.getApplicationContext().getParent() == null) {  
  9.             // root application context 沒有parent  
  10.             LOG.info("Increment counter");  
  11.             counter++;  
  12.         }  
  13.     }  

高階玩法

當然這個擴展還可以有更高階的玩法:自定義事件,可以借助Spring以最小成本實現一個觀察者模式:

  •  先自定義一個事件: 
  1. public class NotifyEvent extends ApplicationEvent {  
  2.     private String email;  
  3.     private String content;  
  4.     public NotifyEvent(Object source) {  
  5.         super(source);  
  6.     }  
  7.     public NotifyEvent(Object source, String email, String content) { 
  8.          super(source);  
  9.         this.email = email;  
  10.         this.content = content;  
  11.     }  
  12.     // 省略getter/setter方法  
  •  注冊一個事件監聽器 
  1. @Component  
  2. public class NotifyListener implements ApplicationListener<NotifyEvent> {  
  3.     @Override  
  4.     public void onApplicationEvent(NotifyEvent event) {  
  5.         System.out.println("郵件地址:" + event.getEmail());  
  6.         System.out.println("郵件內容:" + event.getContent());  
  7.     }  
  •  發布事件 
  1. @RunWith(SpringRunner.class)  
  2. @SpringBootTest  
  3. public class ListenerTest {  
  4.     @Autowired  
  5.     private WebApplicationContext webApplicationContext;  
  6.     @Test  
  7.     public void testListener() {  
  8.         NotifyEvent event = new NotifyEvent("object", "abc@qq.com", "This is the content");  
  9.         webApplicationContext.publishEvent(event);  
  10.     }  
  •  執行單元測試可以看到郵件的地址和內容都被打印出來了

2、SpringBoot的CommandLineRunner接口

當容器上下文初始化完成之后,SpringBoot也會調用所有實現了CommandLineRunner接口的run方法,下面這段代碼可起到和上文同樣的作用: 

  1. @Component  
  2. public class CommandLineAppStartupRunner implements CommandLineRunner {  
  3.     private static final Logger LOG =  
  4.       LoggerFactory.getLogger(CommandLineAppStartupRunner.class);  
  5.     public static int counter;  
  6.     @Override  
  7.     public void run(String...args) throws Exception { 
  8.         LOG.info("Increment counter");  
  9.         counter++;  
  10.     }  

對于這個擴展點的使用有額外兩點需要注意:

  • 多個實現了CommandLineRunner的Bean的執行順序可以根據Bean上的@Order注解調整
  • 其run方法可以接受從控制臺輸入的參數,跟ApplicationListener<ContextRefreshedEvent>這種擴展相比,更加靈活 
  1. // 從控制臺輸入參數示例  
  2. java -jar CommandLineAppStartupRunner.jar abc abcd 

3、SpringBoot的ApplicationRunner接口

這個擴展和SpringBoot的CommandLineRunner接口的擴展類似,只不過接受的參數是一個ApplicationArguments類,對控制臺輸入的參數提供了更好的封裝,以--開頭的被視為帶選項的參數,否則是普通的參數 

  1. @Component  
  2. public class AppStartupRunner implements ApplicationRunner {  
  3.     private static final Logger LOG =  
  4.       LoggerFactory.getLogger(AppStartupRunner.class);  
  5.     public static int counter;  
  6.     @Override  
  7.     public void run(ApplicationArguments args) throws Exception {  
  8.         LOG.info("Application started with option names : {}",   
  9.           args.getOptionNames());  
  10.         LOG.info("Increment counter");  
  11.         counter++;  
  12.     }  

比如:

  1. java -jar CommandLineAppStartupRunner.jar abc abcd --autho=mark verbose 

Bean初始化完成擴展點

前面的內容總結了針對容器初始化的擴展點,在有些場景,比如監聽消息的時候,我們希望Bean初始化完成之后立刻注冊監聽器,而不是等到整個容器刷新完成,Spring針對這種場景同樣留足了擴展點:

1、@PostConstruct注解 

  1. @PostConstruct注解一般放在Bean的方法上,被@PostConstruct修飾的方法會在Bean初始化后馬上調用:  
  2. @Component  
  3. public class PostConstructExampleBean {  
  4.     private static final Logger LOG   
  5.       = Logger.getLogger(PostConstructExampleBean.class);  
  6.     @Autowired  
  7.     private Environment environment;  
  8.     @PostConstruct  
  9.     public void init() {  
  10.         LOG.info(Arrays.asList(environment.getDefaultProfiles()));  
  11.     }  

2、 InitializingBean接口

InitializingBean的用法基本上與@PostConstruct一致,只不過相應的Bean需要實現afterPropertiesSet方法 

  1. @Component  
  2. public class InitializingBeanExampleBean implements InitializingBean {  
  3.     private static final Logger LOG   
  4.       = Logger.getLogger(InitializingBeanExampleBean.class);  
  5.     @Autowired  
  6.     private Environment environment;  
  7.     @Override 
  8.     public void afterPropertiesSet() throws Exception {  
  9.         LOG.info(Arrays.asList(environment.getDefaultProfiles()));  
  10.     }  

3、@Bean注解的初始化方法

通過@Bean注入Bean的時候可以指定初始化方法:

Bean的定義 

  1. public class InitMethodExampleBean {  
  2.     private static final Logger LOG = Logger.getLogger(InitMethodExampleBean.class);  
  3.     @Autowired  
  4.     private Environment environment;  
  5.     public void init() {  
  6.         LOG.info(Arrays.asList(environment.getDefaultProfiles()));  
  7.     }  

Bean注入 

  1. @Bean(initMethod="init" 
  2. public InitMethodExampleBean initMethodExampleBean() {  
  3.     return new InitMethodExampleBean();  

4、通過構造函數注入

Spring也支持通過構造函數注入,我們可以把搞事情的代碼寫在構造函數中,同樣能達到目的 

  1. @Component   
  2. public class LogicInConstructorExampleBean {  
  3.     private static final Logger LOG   
  4.       = Logger.getLogger(LogicInConstructorExampleBean.class);  
  5.     private final Environment environment;  
  6.     @Autowired  
  7.     public LogicInConstructorExampleBean(Environment environment) {  
  8.         this.environment = environment;  
  9.         LOG.info(Arrays.asList(environment.getDefaultProfiles()));  
  10.     }  

Bean初始化完成擴展點執行順序?

可以用一個簡單的測試: 

  1. @Component  
  2. @Scope(value = "prototype" 
  3. public class AllStrategiesExampleBean implements InitializingBean {  
  4.     private static final Logger LOG   
  5.       = Logger.getLogger(AllStrategiesExampleBean.class);  
  6.     public AllStrategiesExampleBean() {  
  7.         LOG.info("Constructor");  
  8.     }  
  9.     @Override  
  10.     public void afterPropertiesSet() throws Exception {  
  11.         LOG.info("InitializingBean");  
  12.     }  
  13.     @PostConstruct  
  14.     public void postConstruct() { 
  15.         LOG.info("PostConstruct");  
  16.     }  
  17.     public void init() {  
  18.         LOG.info("init-method");  
  19.     }  

實例化這個Bean后輸出: 

  1. [main] INFO o.b.startup.AllStrategiesExampleBean - Constructor  
  2. [main] INFO o.b.startup.AllStrategiesExampleBean - PostConstruct  
  3. [main] INFO o.b.startup.AllStrategiesExampleBean - InitializingBean  
  4. [main] INFO o.b.startup.AllStrategiesExampleBean - init-method  

 

責任編輯:龐桂玉 來源: Java知音
相關推薦

2025-01-21 08:00:00

限流微服務算法

2017-06-14 16:44:15

JavaScript原型模式對象

2018-06-10 16:31:12

2022-07-01 08:00:44

異步編程FutureTask

2010-09-17 17:51:04

2022-03-18 14:33:22

限流算法微服務

2022-12-23 10:55:09

CIO方式團隊

2025-02-24 16:00:00

SpringBoot定時任務開發

2010-10-15 10:02:01

Mysql表類型

2025-05-13 08:20:58

2023-07-06 10:36:51

人工智能

2023-09-11 14:26:44

智能技術人工智能

2023-01-03 13:43:55

團隊首席信息官

2023-09-07 10:39:25

AI供應鏈

2020-01-16 12:20:03

人工智能AI稅收

2021-07-23 17:15:12

物聯網IOT

2025-04-28 08:39:48

Spring初始化開發

2023-12-22 14:27:30

2011-03-14 10:46:03

2010-06-08 09:49:45

UML元件
點贊
收藏

51CTO技術棧公眾號

99久久久免费精品国产一区二区 | 日韩三级在线播放| 五月婷婷六月婷婷| 91久久高清国语自产拍| 精品久久五月天| 欧在线一二三四区| 中文字幕资源网在线观看| 97se亚洲国产综合自在线| 国产精品一区二区久久国产| 激情综合五月网| 少妇精品久久久一区二区| 日韩欧美中文一区| 日本成人中文字幕在线| 人人超在线公开视频| 久久久99精品久久| 成人在线视频电影| 在线观看中文字幕码| 国产免费成人| 久久99热精品这里久久精品| 欧美激情 一区| 麻豆成人入口| 日韩欧美国产综合一区 | 91日韩中文字幕| 伊人久久大香线蕉| 欧美精品一区二区三区蜜臀| 污片在线免费看| a一区二区三区| 亚洲二区在线视频| 欧美与动交zoz0z| h网站在线免费观看| av一区二区久久| aaa级精品久久久国产片| 真实的国产乱xxxx在线91| 亚洲免费观看| 国内揄拍国内精品| 久久久久久久9999| 亚洲深深色噜噜狠狠爱网站| 中文字幕视频一区二区在线有码| 欧美 日本 国产| 国产成人一二片| 日韩精品资源二区在线| 手机免费看av网站| 欧美a视频在线| 欧美午夜不卡视频| 亚洲狼人综合干| 午夜日韩成人影院| 色综合久久久久久久久久久| 久久国产精品网| 91探花在线观看| 亚洲国产精品人人做人人爽| 国产 国语对白 露脸| 黄色网页在线观看| 亚洲美女在线国产| 艳母动漫在线观看| av网址在线看| 亚洲尤物在线视频观看| 白白操在线视频| 欧美性受ⅹ╳╳╳黑人a性爽| 亚洲人成网站色在线观看| 在线视频91| 尤物视频在线看| 亚洲成人av在线电影| 欧美成人高潮一二区在线看| 2020日本在线视频中文字幕| 婷婷开心激情综合| 日本成年人网址| 草莓视频成人appios| 欧美日韩中文一区| 一级黄色高清视频| 国产一区丝袜| 亚洲日韩欧美视频| 久久日免费视频| 亚洲精品国产成人影院| 韩国国内大量揄拍精品视频| 久久99精品波多结衣一区| 久久亚洲精品伦理| 成人春色激情网| 亚洲产国偷v产偷v自拍涩爱| 99国产精品久| 午夜精品一区二区三区四区| 国产日产一区二区| 亚洲一二三专区| 国产日韩一区二区在线| 久久69成人| 精品国精品自拍自在线| 大黑人交xxx极品hd| 欧美电影一二区| 性色av一区二区三区红粉影视| 亚洲s码欧洲m码国产av| 久久99精品国产麻豆婷婷| 国产成人女人毛片视频在线| 精品999视频| 亚洲男人天堂av网| 久久久久狠狠高潮亚洲精品| 精品视频一区二区三区| 日韩精品在线观看一区二区| 成人黄色短视频| 激情久久中文字幕| 国产美女精品免费电影| 国精品人妻无码一区二区三区喝尿| 久久综合久久99| 亚洲欧美一二三| 亚洲欧美韩国| 日韩一卡二卡三卡国产欧美| 精品人妻互换一区二区三区| 亚洲人metart人体| 国产精品成人一区二区三区吃奶| hs视频在线观看| 久久精品人人爽人人爽| 国产高清不卡无码视频| 久久xxx视频| 日韩高清欧美高清| 免费在线视频观看| 蜜桃久久久久久| 九色91在线视频| 丝袜在线视频| 欧美裸体bbwbbwbbw| 久久国产精品影院| 在线精品一区二区| 91传媒视频在线观看| av在线免费观看网| 色综合久久久久网| 狠狠人妻久久久久久综合蜜桃| 亚洲国产一成人久久精品| 国产成人精品最新| 天天综合天天综合| 亚洲午夜日本在线观看| 国产精欧美一区二区三区白种人| 精品久久视频| 国产成人啪精品视频免费网| 无码精品在线观看| 亚洲午夜久久久久| 中国男女全黄大片| 综合激情一区| 亚洲一区二区三区乱码aⅴ| 成av人电影在线观看| 欧美视频13p| 日本黄色免费观看| 精品999日本| 国产精品对白刺激久久久| a级网站在线播放| 7777精品伊人久久久大香线蕉完整版| 免费观看a级片| 天堂va蜜桃一区二区三区漫画版| 久久久久久99| 在线一区av| 亚洲欧美日韩天堂一区二区| 日韩熟女精品一区二区三区| www.亚洲色图| 玩弄中年熟妇正在播放| 亚洲成在人线免费观看| 欧美最猛黑人xxxx黑人猛叫黄| 天堂在线资源库| 五月婷婷色综合| av鲁丝一区鲁丝二区鲁丝三区| 亚洲三级毛片| 久久精品国产一区二区三区不卡| 欧美久久天堂| 亚洲免费中文字幕| 中国女人一级一次看片| 国产精品每日更新| 中文字幕亚洲影院| 国精品一区二区| 国产乱码精品一区二区三区中文| 国产一二三在线| 亚洲欧美日韩国产精品| www.久久网| 亚洲人成网站在线| 精品影片一区二区入口| 久久久精品午夜少妇| 日韩免费电影一区二区三区| 日韩欧国产精品一区综合无码| 日韩视频免费中文字幕| 成人小说亚洲一区二区三区| 精品久久久久久中文字幕大豆网| 在线免费观看日韩av| 久久99精品国产麻豆不卡| 99久久久精品视频| 亚洲免费成人av在线| 国产日本欧美一区| 波多野结衣久久| 亚洲跨种族黑人xxx| 亚洲天堂2021av| 亚洲在线视频网站| theav精尽人亡av| 麻豆精品在线看| 国产一级做a爰片久久毛片男| 日韩在线你懂的| 成人黄色激情网| 中国色在线日|韩| 久热99视频在线观看| 五月天激情婷婷| 欧美日韩在线三区| 日本天堂网在线观看| 国产欧美一区二区三区鸳鸯浴 | 亚洲网在线观看| 国产欧美久久久| 日韩欧美中文字幕在线观看| 视频国产一区二区| 久久只精品国产| 1314成人网| 全部av―极品视觉盛宴亚洲| 99在线精品免费视频| 天天射—综合中文网| 久久久久天天天天| 精品国产一区二区三区性色av| 日本成熟性欧美| 狂野欧美性猛交xxxxx视频| 亚洲香蕉成人av网站在线观看| 精品欧美一区二区精品少妇| 在线亚洲一区二区| 国产精品23p| 日韩理论片网站| 性の欲びの女javhd| 99久久婷婷国产综合精品| 1314成人网| 久久99精品国产.久久久久| 无码精品国产一区二区三区免费| 狠狠爱www人成狠狠爱综合网 | 亚洲精品综合| 50度灰在线观看| 国产精品国产三级国产在线观看| 欧美日韩在线观看一区| 林ゆな中文字幕一区二区| 亚洲a区在线视频| 在线日韩三级| 国产精品久久久久久中文字| 周于希免费高清在线观看| 久久久欧美一区二区| 性欧美猛交videos| 久久久成人av| 青青青青在线| 在线一区二区日韩| 黄色的视频在线免费观看| 亚洲激情视频在线播放| 亚洲免费一级片| 欧美一区二区三区日韩| av片免费播放| 欧美一区二区三区性视频| 91好色先生tv| 欧美日韩国产一二三| 一个人看的www日本高清视频| 91电影在线观看| 亚洲国产成人精品女人久久| 欧美视频一区二区三区…| 天堂中文在线网| 狠狠色狠狠色综合日日五| 成人午夜淫片100集| 日韩欧美第一页| 久草视频一区二区| 日本大香伊一区二区三区| 天干夜夜爽爽日日日日| 在线这里只有精品| 国产精品成人久久久| 精品1区2区3区| 国产精品探花视频| 欧美r级电影在线观看| 成人小说亚洲一区二区三区| 日韩av中文字幕在线| 色在线免费视频| 一区二区亚洲精品国产| 麻豆视频免费在线观看| 久久99国产精品自在自在app| 欧美卡一卡二| 欧美一区二区三区艳史| 亚洲成人av观看| 成人在线免费观看视视频| 91在线一区| 久久精品欧美| 久久精品播放| 粉嫩av一区二区三区天美传媒| 激情亚洲成人| 亚洲成人av免费看| 国产毛片精品视频| 日本黄色录像片| 国产精品视频一二三区| 天堂网avav| 欧美日韩中文字幕| 91肉色超薄丝袜脚交一区二区| 日韩一本二本av| 肉丝一区二区| 久久精品视频99| 涩涩av在线| 91免费看片网站| 欧美一区自拍| 一区二区三区偷拍| 日韩视频在线一区二区三区 | 国产日韩在线观看视频| av一区二区三区在线观看| 中文有码一区| 久久久无码中文字幕久...| 国产一区二区三区的电影 | 欧美a视频在线观看| 777久久久精品| 免费在线黄色影片| 久久99热精品| 精品网站在线| 国产一区二区三区高清| 99精品在线| av免费在线播放网站| 国产精品888| 我想看黄色大片| 亚洲成人一区二区| 97国产成人无码精品久久久| 日韩精品在线观| 国产偷倩在线播放| 成人精品一区二区三区| 中文有码一区| 久久综合九色综合88i| 国产在线精品一区二区夜色| 偷拍夫妻性生活| 香蕉av福利精品导航| 国内毛片毛片毛片毛片| 中文精品99久久国产香蕉| 大菠萝精品导航| 成人在线一区二区| 久久99国产精品视频| 六月婷婷在线视频| 国产精品夜夜嗨| 人人澡人人澡人人看| 在线观看91视频| 日本不卡视频一区二区| 欧美激情第1页| 精品视频一区二区三区| 中文字幕人成一区| 秋霞影院一区二区| 公侵犯人妻一区二区三区| 欧美日韩性视频| 人妻一区二区三区四区| 色综合久久久888| 日韩第一区第二区| 91制片厂免费观看| 精品亚洲国内自在自线福利| 久久久久久成人网| 欧美午夜免费电影| 粉嫩一区二区三区国产精品| 日本精品久久久久久久| 香蕉精品久久| 91视频 -- 69xx| 91在线精品一区二区三区| 国产一级做a爱片久久毛片a| 欧美精品一区二区三区久久久| 日本在线观看高清完整版| 亚洲va欧美va国产综合剧情| 亚洲一区在线| wwwww在线观看| 午夜精品福利一区二区三区av | www欧美在线| 亚洲欧美精品中文字幕在线| 在线看片国产福利你懂的| 久久av一区二区三区漫画| 亚洲欧美不卡| 成人午夜剧场视频网站| 欧洲一区二区三区在线| 1区2区3区在线观看| 国产日产亚洲精品| 亚洲成av人电影| 女同性αv亚洲女同志| 午夜av一区二区| 九一在线视频| 国产精品中文字幕久久久| 久久激情电影| 天堂在线精品视频| 亚州成人在线电影| 欧美另类自拍| 国产色视频一区| 亚洲午夜黄色| 久久久精品人妻无码专区| 欧美亚洲丝袜传媒另类| 日本成人网址| 国产v亚洲v天堂无码| 久久夜色精品| 免费成人深夜夜行网站| 精品国产免费一区二区三区香蕉| 蜜桃麻豆av在线| 亚洲精品高清视频| 国产成人免费视| 日本久久综合网| 美女精品视频一区| 亚洲男人都懂第一日本| 69久久久久久| 亚洲第一主播视频| 成人在线观看免费| 成人永久免费| 日韩不卡一区二区三区| jizz亚洲少妇| 精品一区二区电影| 国产精品色婷婷在线观看| 国产极品粉嫩福利姬萌白酱| 中文字幕一区二区三区色视频| 刘亦菲毛片一区二区三区| 国产精品久久久久久久久免费 | 美女一区二区在线观看| 无码日韩人妻精品久久蜜桃| 亚洲精品福利视频网站| 国产一级在线| 国产精品日韩一区二区免费视频| 日韩激情av在线| 日韩精品视频免费播放| www.国产一区|