写点什么

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
用户头像

梦倚栏杆

关注

还未添加个人签名 2018.04.22 加入

还未添加个人简介

评论

发布
暂无评论
spring-beans 注册Beans(一) 之问题场景复现