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拦截器实现的。