@Bean注释在Spring Boot中不起作用

时间:2020-03-19 07:23:50

标签: java spring spring-boot

我创建了模型

@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()时,我观察到相同的行为

任何人都可以解释这种行为吗?

2 个答案:

答案 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带来重要性。