Spring: @Component versus @Bean
我知道在Spring2.5中引入了
EDCOX1 1在3中引入,并可与EDCOX1 2使用,以完全摆脱XML文件,而使用Java CONFIG代替。
是否可以重新使用
回答你的问题…
would it have been possible to re-use the
@Component annotation instead of introducing@Bean annotation?
当然,可能吧,但他们选择了不去,因为这两种情况完全不同。春天已经够混乱了,但不会把水弄得更浑浊。
@组件最好用于部件扫描和自动布线。
什么时候应该使用@bean?
有时自动配置不是一个选项。什么时候?假设您想要连接来自第三方库的组件(您没有源代码,因此不能用@component注释其类),因此无法进行自动配置。
@bean注释返回一个对象,spring应该在应用程序上下文中注册为bean。方法体具有创建实例的逻辑。
让我们考虑一下,我希望具体的实现取决于某种动态状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @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(); } } |
然而,没有办法用
这两种方法都旨在在Spring容器中注册目标类型。
区别在于
因此,当使用
@组件这是一个通用注释,可以应用于应用程序的任何类,使其成为一个Spring管理的组件(简单地说,任何Spring管理的组件的通用原型)。当类路径被spring的component scan(@componentscan)功能扫描时,它将识别用@component annotation注释的类(在给定的包中),并创建这些类的bean并在applicationContext中注册它们。@组件是一个类级的注释,其目的是使类成为Spring管理组件和类路径扫描功能的自动检测bean。
如果您想了解关于@component和其他构造型注释的更多信息,建议阅读本文。
@bean用于显式声明和注册从方法返回的SpringIOC容器中的bean(作为配置bean)。@bean是一个方法级的注释,它在用@configuration注释的类中使用。简单地说,@bean注释用于将方法返回的bean注册为ioc容器中的Spring配置bean。@bean只是一个方法级注释,不能与类和对象声明一起使用。
@bean注释指示一个方法生成一个bean,该bean应该由Spring容器管理。
要声明bean,只需使用@bean注释对方法进行注释。当javaconfig遇到这样的方法时,它将执行该方法并将返回值注册为applicationContext中的bean。默认情况下,bean名称将与方法名称相同。下面是@bean方法声明的简单示例。
1 2 3 4 5 6 7 8 | @Configuration public class ApplicationConfig { @Bean public User adminUserProfile() { return new User("Rami","Nassar"); } } |
在AppultCyFig类中,您可以看到我们首先使用@配置注释来通知Spring这是一个基于Java的配置文件。然后,@bean注释用于声明SpringBean和DI需求。@bean注释等价于标记,方法名等价于标记内的id属性。我希望在阅读本文之后,您对@bean和@component注释的真正用途和使用有了一个清晰的了解。
当使用EDCOX1的0个标记时,它与波霍(普通的Java对象)和香草bean声明方法相同(用EDCOX1(1)表示注释)。例如,下面的方法1和2将给出相同的结果。
方法1
1 2 3 4 5 6 7 8 9 10 11 12 13 |
用豆子做"thenumber":
方法2
1 2 3 4 5 6 7 8 9 10 11 12 13 | //Note: no @Component tag public class SomeClass { private int number; public SomeClass(Integer theNumber){ this.number = theNumber.intValue(); } public int getNumber(){ return this.number; } } |
两者都有豆子:
1 2 3 4 5 6 7 8 9 |
方法2允许您将bean声明放在一起,它更灵活一些,等等。您甚至可能希望添加另一个非普通的类bean,如下所示:
1 2 3 4 |
- @组件及其专门化(@controller、@service、@repository)允许自动检测使用类路径扫描。如果我们看到像@controller、@service、@repository这样的组件类,那么Spring框架将使用组件扫描自动扫描@repository。
- @另一方面,bean只能用于在配置类中显式声明单个bean。
- @bean用于显式地声明单个bean,而不是让spring自动执行它。它从类定义中生成bean的septate声明。
- 简而言之,@controller,@service,@repository用于自动检测,@bean用于从类中创建单独的bean
1 2 3 4 5 6 7 8 9 | - @Controller public class LoginController { --code-- } - @Configuration public class AppConfig { @Bean public SessionFactory sessionFactory() {--code-- } |
有两种方法可以生成bean。一种是用注释
@bean是为了避免在编译时耦合Spring和业务规则而创建的。这意味着您可以在其他框架(如playframework或jee)中重用业务规则。
此外,您可以完全控制如何创建bean,而缺省的Spring实例化还不够。
我写了一篇关于它的文章。
Factory Methods: Decoupling the IoC Container from the Abstraction