@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方法被调用多少次返回的组件都是新创建的】

注意说明:

**<u>`组件依赖必须使用Full模式默认。其他默认是否Lite模式`</u>**

测试

@Configuration(proxyBeanMethods = true)

  • 前置环境

springboot 默认环境

  • 测试类

测试 javabean

MyBean.java

package com.example.proxybeanmethods;

public class MyBean {
    public MyBean() {
        System.out.println("MyBean 的 无参构造方法");
    }
}

配置类

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

测试类

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

控制台打印

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值