Створіть @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
класи, ми можемо використовувати боби, які вони декларують у нашому контексті, оголосивши приватного члена @Configuration
класу наступним чином:
@Autowired
@Qualifier(value = "beanFromSomewhereElse")
private final StrangeBean beanFromSomewhereElse;
Або використовувати його безпосередньо як параметр у методі, який визначає боб, що залежить від цього, beanFromSomewhereElse
використовуючи @Qualifier
наступне:
@Bean(name = "anotherBean")
public AnotherClass getAnotherClass(@Qualifier (value = "beanFromSomewhereElse") final StrangeBean beanFromSomewhereElse) {
return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse);
}
Імпорт властивостей дуже схожий на імпорт бобів з іншого xml або @Configuration
класу. Замість використання @Qualifier
ми будемо використовувати такі @Value
властивості:
@Autowired
@Value("${some.interesting.property}")
private final String someInterestingProperty;
Це можна використовувати і з виразами SpEL .
Для того, щоб весна могла обробляти такі класи як контейнери з квасолею, нам потрібно позначити це в головному xml, поставивши цей тег у контекст:
<context:annotation-config/>
Тепер ви можете імпортувати @Configuration
класи точно так само, як ви створили простий боб:
<bean class="some.package.MyApplicationContext"/>
Існують способи взагалі уникнути весняних XML, але вони не входять до сфери цієї відповіді. Ви можете дізнатися один із цих варіантів у моєму дописі блогу, на якому я ґрунтую свою відповідь.
В основному я вважаю цей метод декларування бобів набагато зручнішим, ніж використання XML через декілька переваг, які я бачу:
Недоліків не так багато, як я їх бачу, але є кілька таких, про які я міг би придумати: