创建一个带@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 {
...
}
如果bean是在另一个@Configuration
类中定义的,则可以使用@Import
注释:
@Import(OtherConfiguration.class)
@Configuration
public class MyApplicationContext {
...
}
导入其他XML或@Configuration
类之后,可以通过在@Configuration
类中声明一个私有成员来使用它们在上下文中声明的bean :
@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
类导入bean非常相似。除了使用,@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,但是它们不在此答案的范围内。您可以在我基于其答案的博客文章中找到这些选项之一。