2. SPI应用之spring boot自动装配

一、spring boot自动装配是什么意思

spring boot是在spring框架之上的框架,目的就是简化配置,无xml配置,只需要添加一个@SpringBootApplication注解,即可实现一个项目的启动,内部包含了tomcat容器、spring webmvc等所有依赖bean的注入,这些都是靠自动装配来完成的。

先来看下@SpringBootApplication到底是个啥玩意:


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

这里面有2个很重要的注解:

@EnableAutoConfiguration

开启spring boot的自动装配,本质上就是通过@Import注解选择注入bean【这是重点】

@ComponentScan

等同于xml中的配置context:componentScan
定义扫描的类,默认情况下为所在类所定义扫描的包名,包括本级包及子包。
这也是为什么当将spring boot启动类放置在src/main/java下,启动会报错的原因,
当放置在空包下时,默认会扫描所有的包。

二、装配核心:@EnableAutoConfiguration

这个注解有两大特殊之处:

2-1 可以根据条件决定是否需要注入对应的bean

比如:当应用不需要连接redis时,我们就不会引入redis的maven依赖,此时就不会去加载RedisAutoConfiguration类,就不会引发NoClassDefException的异常啦。而当我们需要连接redis时,则只需要在yml中配置redis参数就可以使用了。是不是很方便…
这个强大的功能主要是使用了ImportSelector可以选择注入的特性 和 @Conditional注解的条件注入特性

① ImportSelector

来看下ImportSelector的接口定义:
2. SPI应用之spring boot自动装配_第1张图片

请求参数就是注解的元数据信息,可以从中获取到使用了注解的类,已经设置的属性值。
返回参数就是需要注入的bean。
EnableAutoConfiguration类就是实现了ImportSelector接口,实现了选择注入bean的功能。那这些 bean从哪里来呢,其实就是SPI,在下面《自定义扩展》我们会讲到…

② @Conditional

EnableAutoConfiguration注入的条件支持使用注解配置和文件配置两种方式

①注解定义

@Conditional注解可以配置在一定条件时,才会去加载bean。
常见的conditional注解有:
@ConditionalOnBean :当给定的class类型或者Bean的名字存在时,才加载bean
@ConditionalOnClass:当给定的class类型中存在时,才加载bean
@ConditionalOnExpression : 当给定springEL表达式的值返回true时,才加载bean
等等… 其他可以到spring-boot的jar包中去查看

举例:
2. SPI应用之spring boot自动装配_第2张图片

②文件定义
@EnableAutuConfiguration相关的类也支持在META-INF/spring-autoconfigure-metadata.properties文件中定义条件
2. SPI应用之spring boot自动装配_第3张图片

2-2 支持自定义扩展

当我们自己的类也想和spring boot结合使用时,可以将自定义的Configuration类交由EnableAutoConfiguration来管理。具体怎么植入的,就是SPI…
只需要定义好Configuration类,然后将插件定义放入到META-INF下的spring.factories文件中,就可以被spring boot扫描到。

举例:
比如dubbo也想通过spring boot方便快捷的集成,那dubbo就提供了一个Configuration类,来完成dubbo的初始化:
2. SPI应用之spring boot自动装配_第4张图片

具体可以查看github上dubbo源代码:
https://github.com/apache/dubbo-spring-boot-project/blob/master/dubbo-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories

三、总结

使用一张代码调用图,来完整的看下EnableAutoConfiguration类的代码
2. SPI应用之spring boot自动装配_第5张图片

你可能感兴趣的:(spring,boot)