从Spring3.0,@Configuration用于定义配置类,相当于Spring配置了一个xml配置文件,
配置类里面的@Bean注解在方法上,声明当前方法的返回值为一个Bean.
注意:@Configuration注解的配置类有如下要求:
@Configuration标注在类上,相当于这个类就是一个xml文件,@Bean注解就相当于里面的每一个bean
作用为:配置spring容器(应用上下文)
@Configuation等价于
@Bean等价于
@ComponentScan等价于
一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
@AliasFor(annotation = Component.class)
String value() default "";
}
从定义来看, @Configuration 注解本质上还是 @Component,因此
@Configuration 标记的类必须符合下面的要求:
@Configuration不可以是final类型(没法动态代理);
@Configuration不可以是匿名类;
嵌套的configuration必须是静态类。
配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。
配置注解通常为了通过 @Bean 注解生成 Spring 容器管理的类,
配置类必须是非本地的(即不能在方法中声明,不能是 private)。
任何嵌套配置类都必须声明为static。
@Bean 方法可能不会反过来创建进一步的配置类(也就是返回的 bean 如果带有 @Configuration,也不会被特殊处理,只会作为普通的 bean)。
加载过程
Spring 容器在启动时,会加载默认的一些 PostPRocessor,其中就有 ConfigurationClassPostProcessor,这个后置处理程序专门处理带有 @Configuration 注解的类,这个程序会在 bean 定义加载完成后,在 bean 初始化前进行处理。主要处理的过程就是使用 cglib 动态代理增强类,而且是对其中带有 @Bean 注解的方法进行处理。