Spring Boot 2. 走向自动装配
走向自动装配
PDF 版本:
Spring Framework 手动装配
Spring 模式注解装配
定义: 一种用于声明在应用中扮演”组件”角色的注解
举例: @Component , @Service , @Configuration 等
装配: context:component-scan 或 @ComponentScan
模式注解(Stereotype Annotations)
A stereotype annotation is an annotation that is used to declare the role that a component plays within the application. For example, the
@Repository
annotation in the Spring Framework is a marker for any class that fulfills the role or stereotype of a repository (also known as Data Access Object or DAO).
@Component
is a generic stereotype for any Spring-managed component. Any component annotated with@Component
is a candidate for component scanning. Similarly, any component annotated with an annotation that is itself meta-annotated with@Component
is also a candidate for component scanning. For example,@Service
is meta-annotated with@Component
.Core Spring provides several stereotype annotations out of the box, including but not limited to:
@Component
,@Service
,@Repository
,@Controller
,@RestController
, and@Configuration
.@Repository
,@Service
, etc. are specializations of@Component
.
原型注释是用来声明组件在应用程序中扮演的角色的注释。例如,Spring 框架中的 @Repository
注释是满足存储库角色或构造型的任何类的标记(也称为数据访问对象或 DAO)。
@Component
是任何 spring 管理组件的通用原型。任何用 @Component
注解的组件都是组件扫描的候选组件。类似地,任何用注释注释的组件(其本身是用@Component
元注释的)也是组件扫描的候选对象。例如,@Service
是用 @Component
进行元注释的。
Core Spring 提供了几个开箱即用的原型注释,包括但不限于:@Component
、@Service
、@Repository
、@Controller
、@RestController
和@Configuration
。@Repository
, @Service
等是@Component
的专门化。
模式注解是一种用于 声明在应用中扮演’组件’角色的注解。如 Spring Framework 中的 @Repository
标注在任何类上, 用于扮演仓储角色的模式注解。
@Component
作为一种由 Spring 容器托管的通用模式组件,任何被 @Component
标准的组件均为组件扫描的候选对象。类似地,凡是被
@Component
元标注( meta-annotated )的注解,如 @Service
, 当任何组件标注它时,也被视作组件扫描的候选对象
模式注解举例
Spring Framework 注解 | 场景说明 | 起始版本 |
---|---|---|
@Repository |
数据仓储模式注解 | 2.0 |
@Component |
通用组件模式注解 | 2.5 |
@Service |
服务模式注解 | 2.5 |
@Controller |
Web 控制器模式注解 | 2.5 |
@Configuration |
配置类模式注解 | 3.0 |
装配方式
<context:component-scan>
方式
1 |
|
@ComponentScan
方式
1 |
|
自定义模式注解
@Component
“派生性”
1 |
|
@Component
@Repository
FirstLevelRepository
@Component
“层次性”
1 |
|
@Component
@Repository
FirstLevelRepository
SecondLevelRepository
Spring @Enable 模块装配
- 定义 : 具备相同领域的功能组件集合 , 组合所形成一个独立的单元 .
- 举例 : @EnableWebMvc , @EnableAutoConfiguration 等
- 实现 : 注解方式 , 编程方式
Spring Framework 3.1 开始支持”@Enable 模块驱动”。所谓”模块”是指具备相同领域的功能组件集合,
组合所形成一个独立的元。如 Web MVC 模块、Aspect 代理模块、Caching (缓存)模块、JMX (Java 管
理扩展)模块、Async (异步处理)模块等。
@Enable
注解模块举例
| 框架实现 | @Enable
注解模块 | 激活模块 |
| — | — | — |
| Spring Framework | @EnableWebMvc
| Web Mvc 模块 |
| | @EnableTransactionManagement
| 事务管理模块 |
| | @EnableCaching
| Caching 模块 |
| | @EnableMBeanExport
| JMX 模块 |
| | @EnableAsync
| 异步处理模块 |
| | @EnableWebFlux
| Web Flux 模块 |
| | @EnableAspectJAutoProxy
| AspectJ 代理模块 |
| | | |
| Spring Boot | @EnableAutoConfiguration
| 自动装配模块 |
| | @EnableManagementContext
| Actuator 管理模块 |
| | @EnableConfigurationProperties
| 配置属性绑定模块 |
| | @EnableOAuth2Sso
| OAuth2 单点登录模块 |
| | | |
| Spring Cloud | @EnableEurekaServer
| Eureka 服务器模块 |
| | @EnableConfigServer | 配置服务器模块 |
| | @EnableFeignClients | Feign 客户端模块 |
| | @EnableZuulProxy | 服务网关 Zuul 模块 |
| | @EnableCircuitBreaker | 服务熔断模块 |
实现方式
注解驱动方式
1 |
|
1 |
|
接口编程方式
1 |
|
1 |
|
自定义 @Enable
注解
基于注解驱动实现 - @EnableHelloWorld
TODO
基于接口驱动实现 - @EnableServer
HelloWorldImportSelector
->HelloWorldConfiguration
->helloWorld
Spring 条件装配
- Bean 装配的前置判断
- @Profile , @Conditional
- 注解方式 , 编程方式
从 Spring Framework 3.1 开始 , 允许在 Bean 装配时增加前置判断条件.
条件注解举例
Spring 注解 | 场景说明 | 起始版本 |
---|---|---|
@Profile | 配置化条件装配 | 3.1 |
@Conditional | 编程条件装配 | 4.0 |
实现方式
配置方式 - @Profile
编程方式 - @Conditional
1 |
|
自定义条件装配
基于配置方式实现 - @Profile
计算服务 , 多整数求和 sum
@Profile(“Java7”) : for 循环 实现
@Profile(“Java8”) : lambda 表达式 实现
基于编程方式实现 - @ConditionalOnSystemProperty
Spring Boot 自动装配
在 Spring Boot 场景下 , 基于约定大于配置的原则 , 实现 Spring 组件自动装配的目的 . 其中使用了
底层装配技术
- Spring 模式注解装配
- Spring
@Enable
模块装配 - Spring 条件装配
- Spring 工厂加载机制
- 实现类 :
SpringFactoriesLoader
- 配置资源 :
META-INF/spring.factories
- 实现类 :
自动装配举例
参考 META-INF/spring.factories
实现方式
- 激活自动装配 -
@EnableAutoConfiguration
- 实现自动装配 -
XXXAutoConfiguration
- 配置自动装配实现 -
META-INF/spring.factories
自定义自动装配
HelloWorldAutoConfiguration
- 条件判断 :
user.name == "josway"
- 模式注解 :
@Configuration
@Enable
模块 :@EnableHelloWorld
->HelloWorldImportSelector
->HelloWorldConfiguration
->helloWorld