众所周知,@Component
注解是在Spring 2.5版本引入的,以便于可以通过路径扫描的方式来替换配置文件。
@Bean
是在Spring3.0版本引入的,可以配合使用@Configuration
注解来达到完全替换配置文件的目的。
那么,我们是否可以仅使用二者其一?换句话说,二者有何区别呢?
事实上,@Component和@Bean做两个完全不同的事情,不应该混为一谈
@Component(和@Service和@Repository)
用于自动检测和使用类路径扫描自动配置bean。注释类和bean之间存在隐式的一对一映射(即每个类一个bean)。这种方法对需要进行逻辑处理的控制非常有限,因为它纯粹是声明性的。
@Bean
用于显式声明单个bean,而不是让Spring像上面那样自动执行它。它将bean的声明与类定义分离,并允许您精确地创建和配置bean。
那我们在什么时候应该使用@Bean?
让我们假设下,如果你想要创建来自第三方库的组件(您没有源代码,因此您无法使用@Component注释其类),因此无法进行自动配置。
又比如,我希望具体实现取决于某些动态状态。 @Bean对于这种情况无疑是完美的选择。
@Bean
@Scope("prototype")
public SomeService someService(String state) {
switch (state) {
case 1:
return new Impl1();
case 2:
return new Impl2();
case 3:
return new Impl3();
default:
return new Impl();
}
}