Имена и псевдонимы бобов - PullRequest
0 голосов
/ 24 марта 2020

Допустим, во внешней конфигурации bean-компонент связан с именем "externalBean".

Пример.

   @Bean("externalBean")
        public Foo foo() {
            Foo foo = new Foo();
            return foo;
        }

Если я сделаю в своей конфигурации следующее:

 @Bean("myBean")
    public Foo foo(@Qualifier("externalBean") Foo foo) {
       return foo;
    }

Теперь я могу автоматически связывать bean-компонент в моем коде с помощью @Qualifier ("myBean").

Правильно ли говорить, что myBean теперь является псевдонимом для externalBean?

Есть ли сейчас только один экземпляр компонента Foo?

Есть какие-нибудь замечания?

Ответы [ 2 ]

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

Предположим, что это фактически псевдоним, поскольку будет только один экземпляр Foo, хотя все еще будет два компонента. Они оба просто возвращают одну и ту же ссылку на объект Foo.

Попробуйте, например,

@SpringBootApplication
public class BeanApp{

    public static void main(String[] args) {
        SpringApplication.run(BeanApp.class, args);
    }

    static class Foo {
        String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    @Bean("externalBean")
    public Foo foo(){
        return new Foo();
    }

    @Bean("myBean")
    public Foo foo1(@Qualifier("externalBean") Foo foo){
        return foo;
    }

    @Bean
    public String ready(@Qualifier("externalBean") Foo foo, @Qualifier("myBean") Foo foo1){
        foo.setName("This is a bean");
        System.out.println(foo.getName());
        System.out.println(foo1.getName());
        return "Ready";
    }


}

Это выведет «This bean» дважды, даже если getName вызывается из двух отдельные бобы.

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

Правильно ли говорить, что myBean теперь является псевдонимом для externalBean?

Нет, псевдоним для myBean равен myBean, а для externalBean равен externalBean

Есть ли сейчас только один экземпляр компонента Foo?

Нет, у вас будет два экземпляра - externalBean и myBean

Замечания:

Если вам требуется только один компонент Foo, вы можете напрямую создать его одним из foo методов или использовать отдельный метод, который сделает это без аннотации @Bean. Если вы хотите иметь два bean-компонента с разными именами, у вас нет псевдонимов, вы можете переименовать методы в предполагаемые имена bean-компонентов (например, myBean, externalBean et c.). В то время как @Autowire вы можете указать требуемый компонент, соответствующий именам методов (компонентов).

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