Spring — добавление @Bean в строку без атрибута имени

Существуют причины для добавление @Bean в строку

Вам нужно будет назвать bean-компонент, а затем использовать аннотацию @Qualifier при автосвязывании со ссылкой на это имя.

Но в следующем коде без атрибута имени

@Configuration
@PropertySource(value = { "classpath:my.properties" })
public class MyEnvironment {

    @Value("${MY_NAME}")            String MY_NAME;
    @Value("${MY_NAME2}")           String MY_NAME2;

    @Bean
    public String getMyName() {
        return MY_NAME;
    }
    @Bean
    public String getMyName2() {
        return MY_NAME2;
    }
}

Он вызывается с использованием метода как:

myEnvironment.getMyName();

Разве @Bean не является избыточным/неуместным в данном случае? также может ли это соглашение вызвать проблемы? или есть скрытая выгода?


person user7294900    schedule 29.10.2019    source источник


Ответы (1)


Учитывая, что намерение Spring состоит в том, чтобы внедрить зависимость, @Bean в этом сценарии определенно избыточен.

Поскольку большинство ваших классов используют только (или, можно сказать, зависят от), объект конфигурации myEnvironment. Таким образом, имеет смысл внедрить класс MyEnvironment как единое целое в те классы, которые на него полагаются, а не на отдельный объект String.

Хотя это зависит от того, как вы проектируете свои классы и их зависимости. Например. Вы также можете просто ввести эти два значения String в классы, которым это нужно, используя @Value непосредственно в этих классах без необходимости вообще иметь класс MyEnvironment.

person Montri M    schedule 29.10.2019
comment
Я согласен, но теоретически, что произойдет, если все такие свойства будут иметь аннотацию @Bean? это вызовет проблемы? - person user7294900; 29.10.2019
comment
Я считаю, что Spring может выдать исключение, если у вас есть какой-то класс, который объявил @Autowired без указания @Qualifier вместе с ним. - person Montri M; 29.10.2019
comment
Ага, тут упоминалось. stackoverflow.com/questions/32245003/ - person Montri M; 29.10.2019
comment
Но у нас есть такой класс с несколькими свойствами, аннотированными как @Bean, и Spring не генерирует исключений. - person user7294900; 29.10.2019
comment
Извините, я немного пропустил вашу мысль. Объявление нескольких свойств, аннотированных как @Bean, допустимо, если никто не пытается их @Autowired. Как будто у Spring есть собственный механизм по умолчанию для именования этих bean-компонентов, поэтому он не будет конфликтовать. Это вызывает проблемы только тогда, когда вы пытаетесь получить эти бобы. Пожалуйста, проверьте: docs.spring .io/spring/docs/current/javadoc-api/org/ и stackoverflow.com/questions/48871789/ - person Montri M; 29.10.2019