spring:@组件与@Bean

我知道@Component注解是在Spring 2.5中引入的,以便通过使用类path扫描来摆脱xml bean的定义。

@Bean是在Spring 3.0中引入的,可以和@Configuration一起使用,以便完全摆脱xml文件并使用java config。

是否有可能重新使用@Component注释而不是引入@Bean注释? 我的理解是,最终的目标是在这两种情况下创buildbean。

@Component@Bean做了两件完全不同的事情,不要混淆。

@Component (和@Service@Repository )用于使用类path扫描来自动检测和自动configurationBean。 注释类和bean之间有一个隐式的一对一映射(即每个类一个bean)。 用这种方法控制接线是相当有限的,因为它纯粹是声明性的。

@Bean用来显式声明一个单独的bean,而不是像上面那样让Spring自动执行。 它将bean的声明从类定义中分离出来,并且可以让你创build和configurationbean的方式。

要回答你的问题…

是否有可能重新使用@Component注释而不是引入@Bean注释?

当然可能; 但是他们select不去,因为两者是完全不同的。 spring已经够混乱,没有进一步混淆水域。

让我们考虑一下,我想根据一些dynamic的具体实现。 @Bean非常适合这种情况。

 @Bean @Scope("prototype") public SomeService someService() { switch (state) { case 1: return new Impl1(); case 2: return new Impl2(); case 3: return new Impl3(); default: return new Impl(); } } 

然而,用@Component没有办法做到这一点。

@组件优选用于组件扫描和自动布线。

什么时候应该使用@Bean

有时自动configuration不是一个选项。 什么时候? 假设你想连接第三方库的组件(你没有源代码,所以你不能使用@Component注释它的类),所以自动configuration是不可能的。

@Bean注释返回一个 Spring应该在application context中注册为bean 的对象 。 该方法主体负责创build实例的逻辑。

两种方法的目标都是在Spring容器中注册目标types。

不同之处在于@Bean适用于方法 ,而@Component适用于types

因此,当您使用@Bean注释时,您可以控制方法体中的实例创build逻辑(请参阅上面的示例 )。 有了@Component注解,你不能。