Springboot中SPI机制及自动装配

现在项目框架原型上基本上都是springboot上扩展,这里应该说是spring的spi机制。

Spring作为java web开发必备组件,其设计思想在其他开发中很多借鉴。
其中spi机制是整合各组件,包括各种starter的核心功能。

1、概念:
SPI(Service Provider Interface)服务提供接口,简单来说就是用来解耦,实现插件的自由插拔,加载classpath下所有META-INF/services/目录下的对应给定接口包路径的文件,
然后通过反射实例化配置的所有实现类,以此将接口定义和逻辑实现分离)这里面涉及到了各种配置注解。

2:机制

当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。通过这个约定,就不需要把服务放在代码中了,通过模块被装配的时候就可以发现服务类了

3:用途
数据库DriverManager、Spring、ConfigurableBeanFactory等都用到了SPI机制,比如数据库DriverManager,DriverManager是jdbc里管理和注册不同数据库driver的工具类。
针对一个数据库,可能会存在着不同的数据库驱动实现。我们在使用特定的驱动实现时,不希望修改现有的代码,而希望通过一个简单的配置就可以达到效果。
在使用mysql驱动的时候,会有一个疑问,DriverManager是怎么获得某确定驱动类的?我们在运用Class.forName(“com.mysql.jdbc.Driver”)加载mysql驱动后,
就会执行其中的静态代码把driver注册到DriverManager中以便后续的使用。基本所有连接池框架加载都一样。

starter包中spring.factories配置了EnableAutoConfiguration类型的那些个类,无论用的注解是@Component、@Configuration,然后生成了spring bean注入到了上下文里。从META-INF/spring.factories文件里读取配置的自动装配Bean。

springboot项目有很多专一功能的starter组件,命名都是spring-boot-starter-xx,如spring-boot-starter-logging,spring-boot-starter-web,如果是第三方的starter命名一般是:xx-springboot-starter,比如mybatis-spring-boot-starter。

自动装配主要注解:
@Configuration 用于声明定义bean 熟悉spring的应该都明白 这也是springboot自动装配关键的注解之一 其实就是平常Spring配置文件中我们写的bean
@EnableAutoConfiguration 用来开启springboot自动配置的注解 ,这个也是自动装配中很重要的注解
@ConfigurationProperties 用来读取配置文件 并封装成实体类
@EnableConfigurationProperties 这个一般要配合@ConfigurationProperties使用 可以使@ConfigurationProperties封装成的实体类成功注入(前提是@ConfigurationProperties的实体类没有被@Component注解)

Spring Boot在启动的时候就是从类路径下的META-INF/spring.factories中获取需要自动装配的类,找到这些类(AutoConfiguration),
通过SpringFactoriesLoader机制创建对应的bean,注入到容器中,完成了自动注入spring容器,也就是springboot完成了自动装配。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值