最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Spring啟動時運行自定義業(yè)務

 更新時間:2021年07月22日 14:41:03   作者:夢想畫家  
這篇文章主要介紹了使用Spring啟動時運行自定義業(yè)務的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

在Spring應用啟動時運行自定義業(yè)務的場景很常見,但應用不當也可能會導致一些問題。

基于Spring控制反轉(zhuǎn)(Inverse of Control)功能用戶幾乎不用干預bean實例化過程,對于自定義業(yè)務則需要控制部分流程及容器,因此值得須特別關(guān)注。

1. Spring啟動時運行自定義業(yè)務

我們不能簡單包括自定義業(yè)務在bean的構(gòu)造函數(shù)或在實例化任何對象之后調(diào)用方法,這些過程不由我們控制。請看示例:

@Component
public class InvalidInitExampleBean {
    @Autowired
    private Environment env;
    public InvalidInitExampleBean() {
        env.getActiveProfiles();
    }
}

這里嘗試在構(gòu)造函數(shù)中訪問自動裝配的屬性。當調(diào)用構(gòu)造函數(shù)時,Spring bean仍沒有全部初始化,因此導致NullPointerExceptions異常。下面介紹幾種方式解決此問題。

1.1 @PostConstruct 注解

@PostConstruct注解用于方法上,實現(xiàn)bean初始化后立刻執(zhí)行一次。需要注意的是,即使沒有對象注入,Spring也會執(zhí)行注解方法。

@Component
public class PostConstructExampleBean {
    private static final Logger LOG 
      = Logger.getLogger(PostConstructExampleBean.class);
    @Autowired
    private Environment environment;
    @PostConstruct
    public void init() {
        LOG.info(Arrays.asList(environment.getDefaultProfiles()));
    }
}

上面示例可以實現(xiàn)Environment environment被安全注入,然后調(diào)用注解方法且不會出現(xiàn)空指針異常。

1.2 InitializingBean 接口

InitializingBean接口實現(xiàn)功能與上節(jié)類似。但需要實現(xiàn)接口并重寫afterPropertiesSet方法。

下面重寫前節(jié)的示例:

@Component
public class InitializingBeanExampleBean implements InitializingBean {
    private static final Logger LOG 
      = Logger.getLogger(InitializingBeanExampleBean.class);
    @Autowired
    private Environment environment;
    @Override
    public void afterPropertiesSet() throws Exception {
        LOG.info(Arrays.asList(environment.getDefaultProfiles()));
    }
}

1.3 ApplicationListener 監(jiān)聽器

該方法可用于在Spring上下文初始化之后執(zhí)行自定義業(yè)務。因此不針對特定bean,而是等待所有bean初始化之后。應用時需要實現(xiàn)ApplicationListener接口:

@Component
public class StartupApplicationListenerExample implements 
  ApplicationListener<ContextRefreshedEvent> {
    private static final Logger LOG 
      = Logger.getLogger(StartupApplicationListenerExample.class);
    public static int counter;
    @Override public void onApplicationEvent(ContextRefreshedEvent event) {
        LOG.info("Increment counter");
        counter++;
    }
}

同樣可以引入@EventListener注解實現(xiàn):

@Component
public class EventListenerExampleBean {
    private static final Logger LOG 
      = Logger.getLogger(EventListenerExampleBean.class);
    public static int counter;
    @EventListener
    public void onApplicationEvent(ContextRefreshedEvent event) {
        LOG.info("Increment counter");
        counter++;
    }
}

上面示例使用ContextRefreshedEvent,具體選擇哪種事件根據(jù)你的業(yè)務需要。

1.4 @Bean的初始化方法

該注解的initMethod屬性可用于在bean初始化之后執(zhí)行方法,示例:

public class InitMethodExampleBean {
    private static final Logger LOG = Logger.getLogger(InitMethodExampleBean.class);
    @Autowired
    private Environment environment;
    public void init() {
        LOG.info(Arrays.asList(environment.getDefaultProfiles()));
    }
}

既不要實現(xiàn)接口,也不要特定注解。通過注解定義Bean:

@Bean(initMethod="init")
public InitMethodExampleBean initMethodExampleBean() {
    return new InitMethodExampleBean();
}

對應xml配置:

<bean id="initMethodExampleBean"
  class="com.baeldung.startup.InitMethodExampleBean"
  init-method="init">
</bean>

1.5 構(gòu)造函數(shù)注入

如果使用構(gòu)造器注入屬性,可以簡單地在構(gòu)造函數(shù)中包括業(yè)務:

@Component 
public class LogicInConstructorExampleBean {
    private static final Logger LOG 
      = Logger.getLogger(LogicInConstructorExampleBean.class);
    private final Environment environment;
    @Autowired
    public LogicInConstructorExampleBean(Environment environment) {
        this.environment = environment;
        LOG.info(Arrays.asList(environment.getDefaultProfiles()));
    }
}

1.6 Spring Boot CommandLineRunner接口

Spring Boot 提供了CommandLineRunner接口,重寫run方法,可以在應用啟動時Spring應用上下文實例化之后調(diào)用。

