日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何在项目启动时就执行某些操作

發布時間:2024/4/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在项目启动时就执行某些操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考資料:如何在項目啟動時就執行某些操作

在實際的項目開發中經常會遇到一些需要在項目啟動的時候進行初始化操作的需求,比如初始化線程池,配置某些對象的序列化和反序列化方式,加載黑名單白名單,加載權限應用,加載組織架構到緩存等等。這篇文章就來總結一下如何在項目初始化時進行一些資源操作。

方法一:@PostConstruct方法

//將黑名單從數據庫中查詢出來,并放到緩存中 @Service("phoneBlacklistCache") public class PhoneBlacklistCache {public List<String> phoneBlacklist = new ArrayList<String>();@PostConstructpublic void init(){     //需要進行的操作,如:查詢數據庫,寫到緩存} }

方法二:init-method方法

1、在xml文件里配置bean,bean的配置中配置init-method方法(該方法配置成你想要執行的操作方法)。

<bean id="PoneBlacklistCache" class="com.xxx.cache.PhoneBlacklistCache" scope="singleton" init-method="init"></bean>

2、通過@Bean注解的方式

@Service("phoneBlacklistCache") public class PhoneBlacklistCache {public List<String> phoneBlacklist = new ArrayList<String>();@Bean(initMethod = “init”)public void init(){     //需要進行的操作,如:查詢數據庫,寫到緩存} }

方法三:InitializingBean方法

讓相應的類實現InitializingBean接口,重寫InitializingBean接口的afterPropertiesSet方法即可。

public class PhoneBlacklistCache implements InitializingBean{public List<String> phoneBlacklist = new ArrayList<String>();@Overridepublic void afterPropertiesSet() throws Exception {     //需要進行的操作,比如查詢數據庫,寫到緩存}}

方法四:quartz方法

將定時任務(如:SimpleTriggerBean等)配置成項目啟動后立即執行,且重復執行次數配置成0次,不重復執行,即可達到項目啟動時執行一些操作的目的。

方法五:在springboot啟動類的main方法中執行

@SpringBootApplication public class TestApplication {public static void main(String[] args) {System.out.println(" doSomething……");SpringApplication.run(CommandLineRunnerApplication.class, args);System.out.println(" doSomething……");} }

方法六:實現CommandLineRunner/ApplicationRunner接口

CommandLineRunner 接口的 Component 會在所有 SpringBeans都初始化之后, SpringApplication.run()之前執行,非常適合在應用程序啟動之初進行一些數據初始化的工作。

@SpringBootApplication public class TestCommandLineRunnerApplication {public static void main(String[] args) {System.out.println("The service to start.");SpringApplication.run(CommandLineRunnerApplication.class, args);System.out.println("The service has started.");} }

實現CommandLineRunner接口

@Component public class Runner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("The Runner start to initialize ..."); } }

控制臺打印結果

... The service to start.. ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.0.0.RELEASE) ... 2018-04-21 22:21:34.706 INFO 27016 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2018-04-21 22:21:34.710 INFO 27016 --- [ main] com.xxx.TestCommandLineRunnerApplication : Started TestCommandLineRunnerApplication in 3.796 seconds (JVM running for 5.128) The Runner start to initialize ...

如果我們在啟動容器的時候需要初始化很多資源,并且初始化資源相互之間有序,那如何保證不同的 CommandLineRunner的執行順序呢?Spring Boot 也給出了解決方案。那就是使用 @Order 注解。

實現類一

@Component @Order(1) public class OrderRunner1 implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("The OrderRunner1 start to initialize ...");} }

實現類二

@Component @Order(2) public class OrderRunner2 implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("The OrderRunner2 start to initialize ...");} }

控制臺執行結果如下

... The service to start.. ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.0.0.RELEASE) ... 2018-04-21 22:21:34.706 INFO 27016 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2018-04-21 22:21:34.710 INFO 27016 --- [ main] com.xxx.TestCommandLineRunnerApplication : Started TestCommandLineRunnerApplication in 3.796 seconds (JVM running for 5.128) The OrderRunner1 start to initialize ... The OrderRunner2 start to initialize ... The Runner start to initialize ...

