在Spring启动时会帮我们自动装配一些组件,依赖注入,此时如果项目中自己定义的类名有相同的,或者自己定义的类名与引入的第三方包有相同的,就会引发冲突,原因是Spring在帮我们管理这些Bean时不知道使用的到底是哪一个,就会在启动时报错
常见异常:
Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException
Action:
Consider renaming one of the beans or enabling overriding by setting
… …
解决
方式一:
注入时在类上指定名称,如:@Service(value = “testExcludeClass”),再按名称进行注入
@Autowired
@Qualifier(name = "testExcludeClass")
private TestExcludeClass testExcludeClass;
@Resource(name = "testExcludeClass")
private TestExcludeClass testExcludeClass;
方式二:
在配置类的方法上使用@Bean和@Primary,指定优先使用该Bean注入,注意在主启动类配置@ComponentScan注解,指明扫描哪些包或类
@Configuration
public class Config {
@Bean
@Primary
public DataSourceProxy dataSourceProxy(DruidDataSource dataSource) {
return new DataSourceProxy(dataSource);
}
}
// 扫描包
@ComponentScan(basePackages = {"com.bwone.demo"})
// 扫描类
@ComponentScan(basePackageClasses= {com.bwone.demo.Config.class})
方式三:
在主启动类的@SpringBootApplication注解上使用exclude属性,指明启动时自动装配排除哪些包或类
@SpringBootApplication(exclude = "com.bwone.demo.TestExcludeClass")
方式四:
YML配置文件设置属性
spring:
# 后发现的bean会覆盖先发现的bean
main:
allow-bean-definition-overriding: true
方式五:
可能由于Jar包冲突导致,检查是否引入相同的Jar包