自动装配
spring boot的自动装配(auto configuration)是通过spring framework的依赖注入(dependency injection, DI)和配置类的组合来实现的。 spring boot 的自动装配机制可以简化应用的配置过程,是开发者不再需要手动创建配置文件或管理bean. 而是通过注解和配置类自动完成。
- springboot 自动装配的原理
- 依赖注入的核心注解
- 自动配置类的加载机制
- @SpringBootApplication注解详解
- 自定义配置和自动配置的关系
- 常见的自动装配场景
- 总结
springboot自动装配的原理:
springboot的自动装配是基于以下几个核心机制实现的:
@SpringBootApplication: 它是一个组合注解,包含了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan.
- @SpringBootConfiguration: 主要是声明该类是一个配置类,这是Springboot专用的配置声明类
- @EnableAutoConfiguration: 启动springboot 自动配置机制的核心注解,它会根据类路径下的依赖来自动装配Spring应用程序。
- @ComponentScan: 扫码@Component @Service @Repository @Controller等标注的类,使得这些bean自动注册到spring容器中。如果没有配置路径或者类。直接扫描该类所在包及其子包中的组件。
- spring.factories: SpringBoot 使用spring-boot-autoconfigure中的META-INFO/spring.factories文件来管理自动装配的的类。spring.factories文件中列出的所有的自动配置类,这些类在启动时都会被加载并注册
依赖注入的核心注解:
SpringBoot 依赖于springFramework 的依赖注入机制,通过注解实现Bean的自动装配。主要注解有:
- @Autowired: 可以注入构造方法、字段、Setter方法。 Spring会根据类型在容器中查找匹配的Bean并注入
- @Component、@Service、@Repository、@Controller标识类为spring管理的Bean. 其中@Component是通用的注解, 而@Service、@Repository、@Controller是它的变种,分别用于业务逻辑层、数据访问层、控制层
- @Configuration: 表示一个配置类,可以定义@Bean方法,将返回的bean注册到Spring容器中。
@Configuration public class MyConfiguration{ @Bean public MyService myService(){ return new MyService(); } }
自动配置类的加载机制
-
Spring Boot通过@EnableAutoConfiguration启动自动配置机制,他会扫描spring.factories文件中配置的自动配置类,并通过条件注解(如@ConditionalOnClass @ConditionalOnMissingBean)决定是否加载这些配置类。
-
条件注解: 自动配置类中使用条件注解来控制配置的生效,常见的条件注解有:
-
@ConditionalOnClass: 当类路径下存在指定的类时,配置才会生效。
-
@ConditionalOnMissingClass: 当Spring容器中没有指定类型的bean时,才会创建Bean.
-
@ConditionalOnProperty: 当配置文件中存在特定的属性时,配置才会生效。
例如,Spring Boot 提供的 DataSource
自动配置类 DataSourceAutoConfiguration
:
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSource dataSource(DataSourceProperties properties) {
// 创建 DataSource Bean
}
}
当项目中引入了数据库依赖(如 HikariCP
),DataSourceAutoConfiguration
会自动配置一个 DataSource
对象。
@SpringBootApplication
注解详解
@SpringBootApplication
是一个组合注解,通常放在主启动类上:
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
其中包含了:
@SpringBootConfiguration
:等价于@Configuration
,标识该类为配置类。@EnableAutoConfiguration
:启用 Spring Boot 的自动配置机制。@ComponentScan
:扫描该类所在包及其子包中的@Component
、@Service
、@Repository
等注解。
自定义配置和自动配置的关系
在使用自动装配时,可以通过手动定义的 @Bean
、@Configuration
优先覆盖自动配置类中的默认配置。例如,自定义一个 DataSource
:
@Configuration
public class CustomDataSourceConfig {
@Bean
public DataSource customDataSource() {
return new HikariDataSource();
}
}
这样,即使自动配置类中也定义了 DataSource
,但由于 @ConditionalOnMissingBean
的存在,自定义的 DataSource
会优先被加载。
定制自动配置:可以通过以下几种方式定制 Spring Boot 的自动配置:
@ConditionalOnProperty
:通过属性控制自动配置的启用或禁用。例如,通过设置spring.datasource.enabled=false
可以禁用数据源的自动配置。- 自定义
@Configuration
类:可以通过编写自定义的@Configuration
类来覆盖默认的自动配置。 @Import
:可以手动导入一些自动配置类来精确控制自动配置的内容。
常见的自动装配场景
- 数据库配置:通过引入
spring-boot-starter-data-jpa
或spring-boot-starter-jdbc
,Spring Boot 自动配置数据源、JPA 实体管理等。 - Web 框架配置:引入
spring-boot-starter-web
,Spring Boot 会自动配置DispatcherServlet
、Jackson
JSON 解析器等。 - 消息队列配置:引入
spring-boot-starter-amqp
,自动配置 RabbitMQ 连接工厂、模板和监听器容器。
总结
Spring Boot 的自动装配极大地简化了 Spring 应用的开发:
- 减少配置文件:开发者不需要在
XML
或 Java 配置类中显式配置每个组件,Spring Boot 会根据类路径中的依赖自动加载相应的配置。 - 减少样板代码:在传统的 Spring 应用中,我们可能需要编写很多
@Configuration
类来设置数据源、事务管理器、视图解析器、消息转换器等。但在 Spring Boot 中,大部分常见的配置都是自动配置好的,开发者只需要关注业务逻辑。例如,若要使用 Spring MVC,传统 Spring 需要配置 DispatcherServlet 和 ViewResolver 等,但在 Spring Boot 中,只需要在类路径中添加spring-boot-starter-web
依赖即可,Spring Boot 会自动配置这些组件。 - 按需加载:通过条件注解和
spring.factories
文件,Spring Boot 只加载需要的配置。 - 可扩展性强:可以通过自定义配置或修改
application.properties
文件中的属性,灵活调整自动配置的行为。
转载自CSDN-专业IT技术社区
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。