我创建了模型
@Repository
public class Model {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Model(String name) {
super();
this.name = name;
}
public Model() {
super();
// TODO Auto-generated constructor stub
}
}
然后我用一个bean创建了配置类
@Component
public class Config {
@Bean
public Model beanB() {
Model a=new Model();
a.setName("Daniel3");
return a;
}
}
然后我创建了Controller类
@RestController
public class TestController {
@Autowired
Model model;
@GetMapping("/test")
@ResponseBody
public Model test() {
return model;
}
}
当我点击控制器网址时,我得到以下响应
{"name":null}
但是如果我将配置类修改为
@Bean
@Primary
public Model beanB() {
Model a=new Model();
a.setName("test");
return a;
}
我得到的输出为{"name":"test"}
。
而且在使用自动装配模型而不是新Model()时,我观察到相同的行为
任何人都可以解释这种行为吗?
答案 0 :(得分:1)
现在,您正在Model
类上使用@Repository
时注册两个类型为Model
的不同bean,您不应该这样做,因为这是用于数据库存储库的。如果从@Repository
中删除Model
,将只有一个bean定义,因此将正确的注入到控制器中:
// @Repository remove this, should not be used here
public class Model {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Model(String name) {
super();
this.name = name;
}
public Model() {
super();
// TODO Auto-generated constructor stub
}
}
它与@Primary
配合使用的原因是,您然后定义了Model
类型的所有bean中订单的重要性。
答案 1 :(得分:0)
@Repository
意味着您要在bean工厂中注入一个类型为存储库的bean,此外,当您还添加@Bean
批注时,它将成为第二个bean,因此这在这两个bean之间造成了重要的问题并且当您添加@Primary
时,它会为您的@Bean
带注释的bean带来重要性。