2014-10-03 73 views
0

我知道弹簧AnnotationConfigApplicationContext不仅能够接受@Configuration类作为输入,而且还能够接受使用JSR-330元数据注释的类和类的普通@Component类。Java @Component类和具有AnnotationConfigApplicationContext的@Configuration类

我在下面创建了AppConfig.java而没有@Configuration注释。

public class AppConfig { 

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

} 

通过了这个课程作为我的java配置类AnnotationConfigApplicationContext,它接受和注册我的服务豆。

我在如下的相同AppConfig上做了一些修改。

@Component 
    public class AppConfig { 

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

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

问:

  1. AnnotationConfigApplicationContext类是接受与@Configuration java的配置类,没有@Configuration与@Component注解,就是@Component@Configuration之间的区别?

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

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

回答

2

@Component

指示的带注释类是一个 “组件”。

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

@Configuration,其本身与

注释表示一个类声明一个或多个@Bean方法,并且可以是 由Spring容器处理以生成bean定义并在运行时对那些豆 服务请求, [...]

因此,任何@Configuration类型,为其生成一个bean,作为bean的工厂。

javadoc of @Bean状态

@Bean方法也可以不在 标注有@Configuration类中声明。例如,Bean方法可能是类中声明的 ,或者甚至在普通的旧类中声明。在这样的 的情况下,@Bean方法将以所谓的“精简”模式进行处理。

豆在精简版模式方法将由 被视为纯工厂方法容器(类似于XML工厂方法声明)中,用 作用域和生命周期回调正确应用。在这种情况下,包含类 保持不变,对于包含类或工厂方法,没有异常约束 。

与类别@Configuration 中bean方法的语义相反,在“模式”模式下不支持“bean间引用”。 相反,当一个@Bean-方法调用另一个@Bean-方法,方式为精简 模式时,该调用是标准的Java方法调用; Spring 不通过CGLIB代理拦截调用。这类似于 inter-@Transactional方法调用,其中在代理模式下,Spring不会调用 来拦截调用 - Spring只在AspectJ模式下这样做。

所以@Bean方法有@Configuration注解的类的全部功能和有限的功能在@Component注释类。

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

这就是班级的设计。 ApplicationContextBeanFactoryAnnotationConfigApplicationContext只是提供了一种额外的方式来注册一个bean定义。

何时使用@Configuration以及何时使用@Component作为java config class?

这些确实完全不同的目标。按照javadoc。当您需要设置ApplicationContext时,可以使用带有@Configuration带注释的类的AnnotationConfigApplicationContext。如果你只需要一个bean,用@Component注释它的类型。

+0

谢谢德利曼拿利斯,现在我很清楚。 – Lovababu 2014-10-04 13:17:53