Создайте @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, благодаря нескольким преимуществам, которые я вижу:
На мой взгляд, недостатков не так много, но есть несколько, о которых я мог подумать: