SpringBoot 扩展机制 ——Spring.factories文件 如何将外部项目加入Spring容器

SpringBoot3.0新特性:1、spring.factories文件废弃,自动配置包位置变化 2、Spring Native 快速体验 3、jakata api迁移 3、三方库的支持 阅读详情

SpringBoot 扩展机制 ——Spring.factories文件 如何将外部项目加入Spring容器

▶ 简介

简单说用于模块之间解耦,外部项目下各种配置、类加入到Spring容器中进行管理,类似JAVA中SPI机制。机制自行百度。

▶ 方式

将外部类引入IOC容器两种方式
1.@import
2.加入Spring.factories文件 — 主讲这个

▶ Spring.factories文件

1.在resource目录下 META-INF/ Spring.factories 文件
2.格式:自定义需要扫描到类(接口),多个用 ”,\“ 隔开
3.SpringFactoriesLoader类会去扫描加载文件下定义类,加入容器
	org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  	com.mostsnails.common.base.utils.config.WebLogAutoConfiguration,\
  	com.mostsnails.common.base.utils.config.RedisAutoConfiguration,\
  	com.mostsnails.common.base.utils.test.TestClass
注意这里使用EnableAutoConfiguration ,SpringBoot启动类@SpringBootApplication注解包下有@EnableAutoConfiguration和@Component 具体作用开启自动装备,将满足条件@Configuration配置加入到SpringBoot中。
Spring.factories也可以包含其他类型
	# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
	....
可以去看项目下spring-boot-***-start jar包
外部项目下Redis配置类
/**
 * Redis配置
 *
 * @Author MostSnails
 * @Version 1.0
 */
@Configurable
public class RedisAutoConfiguration {
    private static org.slf4j.Logger log = LoggerFactory.getLogger(RedisAutoConfiguration.class);

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        // 创建RedisTemplate<String, Object>对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 配置连接工厂
        template.setConnectionFactory(factory);
        // 定义Jackson2JsonRedisSerializer序列化对象
        Jackson2JsonRedisSerializer<Object> jacksonSeial = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会报异常
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
                ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        jacksonSeial.setObjectMapper(om);
        StringRedisSerializer stringSerial = new StringRedisSerializer();
        // redis key 序列化方式使用stringSerial
        template.setKeySerializer(stringSerial);
        // redis value 序列化方式使用jackson
        template.setValueSerializer(jacksonSeial);
        // redis hash key 序列化方式使用stringSerial
        template.setHashKeySerializer(stringSerial);
        // redis hash value 序列化方式使用jackson
        template.setHashValueSerializer(jacksonSeial);
        template.afterPropertiesSet();
        return template;
    }

    /**
     * 配置redis默认缓存管理器
     * 可以设置多个 缓存管理器 @Primary 指定默认
     */
    @Bean
    public CacheManager cacheManager(RedisTemplate<String, Object> template) {
        RedisCacheConfiguration defaultCacheConfiguration =
                RedisCacheConfiguration
                        .defaultCacheConfig()
                        // 设置key为String
                      .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(template.getStringSerializer()))
                        // 设置value 为自动转Json的Object
                        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(template.getValueSerializer()))
                        // 不缓存null
                        .disableCachingNullValues()
                        // 缓存数据保存1小时
                        .entryTtl(Duration.ofHours(1));
        RedisCacheManager redisCacheManager =
                RedisCacheManager.RedisCacheManagerBuilder
                        // Redis 连接工厂
                        .fromConnectionFactory(template.getConnectionFactory())
                        // 缓存配置
                        .cacheDefaults(defaultCacheConfiguration)
                        // 配置同步修改或删除 put/evict
                        .transactionAware()
                        .build();
        return redisCacheManager;
    }

    @Bean
    public RedisUtils redisUtils(StringRedisTemplate stringRedisTemplate) {
        log.info("Redis工具类.....Start");
        return new RedisUtils(stringRedisTemplate);
    }
}

Factories文件配置图

加载机制

Redis配置类

▶ 延伸扩展 — 选择性加载@Conditional 和 @ConditionalOn***

在一些自动装配配置类中 出现过 @ConditionalOn***,@EnableAutoConfiguration会在满足条件情况下加入IOC容器
/**
 * Web日志加入Spring容器
 *
 * @Author MostSnails
 * @Version 1.0
 */
public class WebLogAutoConfiguration {
    private static org.slf4j.Logger log = LoggerFactory.getLogger(WebLogAutoConfiguration.class);

    public WebLogAutoConfiguration() {
        log.info("Web日志记录配置类.....Start");
    }

    @Bean
    @ConditionalOnWebApplication//当项目是一个Web项目时进行实例化
    @ConditionalOnMissingBean(WebLogAspect.class)//当容器里没有指定Bean的条件下进行实例化。
    public WebLogAspect webLogAspect() {
        log.info("注入webLogAspect类.....");
        return new WebLogAspect();
    }
}

▶ 更多@Conditional 注解

@ConditionalOnBean:		仅仅在当前上下文中存在某个对象时,才会实例化一个Bean。
@ConditionalOnClass:	某个class位于类路径上,才会实例化一个Bean。
@ConditionalOnExpression:当表达式为true的时候,才会实例化一个Bean。
@ConditionalOnMissingBean:仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean。
@ConditionalOnMissingClass:某个class类路径上不存在的时候,才会实例化一个Bean。
@ConditionalOnNotWebApplication:不是web应用,才会实例化一个Bean。
@ConditionalOnBean:		当容器中有指定Bean的条件下进行实例化。
@ConditionalOnMissingBean:当容器里没有指定Bean的条件下进行实例化。
@ConditionalOnClass:	当classpath类路径下有指定类的条件下进行实例化。
@ConditionalOnMissingClass:当类路径下没有指定类的条件下进行实例化。
@ConditionalOnWebApplication:当项目是一个Web项目时进行实例化。
@ConditionalOnNotWebApplication:当项目不是一个Web项目时进行实例化。
@ConditionalOnProperty:	当指定的属性有指定的值时进行实例化。
@ConditionalOnExpression:	基于SpEL表达式的条件判断。
@ConditionalOnJava:	当JVM版本为指定的版本范围时触发实例化。
@ConditionalOnResource:	当类路径下有指定的资源时触发实例化。
@ConditionalOnJndi:	在JNDI存在的条件下触发实例化。
@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化。

SpringBoot启动

▶ 如何使用IOC容器对象

1.@Autowired 2.ApplicationContext
@RunWith(SpringRunner.class)
@SpringBootTest(classes = WebDemoApplication.class)
public class JunitTest {
//    @Autowired
//    private TestClass testClass;

    @Test
    public void customYAMLTest(){
        TestClass bean = BeanFactoryUtil.getBean(TestClass.class);
        System.out.println(JSON.toJSONString(bean));
    }
}
BeanFactoryUtil
/**
 * Spring 上下文 获取
 *
 * @Author MostSnails
 * @Version 1.0
 */
public class BeanFactoryUtil {
    private static ApplicationContext context;

    public static void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (context == null){
            context = applicationContext;
        }
    }
    // 获取applicationContext
    private static ApplicationContext getApplicationContext() {
        return context;
    }

    // 通过name获取Bean
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    // 通过class获取Bean
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    // 通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

运行结果

SpringBoot中spring.factories在哪里被加载的 Spring 自 3.2 引入 spring.factories SPI 后并没有真正的利用起来,使用的地方比较少,然而真正把 spring.factories 发扬光大的是在 Spring Boot 中 那在springboot中,spring.factories什么时候被加载的呢,里面的类又是什么时候被实例化的呢?从一个普通的springboot项目的main方法进去 就是这里,一个读取里面的类全限定性类名,然后进行实例化。 循环遍历,逐一初始化,用的是java的反射机制反射, forName.. 阅读详情

相关推荐

Spring的Factories机制介绍

在看本节文章之前,建议大家先去了一下java的SPI机制,因为Spring的Factories就是Spring版本的Java Spi,我在关于java基础系列文章中有详细介绍Java SPI机制。 Spring Factories的最重要的功能就是:可以通过配置文件指定Spring容器加载一些特定的组件。 基本概念 什么是Spring Factories Spring Factories是一种类似于Java SPI的机制,它在META-INF/spring.factories文件中配置接口的实现类名称,然

