Создайте @Configuration
аннотированный класс:
@Configuration
public class MyApplicationContext {
}
Для каждого <bean>
тега создайте метод, аннотированный @Bean
:
@Configuration
public class MyApplicationContext {
@Bean(name = "someBean")
public SomeClass getSomeClass() {
return new SomeClassImpl(someInterestingProperty); // We still need to inject someInterestingProperty
}
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass() {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse); // We still need to inject beanFromSomewhereElse
}
}
Для импорта beanFromSomewhereElse
нам нужно импортировать его определение. Его можно определить в XML, и мы будем использовать @ImportResource
:
@ImportResource("another-application-context.xml")
@Configuration
public class MyApplicationContext {
...
}
Если компонент определен в другом @Configuration
классе, мы можем использовать @Import
аннотацию:
@Import(OtherConfiguration.class)
@Configuration
public class MyApplicationContext {
...
}
После того, как мы импортировали другие XML или @Configuration
классы, мы можем использовать bean-компоненты, которые они объявляют в нашем контексте, объявив частный член @Configuration
класса следующим образом:
@Autowired
@Qualifier(value = "beanFromSomewhereElse")
private final StrangeBean beanFromSomewhereElse;
Или используйте его непосредственно как параметр в методе, который определяет bean-компонент, который зависит от этого, beanFromSomewhereElse
используя @Qualifier
следующее:
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass(@Qualifier (value = "beanFromSomewhereElse") final StrangeBean beanFromSomewhereElse) {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse);
}
Импорт свойств очень похож на импорт bean-компонента из другого xml или @Configuration
класса. Вместо использования @Qualifier
мы будем использовать @Value
следующие свойства:
@Autowired
@Value("${some.interesting.property}")
private final String someInterestingProperty;
Это также можно использовать с выражениями SpEL .
Чтобы Spring мог обрабатывать такие классы как контейнеры bean-компонентов, нам нужно отметить это в нашем основном xml, поместив этот тег в контекст:
<context:annotation-config/>
Теперь вы можете импортировать @Configuration
классы точно так же, как если бы вы создавали простой bean-компонент:
<bean class="some.package.MyApplicationContext"/>
Есть способы вообще избежать использования Spring XML, но они не входят в объем этого ответа. Вы можете найти один из этих вариантов в моем сообщении в блоге, на котором я основываю свой ответ.
В основном я считаю этот метод объявления bean-компонентов намного более удобным, чем использование XML, благодаря нескольким преимуществам, которые я вижу:
На мой взгляд, недостатков не так много, но есть несколько, о которых я мог подумать:
@Component
@Service
или другие подобные аннотации, будет автоматически преобразован в bean-компонент (но это не было основной темой этого вопроса)