Spring框架中的@Configuration参数proxyBeanMethods

news2024/9/21 2:48:49

在这里插入图片描述

一.概念分析

在Spring框架中,@Configuration注解用于声明一个Java类作为配置类,它替代了传统的XML配置方式。通过@Configuration注解标记的类可以包含@Bean注解,用于定义Spring容器中的Bean对象。而在@Configuration注解中,有一个非常重要的属性proxyBeanMethods,它控制着@Configuration类中@Bean方法的代理行为。让我们对这个属性进行非常详细的介绍:

  1. @Configuration注解:

    • @Configuration是Spring框架提供的一个元注解,用于表示一个类是一个配置类。
    • 配置类通常包含@Bean注解,定义了创建和配置Bean的方法。
    • Spring会扫描@Configuration类,并将其中的@Bean方法注册为Spring容器中的Bean。
  2. @Bean注解:

    • @Bean是用于定义Spring Bean的注解。
    • 在@Configuration类中,通过@Bean注解标记的方法会返回一个对象,该对象将被注册到Spring容器中作为Bean。
    • 默认情况下,Spring容器会使用方法名作为Bean的名称,也可以通过@Bean的name属性指定Bean的名称。
  3. proxyBeanMethods属性:

    • proxyBeanMethods是@Configuration注解的一个属性,它用于控制@Bean方法的代理行为。
    • 在Spring 5及之前的版本,默认值为true,从Spring 5开始,默认值为true。
    • 该属性接受一个布尔值,设置为true表示启用代理模式,设置为false表示禁用代理模式。
  4. 代理模式(Proxy Mode):

    • 在@Configuration类中,当proxyBeanMethods属性设置为true时,Spring会对@Configuration类进行CGLIB代理。
    • CGLIB是一个强大的第三方库,用于在运行时生成Java类的子类。
    • 对@Configuration类进行代理后,调用@Bean方法时,Spring会检查是否已经存在该Bean,如果存在,则直接返回已存在的Bean,否则调用方法创建新的Bean并缓存起来。
    • 这样做的好处是,当多个@Bean方法之间存在相互调用时,可以保证对相同Bean的调用不会重复执行,提高了应用程序的性能。
  5. 禁用代理模式:

    • 当proxyBeanMethods属性设置为false时,禁用了CGLIB代理。
    • 在禁用代理模式下,Spring容器每次调用@Bean方法时都会执行一次方法体,不会缓存Bean对象。
    • 这样做的好处是,每次调用@Bean方法都会重新创建一个新的Bean对象,适用于那些需要每次返回新实例的场景。
  6. 如何选择代理模式:

    • 选择是否启用代理模式取决于应用程序的需求。
    • 如果@Configuration类中的@Bean方法之间没有相互调用,并且Bean的创建不涉及复杂的逻辑,可以考虑启用代理模式,以提高性能。
    • 如果@Bean方法之间有相互调用,或者Bean的创建逻辑比较复杂,为了保证每次调用都返回新的实例,可以禁用代理模式。

示例代码:

@Configuration
public class MyConfiguration {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean
    public AnotherBean anotherBean() {
        return new AnotherBean(myBean()); 
    }
}

总结:
@Configuration注解用于声明配置类,其中的@Bean注解用于定义Spring容器中的Bean对象。proxyBeanMethods属性控制@Bean方法的代理行为。启用代理模式可以提高性能,禁用代理模式可以保证每次调用@Bean方法都返回新的实例。选择是否启用代理模式取决于应用程序的需求。

场景再现

为了更好地理解proxyBeanMethods的不同使用场景,我们创建一个简单的示例来演示它们的效果。我们将创建一个Spring应用程序,其中包含一个@Configuration类,其中定义了两个@Bean方法,并在不同场景下测试proxyBeanMethods的行为。

场景一:启用代理模式

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = true)
public class ProxyEnabledConfiguration {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean
    public AnotherBean anotherBean() {
     //开启代理,实例Bean会被缓存,直接返回已存在的Bean
        return new AnotherBean(myBean()); 
    }
}

场景二:禁用代理模式

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
public class ProxyDisabledConfiguration {

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean
    public AnotherBean anotherBean() {
    //禁用代理,每次都会生成新的实例Bean
        return new AnotherBean(myBean()); 
    }
}

MyBean.java:

public class MyBean {
    private static int instanceCounter = 0;
    private int instanceNumber;

    public MyBean() {
        instanceNumber = ++instanceCounter;
        System.out.println("Creating MyBean instance: " + instanceNumber);
    }

    public int getInstanceNumber() {
        return instanceNumber;
    }
}

AnotherBean.java:

public class AnotherBean {
    private MyBean myBean;

