从Spring3.0,@Configuration用于定义配置类,相当于Spring配置了一个xml配置文件,
配置类里面的@Bean注解在方法上,声明当前方法的返回值为一个Bean.


注意:@Configuration注解的配置类有如下要求:

@Configuration标注在类上,相当于这个类就是一个xml文件,@Bean注解就相当于里面的每一个bean
作用为:配置spring容器(应用上下文)


@Configuation等价于
@Bean等价于
@ComponentScan等价于


一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Component
  5. public @interface Configuration {
  6. @AliasFor(annotation = Component.class)
  7. String value() default "";
  8. }


从定义来看, @Configuration 注解本质上还是 @Component,因此 或者 @ComponentScan 都能处理@Configuration 注解的类。

@Configuration 标记的类必须符合下面的要求:
@Configuration不可以是final类型(没法动态代理);
@Configuration不可以是匿名类;
嵌套的configuration必须是静态类。
配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。
配置注解通常为了通过 @Bean 注解生成 Spring 容器管理的类,
配置类必须是非本地的(即不能在方法中声明,不能是 private)。
任何嵌套配置类都必须声明为static。
@Bean 方法可能不会反过来创建进一步的配置类(也就是返回的 bean 如果带有 @Configuration,也不会被特殊处理,只会作为普通的 bean)。

加载过程

Spring 容器在启动时,会加载默认的一些 PostPRocessor,其中就有 ConfigurationClassPostProcessor,这个后置处理程序专门处理带有 @Configuration 注解的类,这个程序会在 bean 定义加载完成后,在 bean 初始化前进行处理。主要处理的过程就是使用 cglib 动态代理增强类,而且是对其中带有 @Bean 注解的方法进行处理。