Spring IoC контейнер: Java конфигурация, использование аннотации @Bean, объявление Bean

Использование аннотации @Bean

@Bean - это аннотация уровня метода и прямой аналог элемента XML <bean/>. Аннотация поддерживает некоторые атрибуты, предлагаемые <bean/>, такие как: * init-method * destroy-method * autowiring * name.

Вы можете использовать аннотацию @Bean в аннотированном @Configuration классе или в классе, аннотированном @Component.

Объявление Bean

Чтобы объявить бин, вы можете аннотировать метод аннотацией @Bean. Этот метод используется для регистрации определения компонента в ApplicationContext типа, указанного в качестве возвращаемого значения метода. По умолчанию имя компонента совпадает с именем метода. В следующем примере показано объявление метода @Bean:

Java

@Configuration
public class AppConfig {

    @Bean
    public TransferServiceImpl transferService() {
        return new TransferServiceImpl();
    }
}

Kotlin

@Configuration
class AppConfig {

    @Bean
    fun transferService() = TransferServiceImpl()
}

Предыдущая конфигурация в точности соответствует следующему Spring XML:

<beans>
    <bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>

Оба объявления делают bean-компонент с именем transferService доступным в ApplicationContext, привязанном к экземпляру объекта типа TransferServiceImpl, как показано на следующем текстовом изображении:

transferService -> com.acme.TransferServiceImpl

Вы также можете объявить свой метод @Bean с типом возврата интерфейса (или базового класса), как показано в следующем примере:

Java

@Configuration
public class AppConfig {

    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }
}

Kotlin

@Configuration
class AppConfig {

    @Bean
    fun transferService(): TransferService {
        return TransferServiceImpl()
    }
}

Однако это ограничивает видимость для предварительного прогнозирования типа указанным типом интерфейса (TransferService). Затем, с полным типом (TransferServiceImpl), известным контейнеру только один раз, был создан экземпляр одноэлементного компонента. Не ленивые синглтон-бины создаются в соответствии с порядком их объявления, поэтому вы можете увидеть разные результаты сопоставления типов в зависимости от того, когда другой компонент пытается сопоставить с необъявленным типом (например, @Autowired TransferServiceImpl, который разрешается только после того, как bean-компонент transferService был создан)

Если вы постоянно ссылаетесь на ваши типы с помощью объявленного интерфейса службы, ваши возвращаемые типы @Bean могут безопасно присоединиться к этому проектному решению. Однако для компонентов, которые реализуют несколько интерфейсов, или для компонентов, на которые потенциально может ссылаться их тип реализации, безопаснее объявить наиболее конкретный возможный тип возврата (по крайней мере, настолько специфичный, как того требуют точки внедрения, ссылающиеся на ваш компонент).


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки