spring.factories

总结

spring.factories的作用是 当外界使用该jar时不用再写配置 会自动加入其中已经配置好的配置

用法及配置

## Initializers
org.springframework.context.ApplicationContextInitializer=\
com.jhj.springboot.autoconfig.MyApplicationContextInitializer
 
## Application Listeners
org.springframework.context.ApplicationListener=\
com.jhj.springboot.autoconfig.MyApplicationListener
 
## Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
com.jhj.springboot.autoconfig.MyAutoConfigurationImportListener
 
## Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
com.jhj.springboot.autoconfig.MyConfigurationCondition
 
## Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.jhj.springboot.autoconfig.MyConfiguration
 
## Failure analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
com.jhj.springboot.autoconfig.MyFailureAnalyzer
 
## Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
com.jhj.springboot.autoconfig.MyTemplateAvailabilityProvider
 
#后置环境变量处理器
org.springframework.boot.env.EnvironmentPostProcessor=cn.telecom.starter.cloud.LoadProperties

ApplicationContextInitializer 上下文初始化

org.springframework.context.ApplicationContextInitializer=\
com.jhj.springboot.autoconfig.MyApplicationContextInitializer
public class MyApplicationContextInitializer implements
        ApplicationContextInitializer<ConfigurableApplicationContext> {
 
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("MyApplicationContextInitializer.initialize() " + applicationContext);
    }
 
}

ApplicationListener 配置应用程序监听器

org.springframework.context.ApplicationListener=\
com.jhj.springboot.autoconfig.MyApplicationListener
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
 
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println("MyApplicationListener.onApplicationEvent() " + event);
        if(event instanceof ApplicationStartedEvent) {
            throw new RuntimeException("我故意抛出的错误,仅仅为了触发自定义 MyFailureAnalyzer");
        }
    }
 
}

AutoConfigurationImportListener 配置自动配置导入监听器

org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
com.jhj.springboot.autoconfig.MyAutoConfigurationImportListener
public class MyAutoConfigurationImportListener implements AutoConfigurationImportListener {
 
    @Override
    public void onAutoConfigurationImportEvent(AutoConfigurationImportEvent event) {
        System.out.println("MyAutoConfigurationImportListener.onAutoConfigurationImportEvent() " + event);
    }
 
}

AutoConfigurationImportFilter 配置自动配置导入过滤器

 
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
com.jhj.springboot.autoconfig.MyConfigurationCondition
public class MyConfigurationCondition implements AutoConfigurationImportFilter {
 
    @Override
    public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) {
        System.out.println("MyConfigurationCondition.match() autoConfigurationClasses=" +
                Arrays.toString(autoConfigurationClasses) +
                ", autoConfigurationMetadata=" + autoConfigurationMetadata);
        return new boolean[0];
    }
 
}

EnableAutoConfiguration 配置自动配置

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.jhj.springboot.autoconfig.MyConfiguration
@Configuration
public class MyConfiguration {
 
    public MyConfiguration() {
        System.out.println("MyConfiguration()");
    }
 
}

FailureAnalyzer 配置自定的错误分析类

org.springframework.boot.diagnostics.FailureAnalyzer=\
com.jhj.springboot.autoconfig.MyFailureAnalyzer
/**
 * 自定义自己的错误分析器 FailureAnalyzer
 * @author Administrator 2021/4/1 13:14
 * @version 1.0
 */
public class MyFailureAnalyzer implements FailureAnalyzer {
 
    @Override
    public FailureAnalysis analyze(Throwable failure) {
        System.out.println("MyFailureAnalyzer.analyze() failure=" + failure);
        return new FailureAnalysis("MyFailureAnalyzer execute", "test spring.factories", failure);
    }
 
}

TemplateAvailabilityProvider 配置模板的可用性提供者

 
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
com.jhj.springboot.autoconfig.MyTemplateAvailabilityProvider
/**
 * 验证指定的模板是否支持
 * @author Administrator 2021/4/1 13:22
 * @version 1.0
 */
public class MyTemplateAvailabilityProvider implements TemplateAvailabilityProvider {
 
    @Override
    public boolean isTemplateAvailable(String view, Environment environment,
                                       ClassLoader classLoader, ResourceLoader resourceLoader) {
        System.out.println("MyTemplateAvailabilityProvider.isTemplateAvailable() view=" +
                view + ", environment=" + environment + ", classLoader=" + classLoader +
                "resourceLoader=" + resourceLoader);
        return false;
    }
 
}

EnvironmentPostProcessor 环境后置处理器

org.springframework.boot.env.EnvironmentPostProcessor=cn.telecom.starter.cloud.LoadProperties
public class LoadProperties implements EnvironmentPostProcessor {
 
    /**
     * 文件名
     */
    private static final String FILE_NAME = "test-starter-cloud.properties";
 
    /**
     * 版本锁
     */
    private static int version = 0;
 
 
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        // 通过版本号控制解决启动服务时加载两次的问题
        if (version++ == 0) {
            System.out.println("动态加载自定义配置:" + getClass().getName());
            MutablePropertySources sources = environment.getPropertySources();
            // 加载指定的配置文件(效率较高,但需要指定文件)
            loadPropertySource(sources, FILE_NAME);
        }
    }
 
    /**
     * 加载配置文件资源
     *
     * @param sources
     * @param file
     */
    private void loadPropertySource(MutablePropertySources sources, String file) {
        try {
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            InputStream is = classLoader.getResourceAsStream(file);
 
            if (is != null) {
                Properties properties = new Properties();
                properties.load(is);
                PropertiesPropertySource propertySource = new PropertiesPropertySource("dynamic", properties);
                sources.addLast(propertySource);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
}

作者声明

如有问题,欢迎指正!
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值