带有AnnotationConfigApplicationContext的Java @Component类和@Configuration类

时间:2014-10-03 17:17:22

标签: java spring configuration

我知道spring AnnotationConfigApplicationContext不仅可以接受@Configuration类作为输入,还可以接受用JSR-330元数据注释的普通@Component类和类。

我在没有@Configuration注释的情况下创建了AppConfig.java。

public class AppConfig {

   @Bean(name="sampleService")
   public SampleService getSampleService(){
       return new SampleService();
   }

}

将此类作为我的java配置类传递给AnnotationConfigApplicationContext,它接受​​并注册了我的服务bean。

我在上面的AppConfig上做了一些修改。

  @Component
  public class AppConfig {

     @Bean(name="sampleService")
     public SampleService getSampleService(){
          return new SampleService();
     }
  }

将AppConfig传递给AnnotationConfigApplicationContext,它接受并注册了我的服务bean。

问题:

  1. AnnotationConfigApplicationContext类接受带有@Configuration的java配置类,没有@Configuration和@Component注释,@Component和{{之间有什么区别? 1}}

  2. 为什么即使没有@Configuration注释也能接受?

  3. 何时使用@Configuration,何时使用@Component作为java配置类?

2 个答案:

答案 0 :(得分:2)

@Component

  

表示带注释的类是“组件”。

也就是说,在启用组件扫描的上下文中,Spring为@Component注释类型生成bean定义。这些bean定义最终变成了bean。

@Configuration,本身用

注释
  

表示一个类声明了一个或多个@Bean方法,可能是   由Spring容器处理以生成bean定义和   在运行时为这些bean提供服务请求,[...]

因此,Spring为其生成bean的任何@Configuration类型都充当bean的工厂。

javadoc of @Bean

  

@Bean方法也可以在不是的类中声明   用@Configuration注释。例如,bean方法可能是   在@Component类或甚至普通的老类中声明。在这样的   例如,@Bean方法将以所谓的“精简”模式处理。

     

lite模式下的Bean方法将被视为普通工厂方法   容器(类似于XML中的工厂方法声明),with   正确应用范围和生命周期回调。包含类   在这种情况下保持不变,并且没有不寻常的限制   对于包含类或工厂方法。

     

@Configuration中bean方法的语义形成对比   在lite模式下不支持类,'bean间引用'。   相反,当一个@Bean - 方法在lite中调用另一个@Bean - 方法时   模式,调用是标准的Java方法调用;春天呢   不通过CGLIB代理拦截调用。这类似于   inter - @Transactional方法调用代理模式,Spring没有   拦截调用 - Spring仅在AspectJ模式下执行此操作。

所以@Bean方法在@Configuration注释类中具有完整功能,在@Component注释类中具有有限的功能。

  

为什么即使没有@Configuration注释也能接受?

这就是课程的设计方式。 ApplicationContextBeanFactoryAnnotationConfigApplicationContext只是提供了一种注册bean定义的额外方法。

  

何时使用@Configuration,何时使用@Component作为java配置类?

这些完全独立的目标。关注javadoc。当您需要设置ApplicationContext时,可以使用带有AnnotationConfigApplicationContext注释类的@Configuration。如果您只需要一个bean,请使用@Component注释其类型。

答案 1 :(得分:0)

@Component注释将 Java类标记为bean ,但是@Configuration注释将 Java类标记为包含bean(具有@Bean注释的方法)

  

@Bean批注必须与@Configuration完全一起使用才能创建Spring   豆。

在下一堂课

  @Component
  public class AppConfig {

     @Bean(name="sampleService")
     public SampleService getSampleService(){
          return new SampleService();
     }
  }

@Bean注释没有任何作用,并且getSampleService()方法将是普通的旧Java方法,并且不会是 singleton ,因为正如我提到的那样, @Bean注释必须与@一起使用配置,因此必须按以下步骤进行修复:

  @Configuration
  public class AppConfig {

     @Bean(name="sampleService")
     public SampleService getSampleService(){
          return new SampleService();
     }
  }

因此,将@Configuration注释替换为任何其他注释,或将其删除,只需使@Bean注释无效,并且getSampleService()方法将不再成为 singleton

>