Java Spring:@组件对@Bean
我知道Java Spring:@组件对@Bean,java,spring,annotations,autowired,Java,Spring,Annotations,Autowired,我知道@Component注释是在Spring2.5中引入的,目的是通过使用类路径扫描来摆脱XMLBean定义 @Bean是在spring 3.0中引入的,可以与@Configuration一起使用,以便完全摆脱xml文件,改用java配置 是否有可能重新使用@组件注释而不是引入@Bean注释?我的理解是,最终目标是在这两种情况下创建Bean。@Component和@Bean做两件完全不同的事情,不应该混淆 @Component(以及@Service和@Repository)用于使用类路径扫描自
@Component
注释是在Spring2.5中引入的,目的是通过使用类路径扫描来摆脱XMLBean定义
@Bean
是在spring 3.0中引入的,可以与@Configuration
一起使用,以便完全摆脱xml文件,改用java配置
是否有可能重新使用
@组件
注释而不是引入@Bean
注释?我的理解是,最终目标是在这两种情况下创建Bean。@Component
和@Bean
做两件完全不同的事情,不应该混淆
@Component
(以及@Service
和@Repository
)用于使用类路径扫描自动检测和配置bean。注释类和bean之间有一个隐式的一对一映射(即,每个类一个bean)。这种方法对布线的控制非常有限,因为它纯粹是声明性的
@Bean
用于显式声明单个Bean,而不是像上面那样让Spring自动声明。它将bean的声明与类定义分离,并允许您按照自己的选择创建和配置bean
要回答你的问题
是否有可能重新使用@组件
注释而不是引入@Bean
注释
当然,也许;但他们选择了不这样做,因为这两者是完全不同的。Spring已经不足以使水变得更混乱了。 < P>我们想根据具体的动态需要具体的实现。
@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
@Component
最好用于元件扫描和自动布线
什么时候应该使用@Bean
有时,自动配置不是一个选项什么时候?让我们想象一下,您希望从第三方库连接组件(您没有源代码,因此无法使用@Component注释其类),因此无法进行自动配置
@Bean注释返回一个对象,spring应该在应用程序上下文中注册为Bean。方法的主体具有负责创建实例的逻辑。这两种方法都旨在在Spring容器中注册目标类型 区别在于
@Bean
适用于方法,而@Component
适用于类型
因此,当您使用
@Bean
注释时,您可以控制方法体中的实例创建逻辑(请参阅)。有了@Component
注释,您就不能这样做了。当您使用@Component
标记时,它与使用普通bean声明方法(用@bean
注释)的POJO(普通旧Java对象)是一样的。例如,以下方法1和2将给出相同的结果
方法1
@Component
public class SomeClass {
private int number;
public SomeClass(Integer theNumber){
this.number = theNumber.intValue();
}
public int getNumber(){
return this.number;
}
}
用豆子代表“数字”:
@Bean
Integer theNumber(){
return new Integer(3456);
}
方法2
//Note: no @Component tag
public class SomeClass {
private int number;
public SomeClass(Integer theNumber){
this.number = theNumber.intValue();
}
public int getNumber(){
return this.number;
}
}
使用这两个bean:
@Bean
Integer theNumber(){
return new Integer(3456);
}
@Bean
SomeClass someClass(Integer theNumber){
return new SomeClass(theNumber);
}
方法2允许您将bean声明放在一起,它更灵活,等等。您甚至可能希望添加另一个非香草SomeClass bean,如下所示:
@Bean
SomeClass strawberryClass(){
return new SomeClass(new Integer(1));
}
- @组件及其专门化(@Controller、@service、@repository)允许自动检测 使用类路径扫描。如果我们看到像@Controller、@service、@repository这样的组件类,spring框架将使用组件扫描自动扫描
- @另一方面,Bean只能用于显式声明配置类中的单个Bean李>
- @Bean用于显式声明单个Bean,而不是让spring自动声明。它从类定义中对bean进行分隔声明
- 简而言之,@Controller、@service、@repository用于自动检测,@Bean用于从类创建seprate Bean
生成bean有两种方法。 一种是使用注释
@组件创建一个类。
另一个是创建一个方法并用@Bean
注释它。对于那些包含@Bean
方法的类,应该用@Configuration
注释
运行spring项目后,带有@ComponentScan
注释的类将使用@Com扫描每个类
- @Controller
public class LoginController
{ --code-- }
- @Configuration
public class AppConfig {
@Bean
public SessionFactory sessionFactory()
{--code-- }
@Configuration
class MyConfiguration{
@Bean
public User getUser() {
return new User();
}
}
class User{
}
// Getting Bean
User user = applicationContext.getBean("getUser");
@Component
class User {
}
// to get Bean
@Autowired
User user;
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/view/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
// @Configuration is implemented by @Component
@Configuration
public ComponentClass {
@Bean
public FirstBean FirstBeanMethod() {
return new FirstBean();
}
@Bean
public SecondBean SecondBeanMethod() {
return new SecondBean();
}
}