通過控制臺的輸出我們發現,添加 @Order 注解的實現類最先執行,并且@Order()里面的值越小啟動越早。

對比:

相同點:這兩種方法提供的目的是為了滿足,在項目啟動的時候立刻執行某些方法。我們可以通過實現ApplicationRunner和CommandLineRunner,來實現,他們都是在SpringApplication 執行之后開始執行的。

不同點:CommandLineRunner接口可以用來接收字符串數組的命令行參數,ApplicationRunner 是使用ApplicationArguments 用來接收參數的 【根據業務場景靈活運用】

ApplicationRunner源碼如下:

public interface ApplicationRunner {void run(ApplicationArguments var1) throws Exception; }

CommandLineRunner源碼如下

public interface CommandLineRunner {void run(String... var1) throws Exception; }

總結

以上是生活随笔為你收集整理的如何在项目启动时就执行某些操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久成人黄色 | 男ji大巴进入女人的视频 | 一区二区中文字幕在线观看 | 拍国产真实乱人偷精品 | 婷婷一级片 | a天堂中文在线 | 第一区免费在线观看 | 欧美日韩人妻精品一区在线 | 狠狠躁夜夜躁人人爽天天高潮 | 狠狠干天天爱 | 少妇一级淫片免费播放 | 鲁一鲁色一色 | 国产精彩视频在线观看 | 亚洲日本精品视频 | 日本不卡视频一区二区三区 | 性色av浪潮av | 91在线一区二区三区 | 亚洲爆乳无码一区二区三区 | 波多野结衣视频一区二区 | 色臀 | 日韩一区二区三区在线观看视频 | 国产午夜精品一区二区三区视频 | 污黄视频在线观看 | 欧美资源网| 日日夜夜免费 | 一区二区的视频 | 日一区二区三区 | 亚洲av永久无码精品三区在线 | 成年人免费在线 | 正在播放adn156松下纱荣子 | 亚洲久久一区二区 | 一区二区三区精品在线 | 日本亲近相奷中文字幕 | 亚洲第一精品在线观看 | 亚洲国产精品视频在线观看 | 射黄视频| 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 中文字幕无产乱码 | 欧美精品www | 青青草在线视频免费观看 | 都市激情校园春色亚洲 | 久久三级视频 | 永久免费黄色片 | 天天干影院 | 亚洲欧美校园春色 | 亚洲激情国产 | 怒海潜沙秦岭神树 | 日韩精品无码一区二区三区久久久 | 黄色三级图片 | cao死你| 亚洲一区二区三区在线看 | a级一a一级在线观看 | 欧美插插视频 | 日韩美女视频一区二区 | 热久久精 | a级片毛片| 国产在线一区不卡 | 男女在线免费观看 | 色窝窝无码一区二区三区成人网站 | 中文在线资源天堂 | 国产一级片毛片 | 国产欧美日韩 | 久久亚洲免费视频 | 国语久久 | 免费在线黄网站 | 欧亚成人av | 欧美日韩视频一区二区三区 | 国产精品精东影业 | 久久成人综合 | 91蜜桃在线观看 | 久久久久久福利 | 亚洲精品天堂网 | 国产原创在线 | 91精品国产一区二区无码 | 九月激情网 | 嫩草影院在线视频 | 91亚洲网 | 国产三级国产精品国产国在线观看 | 色人阁婷婷 | 欧美一区二区三区成人精品 | 在线黄色av网站 | 欧美激情性做爰免费视频 | 亚洲高清视频在线观看 | 亚洲精品99999 | 日韩中文av在线 | 香蕉视频入口 | 欧美大白屁股 | 久久精品影视 | 娇小tube性极品娇小 | 五月婷婷欧美 | 老司机狠狠爱 | 国产91精品一区 | 久久影音先锋 | 日本黄网站 | 日韩欧美二区 | 一区二区三区不卡在线观看 | 亚洲激情图片 | 五月av综合av国产av | 国产色|