@Configuration配置类的full和lite模式

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模式

  1. 该模式下,配置类会被CGLIB增强(生成代理对象),放进IoC容器内的是代理
  2. 该模式下,对于内部类是没有限制的:可以是Full模式或者Lite模式
  3. 该模式下,配置类内部可以通过方法调用来处理依赖,并且能够保证是同一个实例,都指向IoC内的那个单例
  4. 该模式下,@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拦截器实现的。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值