最近因为同事bean配置的问题导致生产环境往错误的redis实例写入大量的数据,差点搞挂redis。经过快速的问题定位,发现是同事新增一个redis配置文件,并且配置的RedisSentinelConfiguration
的id是一样的,然后在使用@Autowired
注入bean的时候因为spring bean覆盖的机制导致读取的redis配置不是原来的。
总结起来,有两点问题:
- 为什么相同bean id的bean会被覆盖
- @Autowired注解不是按照
byType
的方式进行注入的吗
问题重现
代码如下:
UserConfiguration
:
public class UserConfiguration {
private int id;
private String name;
private String city;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
UserClient
:
public class UserClient {
private UserConfiguration configuration;
public UserClient(UserConfiguration configuration) {
this.configuration = configuration;
}
public String getCity() {
return configuration.getCity();
}
}
beans.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=&#