spring-beans 注册 Beans(一) 之问题场景复现
发布于: 2021 年 06 月 06 日
场景一:bean 定义冲突
ConflictingBeanDefinitionException
场景复现:
pom.xml 配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.4.1.RELEASE</version>
</dependency>
</dependencies>
复制代码
Java 代码:
#入口类
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
#Person类一
package com.mylg.study.bean.names.config;
@Configuration
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
#Person类二
package com.mylg.study.bean.names.repeat;
@Configuration
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
复制代码
运行结果如下:
2021-06-06 21:22:13.217 WARN 26192 --- [ main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.mylg.study.bean.names.Application]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'person' for bean class [com.mylg.study.bean.names.repeat.Person] conflicts with existing, non-compatible bean definition of same name and class [com.mylg.study.bean.names.config.Person]
2021-06-06 21:22:13.235 ERROR 26192 --- [ main] o.s.boot.SpringApplication : Application startup failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.mylg.study.bean.names.Application]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'person' for bean class [com.mylg.study.bean.names.repeat.Person] conflicts with existing, non-compatible bean definition of same name and class [com.mylg.study.bean.names.config.Person]
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:187) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:324) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:246) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:98) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:523) ~[spring-context-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) [spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371) [spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186) [spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175) [spring-boot-1.4.1.RELEASE.jar:1.4.1.RELEASE]
at com.mylg.study.bean.names.Application.main(Application.java:13)
复制代码
场景二:bean 找不到
DefaultListableBeanFactory Overriding bean definition for bean 'person' with a different definition
场景复现:
在场景一的基础上,删除上述的“Person 类二”代码,修改为如下代码。
package com.mylg.study.bean.names.repeat;
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//添加PersonFactory
package com.mylg.study.bean.names.repeat;
@Configuration
public class PersonFactory {
@Bean
public Person person() {
Person person = new Person();
person.setName("repeat");
return person;
}
}
//使用person
package com.mylg.study.bean.names.controller;
@RestController
public class PersonController {
@Autowired
private com.mylg.study.bean.names.config.Person config;
@Autowired
private com.mylg.study.bean.names.repeat.Person repeat;
@GetMapping("/config")
public String getConfig() {
return config.getName();
}
@GetMapping("/repeat")
public String getRepeat() {
return repeat.getName();
}
}
复制代码
运行结果是:
2021-06-06 21:24:01.544 INFO 26243 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'person' with a different definition: replacing [Generic bean: class [com.mylg.study.bean.names.config.Person]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [/Users/jiangqiaonan/opensource/github-my/spring-boot-study-1.4.1/bean-names/target/classes/com/mylg/study/bean/names/config/Person.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=personFactory; factoryMethodName=person; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/mylg/study/bean/names/repeat/PersonFactory.class]]
2021-06-06 21:24:02.119 WARN 26243 --- [ main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'personController': Unsatisfied dependency expressed through field 'config'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean found for dependency [com.mylg.study.bean.names.config.Person]: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
复制代码
综述:如果这两种场景你都知道是什么原因,本篇文章的后续就可以忽略了.
如果不知道,欢迎查看下文的分析过程。
后续系列文章:
spring-beans 注册Beans(一) 之问题场景复现
spring-beans 注册 Beans(二) springboot 启动流程
划线
评论
复制
发布于: 2021 年 06 月 06 日阅读数: 13
版权声明: 本文为 InfoQ 作者【梦倚栏杆】的原创文章。
原文链接:【http://xie.infoq.cn/article/30708cc22426d61418bdcd148】。文章转载请联系作者。
梦倚栏杆
关注
还未添加个人签名 2018.04.22 加入
还未添加个人简介
评论