Spring Boot应用引用Jar中@Bean方法带@Autowired启动报错的解决办法
解决第三方库@Bean方法带@Autowired导致Spring启动报错的方案
方案1:自定义BeanDefinitionRegistryPostProcessor清除注解
Spring允许在Bean定义注册阶段修改元数据,我们可以实现BeanDefinitionRegistryPostProcessor,定位到第三方配置类中存在问题的@Bean方法,移除其@Autowired注解:
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.beans.factory.support.ManagedMethod; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.stereotype.Component; import java.lang.reflect.Method; import java.util.Map; @Component public class FixThirdPartyConfigProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { // 遍历所有BeanDefinition,找到第三方的Test配置类 for (String beanName : registry.getBeanDefinitionNames()) { BeanDefinition beanDef = registry.getBeanDefinition(beanName); if ("com.example.demo.Test".equals(beanDef.getBeanClassName())) { // 获取配置类中所有@Bean方法的元数据 Map<String, BeanDefinitionHolder> beanMethods = (Map<String, BeanDefinitionHolder>) beanDef.getAttribute("org.springframework.context.annotation.ConfigurationClassPostProcessor.configurationClassBeanMethods"); if (beanMethods != null) { BeanDefinitionHolder someBeanHolder = beanMethods.get("someBean"); if (someBeanHolder != null) { BeanDefinition someBeanDef = someBeanHolder.getBeanDefinition(); // 获取目标方法对象 ManagedMethod managedMethod = (ManagedMethod) someBeanDef.getAttribute("org.springframework.beans.factory.support.ManagedMethod"); Method method = managedMethod.getMethod(); // 清除方法上的@Autowired注解 AnnotationUtils.clearAnnotation(method, org.springframework.beans.factory.annotation.Autowired.class); } } break; } } } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // 无需额外操作 } }
方案2:降级spring-beans版本到6.1.4
如果项目兼容性允许,直接调整依赖版本跳过Spring新增的校验逻辑:
- Maven项目(pom.xml):
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>6.1.4</version> </dependency>
- Gradle项目(build.gradle):
implementation 'org.springframework:spring-beans:6.1.4'
注意:调整版本前要确认Spring Boot或其他Spring组件与该版本的兼容性,避免出现依赖冲突。
方案3:排除第三方配置类,自行重写配置逻辑
先阻止Spring加载第三方的问题配置类,再自己实现相同的Bean创建逻辑:
步骤1:排除第三方配置类
在项目启动类上添加排除规则:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; @SpringBootApplication @ComponentScan(excludeFilters = @ComponentScan.Filter( type = FilterType.ASSIGNABLE_TYPE, classes = com.example.demo.Test.class )) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
步骤2:自行编写配置类
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CustomTestConfig { // @Bean方法的参数默认会自动注入,无需添加@Autowired @Bean SomeBean someBean(A a) { return new SomeBean("s"); } }
内容的提问来源于stack exchange,提问作者Vpal
相关产品推荐
相关产品推荐

