在之前Spring核心后置处理器ConfigurationClassPostProcessor文章中提到过这两个属性,这里再次拿出来说明。
@Configuration注解标记的类是配置类,Bean定义信息被标记为full 类型
注解@Component @ComponentScan @Import @ImportResource 标注的类是配置类,Bean定义信息被标记为lite 类型 类中的方法被@Bean注解标记的类也是配置类,Bean定义信息被标记为lite 类型
1.该模式下,配置类本身不会被CGLIB增强,放进IoC容器内的就是类本身 2. 该模式下,对于内部类是没有限制的:可以是Full模式或者Lite模式 3. 该模式下,配置类内部不能通过方法调用来处理依赖,否则每次生成的都是一个新实例而并非IoC容器内的单例 4. 该模式下,配置类就是一普通类,所以@Bean方法可以使用private/final等进行修饰
例如:
@Component //说明这是一个lite模式和 public class LiteConfig { @Bean public Student stuA() { Student stu= new Student (); stu.setName("stuA"); return stu; } @Bean private Student stuB() { //可以是private的方法 Student stu= new Student (); stu.setName("stuB"); //lite模式下:调用stuA()方法会生成一个新的Bean System.out.println("stuB1:"+System.identityHashCode(stuA())); System.out.println("stuB2:"+System.identityHashCode(stuA())); System.out.println("stuB3:"+(userA()== userA())); //返回false return stu; } //内部类可以是任意模式 private static class InnerConfig { @Bean //lit模式下方法可以使用private final修饰 private final Student stuInner() { Student stu= new Student (); stu.setName("stuInner"); return stu; } } }自Spring5.2(对应Spring Boot 2.2.0)开始,标注有@Configuration(proxyBeanMethods = false)的类为lite模式,此值默认是true,也就是full模式。
full模式的方法调用总是返回容器注入的Bena是通过BeanMethodInterceptor拦截器实现的。