小明的博客 7519

spring.factories文件在Spring工程中的说明

自动配置状态bean通过spring机制

多头注意力探索Now 1932

springboot核心基础之spring.factories机制

SPI 的全名为 Service Provider Interface.大多数开发人员可能不熟悉,因为这个是是针对厂商或者插件的。在java.util.ServiceLoader 的文档里有比较详细的介绍。简单总结下Java SPI机制的思想。我们系统里抽象的各个模块,往往有很多不同的实现方案,比如 日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。

Cr1556648487的博客 1283

spring.factories介绍

例如,假设有一个接口 com.example.MyInterface,它有两个实现类 com.example.MyInterfaceImpl1 和 com.example.MyInterfaceImpl2。通过 spring.factories 文件,开发者可以将自己的组件注册到 Spring 容器中,使其能够被其他组件自动发现和使用。总之,spring.factories 文件是 Spring Framework 中一种用于自动装配和加载组件的配置文件,通过它可以方便地注册和管理各种组件的实现类。

还在活水泥的未来包工头 1276

springboot - spring.factories

具体来说,当我们需要自定义 Spring Boot 应用程序的自动配置时,只需要创建一个标注有 @Configuration 注解的类,再在其中定义需要自动配置的 Bean,然后将该类的全限定名添加到 META-INF/spring.factories 文件中的 org.springframework.boot.autoconfigure.EnableAutoConfiguration 配置项中,就可以实现自动配置了。那就是这样的咯:需要的配置类与启动类不在同一包路径下。2、自定义自动配置类。

学无止境 1299

支付漏洞防护绕过的一种方式

放完包后就到了提交订单的地方,可以发现,金额确实小了很多,合理的搭配的话还可以更低,再次前进可以发现,金额确实是这么多,后面就不支付了,到此就结束了。也就是说数量可以为负数,但是金额不能为0或者0以下,有什么方法可以绕过这个限制吗,其实并不难,既然可以为负数,只是对金额不能为0或者负数做了限制。我们可以尝试拼接法,利用负数加上正数让他的值变得很低,但是又大于0就可以了,这里利用购物车的结算方法,随机加一些在购物车里。这里为了方便查看数据包,我这边商品的数量选择3,点击立即购买并抓包。

2301_80115097的博客 1529

SpringBoot扩展机制——spring factories

为什么要写spring.factories文件? 自动装配原理

散落的博客 2919

Mac终端SSH连接腾讯云服务器保姆级教程(附秘钥管理技巧)

本文提供Mac终端SSH连接腾讯云服务器的详细教程,涵盖密钥生成、权限设置、连接优化及高级管理技巧。通过清晰的步骤和实用配置,帮助用户安全高效地管理远程服务器连接,特别适合开发者和运维人员参考。

weixin_29248313的博客 456

Spring.factories

1.概述 在 Spring Boot 项目中,怎样将 pom.xml 文件里面添加的依赖中的 bean 注册到 Spring Boot 项目的 Spring 容器中呢? 你可能会首先想到使用@ComponentScan 注解,遗憾的是 @ComponentScan 注解只能扫描 Spring Boot 项目包内的 bean 并注册到 Spring 容器中,项目依赖包中的 bean 不会被扫描和注册。此时,我们需要使用 @EnableAutoConfiguration 注解来注册项目依赖包中的 ...

weixin_38972910的博客 1万+

空间数据库(1):Arcgis10.2连接PostgreSQL9.1,创建空间数据库,导入空间数据

1、arcgis的安装对于gis人员来说想必并不陌生,此处就不赘述了。那么就先从PostgreSQL说吧,我这里用的是跟Arcgis desktop 10.2所支持的9.1或者9.2版本,大家也可以用相对应的更高的版本来配置,注意的是版本一定要相互匹配,不仅是Arcgis与PostgreSQL的匹配,还有PostgreSQL与PostGIS匹配。 按道理desktop是32位的,应该用PostgreSQL的32位,但是我实在找不到32位的PostGIS9.1,所以就用64位的吧,后面配置部分可能需

XIAOHUA的博客 1317

告别TI官网迷路!手把手教你用C2000Ware为TMS320F28027搭建Proteus仿真工程模板

