Аннотация @Bean не работает в Spring Boot - PullRequest
0 голосов
/ 19 марта 2020

Я создал модель

@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
    }
}

Затем я создал класс конфигурации с бином

@Component
public class Config {

    @Bean
    public Model beanB() {
        Model a=new Model();
        a.setName("Daniel3");
        return a;
    }   
}

Затем я создал класс контроллера

@RestController
public class TestController {

    @Autowired
    Model model;

    @GetMapping("/test")
    @ResponseBody
    public Model test() {
        return model;
    }

}

Когда Я нажимаю на URL контроллера, я получаю ответ ниже

{"name":null}

Но если я изменю класс конфигурации как

    @Bean
    @Primary
    public Model beanB() {
        Model a=new Model();
        a.setName("test");
        return a;
    }   

, я получу вывод как {"name":"test"} И я наблюдаю такое же поведение при использовании Autowired Model вместо новой Model ()

Может кто-нибудь объяснить это поведение?

Ответы [ 2 ]

1 голос
/ 19 марта 2020

В данный момент вы регистрируете два разных bean-компонента типа Model, так как вы используете @Repository в своем классе Model, что вам не следует делать, поскольку это используется для хранилищ базы данных. Если вы удалите @Repository из вашего Model, у вас будет только одно определение бина и, следовательно, вы получите правильное определение для вашего контроллера:

// @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.

0 голосов
/ 21 марта 2020

@Repository означает, что вы вводите бин репозитория типов в фабрику бинов. Более того, когда вы добавляете аннотацию @Bean, она становится вторым бином, поэтому возникает проблема между этими двумя бинами и при добавлении @Primary это придало значение вашему @Bean аннотированному бобу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...