Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:@组件对@Bean_Java_Spring_Annotations_Autowired - Fatal编程技术网

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
-@控制器 公共类登录控制器 {--代码--} -@配置 公共类AppConfig{ @豆子 public SessionFactory SessionFactory() {--代码--}
  • @组件自动检测并使用类路径扫描配置Bean,而@Bean显式声明单个Bean,而不是让Spring自动执行
  • @组件不会将bean的声明与类定义解耦,其中as@bean将bean的声明与类定义解耦
  • @组件是类级注释,而@Bean是方法级注释,方法的名称用作Bean名称
  • @组件不需要与@Configuration注释一起使用,其中as@Bean注释必须在用@Configuration注释的类中使用
  • 如果类位于spring容器之外,我们无法使用@Component创建类的bean,而可以使用@bean创建类的bean,即使类位于spring容器之外
  • @组件具有不同的专门化,如@Controller、@Repository和@Service,而@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();
          }
        }