@Configuration配置类的full和lite模式

it2025-03-01  22

full和lite模式

在之前Spring核心后置处理器ConfigurationClassPostProcessor文章中提到过这两个属性,这里再次拿出来说明。

@Configuration注解标记的类是配置类,Bean定义信息被标记为full 类型

注解@Component @ComponentScan @Import @ImportResource 标注的类是配置类,Bean定义信息被标记为lite 类型 类中的方法被@Bean注解标记的类也是配置类,Bean定义信息被标记为lite 类型

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; } } }

full模式

该模式下,配置类会被CGLIB增强(生成代理对象),放进IoC容器内的是代理该模式下,对于内部类是没有限制的:可以是Full模式或者Lite模式该模式下,配置类内部可以通过方法调用来处理依赖,并且能够保证是同一个实例,都指向IoC内的那个单例该模式下,@Bean方法不能被private/final等进行修饰,因为代理类需要重写这个方法 如下示例: @Configuration public class FullConfig { @Bean public User userA() { User user = new User(); user.setName("userA"); return user; } @Bean public User userB() { User user = new User(); user.setName("userB"); //full模式下:调用userA()多少次都是返回容器中注入的同一个Bean System.out.println("userB1:"+System.identityHashCode(userA())); System.out.println("userB2:"+System.identityHashCode(userA())); System.out.println("userB3:"+(userA()== userA())); //true return user; } private static class InnerConfig { @Bean public final User userInner() { User user = new User(); user.setName("userInner"); return user; } } }

自Spring5.2(对应Spring Boot 2.2.0)开始,标注有@Configuration(proxyBeanMethods = false)的类为lite模式,此值默认是true,也就是full模式。

full模式的方法调用总是返回容器注入的Bena是通过BeanMethodInterceptor拦截器实现的。

最新回复(0)