日韩性视频-久久久蜜桃-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; }

總結

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

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

主站蜘蛛池模板: 亚洲第一免费视频 | xxxx国产 | www.五月天婷婷 | 久久久无码人妻精品无码 | 国产午夜精品一区二区三区视频 | 欧美性猛交xxxx偷拍洗澡 | 日韩人妻无码精品综合区 | 快射视频网站 | 国产成人自拍视频在线观看 | 欧美性xxxxx 亚洲特黄一级片 | 美国美女黄色片 | 久久综合热 | 亚洲综合二区 | 久久久久久久久久久国产精品 | 欧美性生交xxxxx久久久 | free黑人多人性派对hd | 手机在线精品视频 | 91精品国产高清一区二区三密臀 | 国产66页| 懂色tv | 亚洲一个色 | 欧美精品乱码99久久蜜桃 | 国产综合婷婷 | 成人免费视频一区二区三区 | 国产精九九网站漫画 | 欧洲精品一区二区三区 | 国产精品人人人人 | 五月天婷婷综合网 | 一边摸上面一边摸下面 | 国产一区2区 | 污污的网站在线观看 | jjzz黄色片 | 国产又黄又大又粗的视频 | 偷拍一区二区三区 | 午夜寂寞福利 | 国产福利一区二区三区视频 | 国产精品亚洲成在人线 | 久草视频在线免费看 | 精品久久久久久久中文字幕 | 国产精品永久免费视频 | 辟里啪啦国语版免费观看 | 欧美自拍偷拍一区 | 天啪| 狠狠干av | 欧美精品一区二区三区久久久 | 午夜福利三级理论电影 | 可以直接看av的网址 | 美女视频91| 亚洲一二三区在线 | youjizz亚洲女人 | 色老大网站 | 午夜国产免费 | 色性网| 少妇色综合 | 欧洲成人在线 | 久久免费精彩视频 | 黄色一级片. | 欧美精品一区二区三区在线 | 免费激情小视频 | 亚洲精品一区二区三 | 国产一区二区三区高清视频 | 国产不卡一区 | 成人ay | 欧美精品亚洲一区 | 在线天堂6 | 国产怡红院 | 久久午夜精品人妻一区二区三区 | 亚洲婷婷小说 | 无码人妻aⅴ一区二区三区玉蒲团 | 粉嫩av一区二区三区四区五区 | 亚洲好视频 | 国产乱淫片视频 | 奇米影视9999 | 最新国产中文字幕 | 亚洲视频在线免费 | 久久久综合色 | jizzzxxxx| 秋葵视频在线 | 91亚洲国产成人精品性色 | 欧美最顶级a∨艳星 | 羞羞的视频在线观看 | 日韩欧av| 朴银狐电影中文在线看 | 香蕉尹人| 免费黄在线 | 波多野结衣在线观看一区二区三区 | 妻子的性幻想 | 欧美日韩一区不卡 | 日韩三级大片 | xxxwww黄色| 日本三级中文字幕在线观看 | 浪荡奴双性跪着伺候 | 日批网站在线观看 | 无码日韩精品视频 | 免费看黄在线网站 | 素人fc2av清纯18岁 | 变态另类丨国产精品 | xxxx日本黄色 | 小视频在线 |