    public AnotherBean(MyBean myBean) {
        this.myBean = myBean;
        System.out.println("Creating AnotherBean instance using MyBean with instance number: " + myBean.getInstanceNumber());
    }
}

测试类:

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {

    public static void main(String[] args) {
        // proxyBeanMethods enabled
        AnnotationConfigApplicationContext context1 = new AnnotationConfigApplicationContext(ProxyEnabledConfiguration.class);
        AnotherBean anotherBean1 = context1.getBean(AnotherBean.class);

        // proxyBeanMethods disabled
        AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext(ProxyDisabledConfiguration.class);
        AnotherBean anotherBean2 = context2.getBean(AnotherBean.class);
    }
}

在启用代理模式的场景中(ProxyEnabledConfiguration),MyBean只会被实例化一次,因为AnotherBean会复用已经创建的MyBean实例,从控制台输出可以看到:

Creating MyBean instance: 1
Creating AnotherBean instance using MyBean with instance number: 1

而在禁用代理模式的场景中(ProxyDisabledConfiguration),MyBean会被每次调用都实例化一次,因为没有缓存,从控制台输出可以看到:

Creating MyBean instance: 1
Creating MyBean instance: 2
Creating AnotherBean instance using MyBean with instance number: 1
Creating MyBean instance: 3
Creating AnotherBean instance using MyBean with instance number: 2

通过这两个场景的对比,我们可以清楚地看到proxyBeanMethods属性的影响。

概念性东西确实很绕,有时候我们想要探寻底层原理,往往会碰壁,但是,不能放弃,多读几遍,多查查资料,兼容众家之长,把它拿下,吸收,彻底理解,慢慢的,一步一步来,不要着急!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/821765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS 开发基础(三)登录页面单向数据绑定(父组件向子组件传参)

一、目录结构认识 开发软件目录截图部分文件夹说明 文件组织结构图 二、完成单向数据绑定 index.etx // 导出方式直接从文件夹 import MyInput from "../common/commons/myInput" Entry Component /* 组件可以基于struct实现,组件不能有继承关系&am…

【JavaWeb】Javascript经典案例

Javascript经典案例 注意&#xff1a;该文章是参考b站<20个JS经典案例>进行学习的&#xff0c;没有CSS的组成。 在慢慢更新中…哈哈哈哈&#xff0c;太慢了 文章目录 1.支付定时器2.验证码生成及校验 1.支付定时器 代码实现&#xff1a; confirm.html <!DOCTYPE html…

动嘴操控“终结者”谷歌打造最强chatgpt机器人

我们知道&#xff0c;在掌握了网络中的语言和图像之后&#xff0c;大模型终究要走进现实世界&#xff0c;「具身智能」应该是下一步发展的方向。把大模型接入机器人&#xff0c;用简单的自然语言代替复杂指令形成具体行动规划&#xff0c;且无需额外数据和训练&#xff0c;这个…

Ubuntu-文件和目录相关命令

&#x1f52e;linux的文件系统结构 ⛳目录结构及目录路径 &#x1f9e9;文件系统层次结构标准FHS Filesystem Hierarchy Standard(文件系统层次结构标准&#xff09; Linux是开源的软件&#xff0c;各Linux发行机构都可以按照自己的需求对文件系统进行裁剪&#xff0c;所以众多…

【Redis】内存数据库Redis进阶(Redis主从集群)

目录 分布式缓存 Redis 四大问题搭建Redis主从集群主从数据同步原理全量同步master 如何得知 salve 是第一次来连接&#xff08;Replication Id与offset&#xff09; 增量同步master怎么知道slave与自己的数据差异在哪里&#xff08;repl_backlog原理&#xff09; 主从同步优化…

根据中序遍历和后序遍历构建二叉树(递归和迭代两种方法实现)

给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&#xff1a;[3,9,20,nu…

python使用selenium 打开谷歌浏览器闪退, 怎么解决

问题描述&#xff1a; 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 使用 Selenium 操作 Chrome 浏览器&#xff0c; Chrome 浏览器闪退 问题解决&#xff1a; 可能是以下几个方面出现了问题&#xff1a; 1. Chromedriver 版本与 Chrome 浏览器版本不匹配 你需要确保你正在…

cmake升级(ubuntu 18.04)——千万不要删除原来版本的cmake

重要提示 千万不要卸载删除ubuntu原有的cmake&#xff0c;否则之前经过原有cmake编译过的文件将也会被删除&#xff0c;比如 ros。 千万不要使用下面这句命令删除原有的 cmake &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 超级大坑&#xff0c;…

Linux第八章之进程概念

