欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于spring.factories的常用配置項(xiàng)說(shuō)明

 更新時(shí)間:2024年07月13日 16:17:17   作者:飄零未歸人  
這篇文章主要介紹了關(guān)于spring.factories的常用配置項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

概述

spring.factories 實(shí)現(xiàn)是依賴(lài) spring-core 包里的 SpringFactoriesLoader 類(lèi),這個(gè)類(lèi)實(shí)現(xiàn)了檢索 META-INF/spring.factories 文件,并獲取指定接口的配置的功能。

Spring Factories機(jī)制提供了一種解耦容器注入的方式,幫助外部包(獨(dú)立于spring-boot項(xiàng)目)注冊(cè)Bean到spring boot項(xiàng)目容器中。

spring.factories 這種機(jī)制實(shí)際上是仿照 java 中的 SPI 擴(kuò)展機(jī)制實(shí)現(xiàn)的。

Spring Factories機(jī)制原理

核心類(lèi)SpringFactoriesLoader

從上文可知,Spring Factories機(jī)制通過(guò)META-INF/spring.factories文件獲取相關(guān)的實(shí)現(xiàn)類(lèi)的配置信息,而SpringFactoriesLoader的功能就是讀取META-INF/spring.factories,并加載配置中的類(lèi)。

SpringFactoriesLoader主要有兩個(gè)方法:loadFactories和loadFactoryNames。

  • loadFactoryNames

用于按接口獲取Spring Factories文件中的實(shí)現(xiàn)類(lèi)的全稱(chēng),其方法定義如下所示,其中參數(shù)factoryType指定了需要獲取哪個(gè)接口的實(shí)現(xiàn)類(lèi),classLoader用于讀取配置文件資源。

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader)
  • loadFactories

用于按接口獲取Spring Factories文件中的實(shí)現(xiàn)類(lèi)的實(shí)例,其方法定義如下所示,其中參數(shù)factoryType指定了需要獲取哪個(gè)接口的實(shí)現(xiàn)類(lèi),classLoader用于讀取配置文件資源和加載類(lèi)。

public static <T> List<T> loadFactories(Class<T> factoryType, @Nullable ClassLoader classLoader)

用法及配置

spring.factories 文件必須放在 resources 目錄下的 META-INF 的目錄下,否則不會(huì)生效。

如果一個(gè)接口希望配置多個(gè)實(shí)現(xiàn)類(lèi),可以用","分割。

BootstrapConfiguration

該配置項(xiàng)用于自動(dòng)引入配置源,類(lèi)似于spring-cloud的bootstrap和nacos的配置,通過(guò)指定的方式加載我們自定義的配置項(xiàng)信息。

該配置項(xiàng)配置的類(lèi)必須是實(shí)現(xiàn)了PropertySourceLocator接口的類(lèi)。

org.springframework.cloud.bootstrap.BootstrapConfiguration=\ xxxxxx.configure.config.ApplicationConfigure
public class ApplicationConfigure {

    @Bean
    @ConditionalOnMissingBean({CoreConfigPropertySourceLocator.class})
    public CoreConfigPropertySourceLocator configLocalPropertySourceLocator() {
        return new CoreConfigPropertySourceLocator();
    }
}

public class CoreConfigPropertySourceLocator implements PropertySourceLocator {
.....
}

ApplicationContextInitializer

該配置項(xiàng)用來(lái)配置實(shí)現(xiàn)了 ApplicationContextInitializer 接口的類(lèi),這些類(lèi)用來(lái)實(shí)現(xiàn)上下文初始化

org.springframework.context.ApplicationContextInitializer=\
xxxxxx.config.TestApplicationContextInitializer
public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
 
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("TestApplicationContextInitializer.initialize() " + applicationContext);
    }
 
}

ApplicationListener

配置應(yīng)用程序監(jiān)聽(tīng)器,該監(jiān)聽(tīng)器必須實(shí)現(xiàn) ApplicationListener 接口。

它可以用來(lái)監(jiān)聽(tīng) ApplicationEvent 事件。

org.springframework.context.ApplicationListener=\
xxxxxxx.factories.listener.TestApplicationListener
@Slf4j
public class TestApplicationListener implements ApplicationListener<TestMessageEvent> {
 
    @Override
    public void onApplicationEvent(EmailMessageEvent event) {
        log.info("模擬消息事件... ");
        log.info("TestApplicationListener 接受到的消息:{}", event.getContent());
    }
}

