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
注解,你不能。