• @Configuration(proxyBeanMethods = false)中proxyBeanMethods属性的作用


    @Configuration(proxyBeanMethods = false)中proxyBeanMethods属性的作用

    注解说明

    image-20221104192004677

    指定是否应该代理@Bean方法以强制执行Bean生命周期行为,例如,即使在用户代码中直接调用@Bean方法时也返回共享的Singleton Bean实例。这个特性需要方法拦截,它是通过运行时生成的CGLIB子类实现的,这个子类有一些限制,比如不允许Configuration类及其方法声明最终结果。
    缺省值为True,允许通过Configuration类内的直接方法调用进行“Bean间引用”,以及对此配置的@Bean方法的外部调用,例如从另一个配置类。如果不需要这样做,因为此特定配置的每个@Bean方法都是自包含的,并且被设计为容器使用的普通工厂方法,请将此标志切换为FALSE,以避免CGLIB子类处理。
    关闭Bean方法拦截可以有效地单独处理@Bean方法,就像在非@Configurity类上声明时一样。“@Bean Lite模式”(参见@Bean的javadoc)。因此,它在行为上等同于移除@configuration构造型。

    模式说明(Full 模式和 Lite 模式)

    proxyBeanMethods:代理bean的方法

    Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】

    Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】

    注意说明:

    **`组件依赖必须使用Full模式默认。其他默认是否Lite模式`**
    
    • 1

    测试

    @Configuration(proxyBeanMethods = true)

    • 前置环境

    springboot 默认环境

    • 测试类

    测试 javabean

    MyBean.java

    package com.example.proxybeanmethods;
    
    public class MyBean {
        public MyBean() {
            System.out.println("MyBean 的 无参构造方法");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    配置类

    SpringJavaConfig.java

    package com.example.proxybeanmethods;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    //@Configuration(proxyBeanMethods = false)
    @Configuration(proxyBeanMethods = true)//默认为true
    @ComponentScan("com.example.proxybeanmethods")
    public class SpringJavaConfig {
    
        @Bean
        public MyBean myBean(){
            return new MyBean();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    测试类

    package com.example.proxybeanmethods;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class ConfigurationProxyBeanMethodsTest {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringJavaConfig.class);
            SpringJavaConfig config = ac.getBean(SpringJavaConfig.class);
            MyBean myBean = config.myBean();
            MyBean myBean2 = config.myBean();
            System.out.println("两个对象是否相等: "+(myBean==myBean2));
            System.out.println(config);
            System.out.println(myBean);
            System.out.println(myBean2);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    控制台打印

    MyBean 的 无参构造方法
    两个对象是否相等: true
    com.example.proxybeanmethods.SpringJavaConfig E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIB841c9b19@96def03
    com.example.proxybeanmethods.MyBean@5ccddd20
    com.example.proxybeanmethods.MyBean@5ccddd20

    @Configuration(proxyBeanMethods = false)

    控制台打印

    MyBean 的 无参构造方法
    MyBean 的 无参构造方法
    MyBean 的 无参构造方法
    两个对象是否相等: false
    com.example.proxybeanmethods.SpringJavaConfig@5a4aa2f2
    com.example.proxybeanmethods.MyBean@6591f517
    com.example.proxybeanmethods.MyBean@345965f2
    Config@5a4aa2f2
    com.example.proxybeanmethods.MyBean@6591f517
    com.example.proxybeanmethods.MyBean@345965f2

  • 相关阅读:
    使用python计算行列式
    【快捷测试模型是否可以跑通】设置一张图片的张量形式,送入自己写的模型进行测试
    比特币 ZK 赏金系列:第 1 部分——支付解密密钥
    2023计算机毕业设计SSM最新选题之java二手交易平台2ud44
    [MySQL]学习笔记目录(尚硅谷宋红康MySQL数据库教程)
    【性能测试】全链路压测
    三菱PLC单轴运动控制
    Spring 中使用MyBatis
    深入浅出计算机组成原理12-理解电路:从电报机到门电路,我们如何做到“千里传信”?
    枚举类型原来是这么回事儿
  • 原文地址:https://blog.csdn.net/shaoming314/article/details/127694866