本文详细指导如何使用C2000Ware为TMS320F28027搭建Proteus仿真工程模板,帮助DSP开发者快速上手。从资源获取、工程目录设计到关键文件配置,再到CCS与Proteus的联调技巧,全面解析仿真工程搭建的每个步骤,特别适合初学者和工程师参考。

weixin_42715608的博客 473

springboot自动配置原理以及spring.factories文件的作用详解

也就是说我们可以在自己的 jar 中配置 spring.factories 文件,不会影响到其它地方的配置,也不会被别人的配置覆盖。以上内容是springboot获得这些类的方式,如果你想要实现自己的自动配置,就将你的类通过键值对的方式写在你的spring.factories即可,注意,值是你的自动配置类,键必须是org.springframework.boot.autoconfigure.EnableAutoConfiguration。这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的。

xiaocai 3152

Windows下QT5.15.2安装MQTT模块全攻略(附分支选择避坑指南)

本文详细介绍了在Windows环境下为QT5.15.2安装MQTT模块的完整流程,包括环境准备、源码获取、编译配置及项目集成等关键步骤。特别针对分支选择、依赖项处理和常见错误提供了实用解决方案,帮助开发者高效完成MQTT模块的安装与调试,适用于物联网开发场景。

weixin_29224589的博客 466

小明学Spring基础系列——Spring Factories机制

Spring Factories是一种类似于Java SPI的机制,它在META-INF/spring.factories文件中配置接口的实现类名称,然后在程序中读取这些配置文件并实例化。

小明的博客 1325

散户渡劫指南:从炼气期到化神期的量化之路

经常有人问我普通人怎么学习量化交易,我就在想怎么学了量化就不是普通人了吗,可能他的意思是类比修仙,量化素人如何修炼进阶,今天就将量化学习每个阶段均对标修仙境界的核心能力与心法要诀一一介绍,助你从“交易凡人”蜕变为“量化金仙”。

木头大左的博客 1338

3D视觉实战之双目相机物体尺寸实时测量

视差图滤波能够将稀疏视差转变为稠密视差,并在一定程度上降低视差图噪声,改善视差图的视觉效果,但是比较依赖初始视差图的质量。的目标是获得左右两个相机的内参、外参和畸变系数,其中内参包括左右相机的fx,fy,cx,cy,外参包括左相机相对于右相机的旋转矩阵和平移向量,畸变系数包括径向畸变系数(k1, k2,k3)和切向畸变系数(p1,p2)以及其他一些畸变类型。:相比于昂贵的专业设备,便宜的双目摄像头可以显著降低成本,使得实时点云生成技术更加普及和经济实惠。

qq_53545309的博客 2100

《SpringBoot启动流程一》:万字debug梳理SpringBoot如何加载并处理META-INF/spring.factories文件中的信息

1、SpringBoot如何加载并处理spring.factories中的文件? 2、加载出的spring.factories文件中的内容如何排序? 3、多个spring.factories文件内容重复怎么处理?

健身变秃,coding变强 4579

c#【保姆级教程】基于System.Text.Json 支持多态类型序列化! 手把手教你实现一个通用的 PolymorphicJsonConverter!

我们需要自己实现一个继承自的转换器,在序列化时记录具体类型,在反序列化时根据类型标识还原成正确的子类对象。public abstract class WorkStepBase { /* 抽象方法等 */ }public class Person : WorkStepBase { /* 实现 */ }public class Product : WorkStepBase { /* 实现 */ }特性说明✅ 自动发现子类无需手动维护类型列表,自动扫描程序集✅ 类名映射。

一个编程的同学 425

Spring Boot spring.factories文件详细说明

spring.factories 文件是 Spring Boot 自动配置机制的核心部分之一。它位于每个 Spring Boot 自动配置模块的 META-INF 目录下,用于声明该模块提供的自动配置类、条件性配置类、环境后处理器等。以下是对 spring.factories 文件的详细说明:相信大家的项目中都会写starter,我们团队写的国际化通用和通用聚合服务等即插即用的功能包,就是用的starter。

m0_74825360的博客 767

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

下一篇: MySQL主从同步复制实现
MostSnails
博客等级 码龄5年 17粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值