如果Spring中有两个ID相同的Bean,会报错吗?

简介: 有位粉丝被 问到这样一个问题,说在Spring中,如果有两个ID相同的Bean,会不会报错?如果报错,会在哪个阶段报错?这个问题也要分析具体的情况,才能完整的回答。我从三个方面来回答你的问题吧。

有位粉丝被 问到这样一个问题,说在Spring中,如果有两个ID相同的Bean,会不会报错?如果报错,会在哪个阶段报错?


这个问题也要分析具体的情况,才能完整的回答。我从三个方面来回答你的问题吧。


第一种情况是,如果采用的是XML文件进行配置,就不能存在两个相同的ID,Spring容器一启动就会报错。因为ID是Spring中Bean的唯一标识,所以,在启动Spring容器的时候就会去验证ID的唯一性,一旦发现重复就会报错,

这个错误是发生在Spring对XML文件进行解析的时候,然后转化为BeanDefinition的这个阶段。

但是,如果是在两个不同的XML文件里面,配置了两个相同的ID。那么IoC容器会在加载Bean的时候,用后者覆盖前者,所以,最终只保留一个。


第二种情况呢,是到了Spring 3.x版本以后,增加了注解配置的方式。我们可以通过@Configuration来声明一个配置类。然后使用@Bean注解来声明一个Bean。这就种方式就完全取代了XML的配置方式,那么在这种情况下,如果我们在同一个配置类里面声明多个相同ID的Bean,IoC容器就会只会注册第一个声明的Bean,后续重复名字的Bean相当于就会直接忽略。

@Configuration
public class SpringConfiguration {
@Bean( name = "service" )
public Service1 service1( ){
return new Service1( );
}
@Bean( name = "service" )
public Service2 service2( ){
return new Service2( );
}
}

比如,像这样一段代码,在Spring IoC容器中,就只会保留service1这个实例。后续相同名字的Bean就不会再加载,当然也不会报错。


第三种情况,如果使用@Autowired注解来实现依赖注入的话,它是根据类型来注入的。比如像这样一段代码

@Autowired
private Service1 service1;
@Autowired
private Service2 service2;

因为IOC容器只有Service1的实例,所以启动的时候会提示找不到Service2这个实例。


第四种情况,再看这样一段代码:

@Resource( name="service" )
private Service1 service1;
@Resource( name="service" )
private Service2 service2;

如果使用@Resource注解根据名称来实现依赖注入的话,那么在IoC容器中只能获取到Service1的实例,

于是,Spring会把Service1这个实例赋值给Service2,这个时候,就会提示类型不匹配的错误。


以上就是我对Spring中有两个ID相同的Bean的四种情况的分析。如果各位汤粉还有需要补充的,可以在评论区留言。

相关文章
|
12月前
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
1322 2
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
933 26
|
9月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
617 0
|
消息中间件 Java Kafka
【Azure Kafka】使用Spring Cloud Stream Binder Kafka 发送并接收 Event Hub 消息及解决并发报错
reactor.core.publisher.Sinks$EmissionException: Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially.
262 7
|
12月前
|
前端开发 IDE Java
Spring MVC 中因导入错误的 Model 类报错问题解析
在 Spring MVC 或 Spring Boot 开发中,若导入错误的 `Model` 类(如 `ch.qos.logback.core.model.Model`),会导致无法解析 `addAttribute` 方法的错误。正确类应为 `org.springframework.ui.Model`。此问题通常因 IDE 自动导入错误类引起。解决方法包括:删除错误导入、添加正确包路径、验证依赖及清理缓存。确保代码中正确使用 Spring 提供的 `Model` 接口以实现前后端数据传递。
417 0
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
419 12
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
555 12
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
488 6
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
373 1

热门文章

最新文章