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 代码:
#入口类@SpringBootApplicationpublic 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; }}
//添加PersonFactorypackage com.mylg.study.bean.names.repeat;@Configurationpublic class PersonFactory { @Bean public Person person() { Person person = new Person(); person.setName("repeat"); return person; }}
//使用personpackage com.mylg.study.bean.names.controller;@RestControllerpublic 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 加入
还未添加个人简介











评论