spring boot EnableAutoConfiguration exclude 无效

本文详细解析了Spring Boot应用中的核心注解@SpringBootApplication的功能与用法,并介绍了如何正确配置以避免冲突,提供了具体的解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先讲一下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 {

所以这一个注解就相当于配置了EnableAutoConfiguration
如果在自己的项目里 SpringBootApplication 和 EnableAutoConfiguration 都配置了 就会有问题。这个是我最开始的理解
但是试了一下 把SpringBootApplication去掉 然后改成如下的形式 还是不行

// @SpringBootApplication
@EnableTransactionManagement // 开启注解式事务 , DataSourceTransactionManagerAutoConfiguration.class
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
@Configuration
@ComponentScan(includeFilters={}, excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes =  AutoConfigurationExcludeFilter.class)})
// @ComponentScan
// @Configuration //这是一个配置类,与@Service、@Component的效果类似。spring会扫描到这个类,@Bean才会生效,将ThreadPoolBean这个返回值类注册到spring上下文环境中
// @EnableConfigurationProperties(MyWebServerConfigurationProperties.class) //通过这个注解, 将MyWebServerConfigurationProperties这个类的配置到上下文环境中,本类中使用的@Autowired注解注入才能生效
public class  XxxApplication extends BaseApplication {

网上查资料 最终的解决办法如下

spring:
  application:
    name: coffee
  autoconfigure.exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
 

具体原因还没找到,先记录一下 ,以后在查找原因

<think>嗯,用户之前问了本地缓存和全局缓存的区别,现在又转向了Spring Boot的装配原理。看来他们可能是在学习Spring Boot,或者在做相关项目,需要深入理解其内部机制。之前的回答结构很清晰,用户可能希望同样详细的解答,所以得保持类似的格式。 首先,用户问的是Spring Boot的装配原理,应该包括自动配置、条件注解、starter机制这些核心点。需要先明确用户的基础,可能他们已经有Spring的基础,但需要更深入的理解。得从基础概念讲起,再分点详细说明。 记得用户可能需要知道Spring Boot如何简化配置,自动配置是怎么工作的,以及starter的作用。同时,用户可能对背后的原理感兴趣,比如@SpringBootApplication注解背后的机制,SpringFactoriesLoader的使用,条件注解如何起作用,还有可能想了解自动配置的执行流程。 还要考虑用户的实际应用场景,比如他们可能在开发中遇到配置问题,或者想要自定义starter,这时候了解原理会有帮助。需要举一些例子,比如用代码片段说明自动配置类,或者starter的结构,这样更直观。 另外,用户之前的问题对比了本地和全局缓存,可能他们现在的问题也是想比较传统SpringSpring Boot的配置方式,所以可以适当提到传统Spring需要手动配置,而Spring Boot通过自动配置减少工作量。 需要避免过于技术化的术语,但也要准确。比如解释@ConditionalOnClass这样的条件注解时,要说明它的作用,以及为什么重要。同时,注意结构清晰,分点列出,便于阅读。 可能用户还会想知道如何排除自动配置,或者自定义配置,所以应该在回答中涵盖这些内容,比如使用exclude属性,或者如何编写自己的自动配置类。 最后,总结部分需要强调Spring Boot如何通过约定大于配置和自动装配简化开发,这样用户能有一个整体的理解。可能用户需要这些知识来优化他们的项目配置,或者解决一些依赖问题,所以实际应用建议也很重要。 检查一下是否有遗漏的关键点,比如SPI机制、Spring Boot启动流程中的自动配置触发时机,还有组合注解的使用。确保每个部分都逻辑连贯,例子恰当,帮助用户从理论到实践全面理解装配原理。</think>--- ### Spring Boot 装配原理核心解析 Spring Boot 的自动装配(Auto-Configuration)是其简化开发的核心机制,通过**约定大于配置**的理念,自动加载所需的 Bean 和组件。以下是其核心原理与实现逻辑: --- #### 1. **核心注解:`@SpringBootApplication`** ```java @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` - **组合注解**:实际包含三个关键注解: - `@SpringBootConfiguration`:标记当前类为配置类(等价于 `@Configuration`)。 - `@EnableAutoConfiguration`:**启用自动装配**的核心注解。 - `@ComponentScan`:扫描当前包及其子包下的组件(如 `@Component`、`@Service`)。 --- #### 2. **自动装配触发机制** **关键流程**: 1. **启动类加载**:通过 `SpringApplication.run()` 启动应用。 2. **`@EnableAutoConfiguration` 生效**:触发 Spring Boot 的自动配置逻辑。 3. **加载 `META-INF/spring.factories`**:扫描所有依赖 JAR 中的该文件,获取预定义的**自动配置类**。 **示例(spring-boot-autoconfigure 中的 `spring.factories` 片段)**: ```properties # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ ... ``` --- #### 3. **条件装配(Conditional Loading)** Spring Boot 通过 `@Conditional` 系列注解**按需加载配置**,避免无效 Bean 的注入。 | **常用条件注解** | **触发条件** | |----------------------------|------------------------------------------| | `@ConditionalOnClass` | 类路径中存在指定类时生效(如存在 `DataSource.class` 才加载数据源配置) | | `@ConditionalOnMissingBean` | 容器中不存在指定 Bean 时生效(允许用户自定义 Bean 覆盖默认配置) | | `@ConditionalOnProperty` | 配置文件中存在指定属性时生效(如 `spring.datasource.url`) | **示例(`DataSourceAutoConfiguration` 片段)**: ```java @Configuration @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @EnableConfigurationProperties(DataSourceProperties.class) public class DataSourceAutoConfiguration { // 根据条件创建 DataSource Bean } ``` --- #### 4. **自动配置类的执行逻辑** 1. **加载配置类**:根据 `spring.factories` 中的配置类列表,按顺序加载。 2. **条件检查**:通过 `@Conditional` 注解过滤出符合条件的配置类。 3. **注册 Bean**:在符合条件的配置类中,通过 `@Bean` 方法向容器注册组件。 **示例(简化版 `DispatcherServletAutoConfiguration`)**: ```java @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @Configuration @ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass(DispatcherServlet.class) @AutoConfigureAfter(ServletWebServerFactoryAutoConfiguration.class) public class DispatcherServletAutoConfiguration { @Bean public DispatcherServlet dispatcherServlet() { return new DispatcherServlet(); } // 其他相关 Bean 的配置 } ``` --- #### 5. **Starter 机制** **Starter 的作用**:通过依赖传递,自动引入一组关联的库和配置。 | **Starter 名称** | **功能** | |---------------------------|----------------------------| | `spring-boot-starter-web` | 引入 Spring MVC、Tomcat 等 Web 相关依赖 | | `spring-boot-starter-data-jpa` | 引入 JPA、Hibernate 等数据库依赖 | **原理**: - 每个 Starter 包含一个 `spring.factories` 文件,定义其提供的自动配置类。 - 依赖 Starter 后,Spring Boot 自动合并所有 `spring.factories` 中的配置类。 --- #### 6. **自定义自动配置** **步骤**: 1. 创建配置类,使用 `@Configuration` 和 `@Conditional` 注解。 2. 在 `src/main/resources/META-INF/spring.factories` 中声明配置类: ```properties org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.MyCustomAutoConfiguration ``` 3. 打包为 JAR,供其他项目依赖使用。 **示例(自定义 Redis 配置)**: ```java @Configuration @ConditionalOnClass(RedisConnectionFactory.class) @EnableConfigurationProperties(RedisProperties.class) public class MyRedisAutoConfiguration { @Bean @ConditionalOnMissingBean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); return template; } } ``` --- ### 关键总结 | **机制** | **作用** | |---------------------|--------------------------------------| | `@EnableAutoConfiguration` | 触发自动配置流程,加载所有符合条件的配置类 | | `spring.factories` | 定义自动配置类的注册入口 | | 条件注解(`@ConditionalOnXxx`) | 按需加载配置,避免冗余 Bean 的注入 | | Starter | 通过依赖管理简化库的集成,实现“开箱即用” | --- ### 调试与排除自动配置 1. **查看生效的自动配置类**: 启动时添加 `--debug` 参数,控制台会输出: - `Positive matches`(已生效的配置类)。 - `Negative matches`(未生效的配置类及原因)。 2. **排除特定自动配置**: ```java @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class MyApplication { ... } ``` --- ### 实际应用建议 1. **优先使用默认配置**:Spring Boot 的自动配置已覆盖大多数常见场景。 2. **谨慎覆盖默认 Bean**:通过 `@ConditionalOnMissingBean` 实现自定义扩展。 3. **理解条件注解逻辑**:避免因依赖缺失导致配置不生效。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值