@Component
public class CommandLineAppStartupRunner implements CommandLineRunner {
    private static final Logger LOG =
      LoggerFactory.getLogger(CommandLineAppStartupRunner.class);
    public static int counter;
    @Override
    public void run(String...args) throws Exception {
        LOG.info("Increment counter");
        counter++;
    }
}

CommandLineRunner bean在相同上下文中可以定義多個,通過使用Ordered 接口或@Ordere注解確定順序。

1.7 Spring Boot ApplicationRunner

與CommandLineRunner類似,Spring Boot 也提供了ApplicationRunner接口,重寫run方法可以實現(xiàn)應用啟動時執(zhí)行自定義業(yè)務。另外其回調(diào)方法沒有使用String參數(shù),而是使用ApplicationArguments類的實例。

ApplicationArguments有方法可以獲取可選參數(shù)及普通參數(shù)的值,參數(shù)前有–的表示可選參數(shù)。

@Component
public class AppStartupRunner implements ApplicationRunner {
    private static final Logger LOG =
      LoggerFactory.getLogger(AppStartupRunner.class);
    public static int counter;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        LOG.info("Application started with option names : {}", 
          args.getOptionNames());
        LOG.info("Increment counter");
        counter++;
    }
}

2. 執(zhí)行順序

多種方法對bean同時進行控制,對應執(zhí)行順序如下:

  1. 構(gòu)造函數(shù)
  2. @PostConstruct注解方法
  3. InitializingBean的afterPropertiesSet()
  4. @Bean或xml中標注的初始化方法

讀者可以自行測試進行驗證。

3. 總結(jié)

本文介紹多種方式實現(xiàn)在Spring啟動時實現(xiàn)自定義業(yè)務。通過對比不同方式實現(xiàn)加深對Spring的理解,掌握更多控制bean實例化過程的方式。以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • RocketMq事務消息發(fā)送代碼流程詳解

    RocketMq事務消息發(fā)送代碼流程詳解

    這篇文章主要介紹了RocketMq事務消息發(fā)送代碼流程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Java 數(shù)組高頻考點分析講解

    Java 數(shù)組高頻考點分析講解

    數(shù)組對于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當然不同語言對數(shù)組的實現(xiàn)及處理也不盡相同。Java 語言中提供的數(shù)組是用來存儲固定大小的同類型元素
    2022-04-04
  • 如何將Tomcat容器替換為Jetty容器

    如何將Tomcat容器替換為Jetty容器

    這篇文章主要介紹了如何將Tomcat容器替換為Jetty容器問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java后臺實現(xiàn)瀏覽器一鍵導出下載zip壓縮包

    Java后臺實現(xiàn)瀏覽器一鍵導出下載zip壓縮包

    這篇文章主要為大家詳細介紹了Java后臺實現(xiàn)瀏覽器一鍵導出下載zip壓縮包,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Spring Boot @Async 異步任務執(zhí)行方法

    Spring Boot @Async 異步任務執(zhí)行方法

    本篇文章主要介紹了Spring Boot @Async 異步任務執(zhí)行方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 詳解spring cloud hystrix請求緩存(request cache)

    詳解spring cloud hystrix請求緩存(request cache)

    這篇文章主要介紹了詳解spring cloud hystrix請求緩存(request cache),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java中的Random和ThreadLocalRandom詳細解析

    Java中的Random和ThreadLocalRandom詳細解析

    這篇文章主要介紹了Java中的Random和ThreadLocalRandom詳細解析,Random 類用于生成偽隨機數(shù)的流, 該類使用48位種子,其使用線性同余公式進行修改,需要的朋友可以參考下
    2024-01-01
  • 詳解Thymeleaf的三種循環(huán)遍歷方式

    詳解Thymeleaf的三種循環(huán)遍歷方式

    Thymeleaf?是一款用于渲染?XML/XHTML/HTML5?內(nèi)容的模板引擎。本文為大家總結(jié)了Thymeleaf的三種循環(huán)遍歷方式,感興趣的可以跟隨小編一起學習一下
    2022-06-06
  • Java中數(shù)組在內(nèi)存中存放原理的講解

    Java中數(shù)組在內(nèi)存中存放原理的講解

    今天小編就為大家分享一篇關(guān)于Java中數(shù)組在內(nèi)存中存放原理的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • spring boot 靜態(tài)資源處理方法

    spring boot 靜態(tài)資源處理方法

    本篇文章主要介紹了spring boot 靜態(tài)資源處理方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03

最新評論

南开区| 高唐县| 泸西县| 玉屏| 齐河县| 安平县| 德庆县| 大方县| 萝北县| 孟津县| 东明县| 福贡县| 美姑县| 象州县| 远安县| 新化县| 肇庆市| 湖口县| 泉州市| 苏州市| 泽州县| 花莲市| 罗田县| 玉林市| 象山县| 北川| 临安市| 乃东县| 柘城县| 普兰店市| 贺兰县| 合山市| 富顺县| 威信县| 横峰县| 英超| 江门市| 阳西县| 娱乐| 万州区| 阿瓦提县|