AutoConfigurationImportListener

該配置項(xiàng)用來(lái)配置自動(dòng)配置導(dǎo)入監(jiān)聽(tīng)器,監(jiān)聽(tīng)器必須實(shí)現(xiàn) AutoConfigurationImportListener 接口。

該監(jiān)聽(tīng)器可以監(jiān)聽(tīng) AutoConfigurationImportEvent 事件。

org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
xxxx.config.TestAutoConfigurationImportListener
public class TestAutoConfigurationImportListener implements AutoConfigurationImportListener {
    @Override
    public void onAutoConfigurationImportEvent(AutoConfigurationImportEvent event) {
        System.out.println("TestAutoConfigurationImportListener.onAutoConfigurationImportEvent() " + event);
    }
}

AutoConfigurationImportFilter

配置自動(dòng)配置導(dǎo)入過(guò)濾器,過(guò)濾器必須實(shí)現(xiàn) AutoConfigurationImportFilter 接口。

該過(guò)濾器用來(lái)過(guò)濾那些自動(dòng)配置類(lèi)可用。

org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
xxxxxx.config.TestConfigurationCondition
public class TestConfigurationCondition implements AutoConfigurationImportFilter {

    @Override
    public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) {
        System.out.println("TestConfigurationCondition.match() autoConfigurationClasses=" +  Arrays.toString(autoConfigurationClasses) + ", autoConfigurationMetadata=" + autoConfigurationMetadata);
        return new boolean[0];
    }
}

EnableAutoConfiguration

配置自動(dòng)配置類(lèi)。

這些配置類(lèi)需要添加 @Configuration 注解,可用于注冊(cè)bean。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
xxxxx.config.TestConfiguration
@Configuration
public class MyConfiguration {
 
    public MyConfiguration() {
        System.out.println("MyConfiguration()");
    }

    @Bean
    public Testbean testbean(){
        return new Testbean()
    }
    
    //注冊(cè)過(guò)濾器
     @Bean
    public TestFilter testFilter(){
        return new TestFilter()
    }
 
}

FailureAnalyzer

配置自定的錯(cuò)誤分析類(lèi),該分析器需要實(shí)現(xiàn) FailureAnalyzer 接口。

org.springframework.boot.diagnostics.FailureAnalyzer=\
xxxxx.config.TestFailureAnalyzer
/**
 * 自定義錯(cuò)誤分析器
 */
public class TestFailureAnalyzer implements FailureAnalyzer {
 
    @Override
    public FailureAnalysis analyze(Throwable failure) {
        System.out.println("TestFailureAnalyzer.analyze() failure=" + failure);
        return new FailureAnalysis("TestFailureAnalyzer execute", "test spring.factories", failure);
    }
 
}

TemplateAvailabilityProvider

配置模板的可用性提供者,提供者需要實(shí)現(xiàn) TemplateAvailabilityProvider 接口。

org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
xxxxx.config.TestTemplateAvailabilityProvider
/**
 * 驗(yàn)證指定的模板是否支持
 */
public class TestTemplateAvailabilityProvider implements TemplateAvailabilityProvider {
 
    @Override
    public boolean isTemplateAvailable(String view, Environment environment, ClassLoader classLoader, ResourceLoader resourceLoader) {
        System.out.println("TestTemplateAvailabilityProvider.isTemplateAvailable() view=" + view + ", environment=" + environment + ", classLoader=" + classLoader + "resourceLoader=" + resourceLoader);
        return false;
    }

}

自定義Spring Factories機(jī)制

首先我們需要先定義兩個(gè)模塊,第一個(gè)模塊A用于定義interface和獲取interface的實(shí)現(xiàn)類(lèi)。

代碼如下:

package com.zhong.spring.demo.demo_7_springfactories;


public interface DemoService {
    void printName();
}


package com.zhong.spring.demo.demo_7_springfactories;

import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.List;


@Slf4j
@Service
public class DemoServiceFactory {
        @PostConstruct
        public void printService(){
            List<String> serviceNames = SpringFactoriesLoader.loadFactoryNames(DemoService.class,null);
            for (String serviceName:serviceNames){
                log.info("name:" + serviceName);
            }

            List<DemoService> services = SpringFactoriesLoader.loadFactories(DemoService.class,null);
            for (DemoService demoService:services){
                demoService.printName();
            }
        }
}

另一個(gè)模塊B引入A模塊,并實(shí)現(xiàn)DemoService類(lèi)。并且配置spring.factories