一、冯诺依曼体系结构 关于冯诺依曼&#xff0c;必须强调几点&#xff1a; 这里的存储器指的是内存不考虑缓存情况&#xff0c;这里的CPU能且只能对内存进行读写&#xff0c;不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据&#xff0c;也只能写入内存或…

基于jsp的塞北村镇旅游网站的设计与实现--【毕业论文】

文章目录 本系列校训毕设的技术铺垫文章主体层次摘要示例摘要的写法英文摘要&#xff1a; 选题目的和意义&#xff1a;与本课题相关的技术和方法综述&#xff1a;系统分析经济上的可行性技术上的可行性操作上的可行性开发结构分析 功能需求分析&#xff1a;数据流图 网站总体设…

已解决selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain: Cookie ‘

已解决selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain: Cookie ‘domain’ mismatch 文章目录 报错问题报错翻译报错原因解决方法千人全栈VIP答疑群联系博主帮忙解决报错 报错问题 粉丝群里面的一个小伙伴遇到问题跑来私信我&#…

特斯拉斥巨资收购?德国无线充电公司 Wiferion价值7600万美金

根据德国媒体Teslamag的报道&#xff0c;特斯拉据称已成功收购德国无线充电公司Wiferion&#xff0c;交易金额高达7600万美元&#xff08;相当于5.43亿元人民币&#xff09;。德国无线充电公司 Wiferion的网站页面底部显示计划于2023年实施&#xff0c;明确确认特斯拉为其母公司…

(树) 剑指 Offer 32 - II. 从上到下打印二叉树 II ——【Leetcode每日一题】

❓剑指 Offer 32 - II. 从上到下打印二叉树 II 难度&#xff1a;简单 从上到下按层打印二叉树&#xff0c;同一层的节点按从左到右的顺序打印&#xff0c;每一层打印到一行。 例如: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 20/ \15 7返回其层次遍历结果&#xff1a…

使用Three.js创建旋转的立方体

使用Three.js创建旋转的立方体 在本篇技术博客中&#xff0c;我们将介绍如何使用Three.js创建一个简单的场景&#xff0c;其中包含一个旋转的立方体。我们将学习如何设置场景、摄像机、立方体和渲染器&#xff0c;以及如何使用OrbitControls和gsap库来实现立方体的旋转动画和交…

ModuleNotFoundError: No module named ‘_sqlite3‘

前言 遇到报错信息如下&#xff1a; ModuleNotFoundError: No module named _sqlite3解决方式 参考解决方式&#xff1a; https://blog.csdn.net/jaket5219999/article/details/53512071 find / -name _sqlite*.socp /usr/lib64/python3.6/lib-dynload/_sqlite3.cpython-36…

BIO、NIO、IO多路复用模型详细介绍Java NIO 网络编程

文章目录 前言基本概念BIO过程NIO过程IO多路复用过程Java NIO编程Java NIO 核心概念Java NIO 示例 总结 前言 上文介绍了网络编程的基础知识&#xff0c;并基于 Java 编写了 BIO 的网络编程。我们知道 BIO 模型是存在巨大问题的&#xff0c;比如 C10K 问题&#xff0c;其本质就…

c++游戏制作指南(一):在冷峻的控制台上,种满缤纷

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到静渊隐者的csdn博文&#xff0c;本文是c游戏制作指南的一部&#x1f35f; &#x1f355;更多文章请点击下方链接&#x1f355; &#x1f368; c游戏制作指南&#x1f3…

国产系统大致比较和分析(优麒麟、开放麒麟、深度deepin、统信UOS、银河麒麟、中标麒麟)

前言 目前国内比较出名的系统主要包括麒麟和统信&#xff0c;其中麒麟包括了优麒麟、开放麒麟、银河麒麟和中标麒麟。统信则包括深度deepin和统信UOS&#xff0c;而统信UOS的版本还包括了A版、E版和D版。这么多版本到底有什么区别&#xff1f;需要怎么选择呢&#xff1f; 1. 桌…

面试题:说说JavaScript中内存泄漏的几种情况?垃圾回收机制

内存泄漏 一、是什么&#xff1f;二、垃圾回收机制&#xff1f;2.1、标记清除法2.2、引用计数法 三、常见内存泄露情况 一、是什么&#xff1f; 由于疏忽或错误造成程序未能释放已经不再使用的内存&#xff1b;并非指内存在物理上的消失&#xff0c;而是应用程序分配某段内存后…

前端需要知道的计算机网络知识

1 Web 机制 无论通过有线方式 (通常是网线) 还是无线方式&#xff08;比如 wifi 或蓝牙)&#xff0c;通信需要进行连接&#xff0c;网络上的每台计算机需要链接到路由器&#xff08;router&#xff09;。 路由器确保从一台计算机上发出的一条信息可以到达正确的计算机。计算机…