代碼如下:

package com.zhong.spring.usuldemo.impl;

import com.zhong.spring.demo.demo_7_springfactories.DemoService;
import lombok.extern.slf4j.Slf4j;


@Slf4j
public class DemoServiceImpl1 implements DemoService {
    @Override
    public void printName() {
        log.info("-----------DemoServiceImpl2------------");
    }
}


import com.zhong.spring.demo.demo_7_springfactories.DemoService;
import lombok.extern.slf4j.Slf4j;


@Slf4j
public class DemoServiceImpl2 implements DemoService {
    @Override
    public void printName() {
        log.info("-----------DemoServiceImpl2------------");
    }
}

spring.factory配置如下:

com.zhong.spring.demo.demo_7_springfactories.DemoService=\
com.zhong.spring.usuldemo.impl.DemoServiceImpl1,\
com.zhong.spring.usuldemo.impl.DemoServiceImpl2

啟動(dòng)模塊B

得到以下日志;

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java能寫(xiě)爬蟲(chóng)程序嗎

    java能寫(xiě)爬蟲(chóng)程序嗎

    在本篇文章里小編給大家整理的是一篇關(guān)于java是否能寫(xiě)爬蟲(chóng)程序的一篇文章,對(duì)此有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • 詳解Java阻塞隊(duì)列(BlockingQueue)的實(shí)現(xiàn)原理

    詳解Java阻塞隊(duì)列(BlockingQueue)的實(shí)現(xiàn)原理

    這篇文章主要介紹了詳解Java阻塞隊(duì)列(BlockingQueue)的實(shí)現(xiàn)原理,阻塞隊(duì)列是Java util.concurrent包下重要的數(shù)據(jù)結(jié)構(gòu),有興趣的可以了解一下
    2017-06-06
  • MyBatis-Flex BaseMapper的接口基本用法小結(jié)

    MyBatis-Flex BaseMapper的接口基本用法小結(jié)

    本文主要介紹了MyBatis-Flex BaseMapper的接口基本用法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Struts2相關(guān)的面試題整理分享

    Struts2相關(guān)的面試題整理分享

    這篇文章主要給大家總結(jié)整理了關(guān)于Struts2相關(guān)的面試題,文中先詳細(xì)介紹了關(guān)于struts2的工作原理、工作流程、攔截器和過(guò)濾器的區(qū)別以及什么要使用Struts2,然后分享了總結(jié)的一些關(guān)于Struts2面試的一些問(wèn)題,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-11-11
  • 解決idea找不到setting.xml文件的問(wèn)題

    解決idea找不到setting.xml文件的問(wèn)題

    這篇文章主要介紹了解決idea找不到setting.xml文件的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Spring boot項(xiàng)目部署到云服務(wù)器小白教程詳解

    Spring boot項(xiàng)目部署到云服務(wù)器小白教程詳解

    這篇文章主要介紹了Spring boot項(xiàng)目部署到云服務(wù)器小白教程詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Java管道流實(shí)現(xiàn)線程間通信過(guò)程解析

    Java管道流實(shí)現(xiàn)線程間通信過(guò)程解析

    這篇文章主要介紹了Java管道流實(shí)現(xiàn)線程間通信過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Redis中的事務(wù)和Redis樂(lè)觀鎖詳解

    Redis中的事務(wù)和Redis樂(lè)觀鎖詳解

    這篇文章主要介紹了Redis中的事務(wù)和Redis樂(lè)觀鎖詳解,Redis事務(wù)是一個(gè)單獨(dú)的隔離操作:事務(wù)中的所有命令都會(huì)序列化、按順序地執(zhí)行,事務(wù)在執(zhí)行的過(guò)程中,不會(huì)被其他客戶(hù)端發(fā)送來(lái)的命令請(qǐng)求所打斷,需要的朋友可以參考下
    2023-12-12
  • SpringBoot整合MQTT并實(shí)現(xiàn)異步線程調(diào)用的問(wèn)題

    SpringBoot整合MQTT并實(shí)現(xiàn)異步線程調(diào)用的問(wèn)題

    這篇文章主要介紹了基于SpringBoot通過(guò)注解實(shí)現(xiàn)對(duì)mqtt消息處理的異步調(diào)用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • mybatis中的字符串拼接問(wèn)題

    mybatis中的字符串拼接問(wèn)題

    這篇文章主要介紹了mybatis中的字符串拼接問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論