Spring底层原理之proxyBeanMenthod实例 动态代理 反射 Bean的拦截

proxyBeanMenthod

假设我们要进行一个系统的二次开发

然后第一次开发我们实用的是XML声明bean

二次开发的时候要用注解

我们如何把bean都加载上来呢

我们首先创建一个全新的配置类

package com.bigdata1421.config;public class SpringConfig32 {
}

我们创建一个APP

加载配置类

拿到bean并且打印

package com.bigdata1421.bean.app;import com.bigdata1421.config.SpringConfig3;
import com.bigdata1421.config.SpringConfig32;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App32 {public static void main(String[] args) {ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig32.class);String[] arr = ctx.getBeanDefinitionNames();for (String s : arr) {System.out.println(s);}}}

我们接下来就尝试

在启动SpringConfig32的时候

不仅要加载自己在类里面书写的配置

还要加载xml文件里的配置

我们只需要这一个注解就行

package com.bigdata1421.config;import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;@ImportResource("applicationContext1.xml")
public class SpringConfig32 {
}

spring内部最终就可以把这两个配置信息

组合到一个容器里面

这样就搞定了

这就是教我们系统迁移怎么做

小结

拓展

应该是在代理类里面做了方法增强,所以拿到的就是同一个对象

proxyBeanMethods

如果是true

就直接一开始创建了一个bean 然后进入spring容器里面去找bean

用事先就创建好的对象去调用方法 即返回同一个bean

如果是false

就每次执行都要去用对象执行方法

生成一个全新的对象 覆盖

我们看以前的代码

就可以进行解释

在这个类里面

你只要是运行这个方法

得到的对象就是容器中取得bean

如果关掉

就根本就是spring容器中的对象 而是你new出来的

小结小结小结

补充

动态代理是面向对象编程中的一种重要技术,它允许在运行时创建一个实现特定接口或一组接口的代理类对象,而无需显式编写这些类的实现代码。在Java中,动态代理主要通过Java反射机制实现,它通常与代理模式和AOP(面向切面编程)结合使用,以实现横切关注点的分离和增强功能。


Java中动态代理的实现方式:

  1. Java反射机制

    • Java的反射机制允许在运行时检查类、接口、方法和字段,并在运行时创建对象、调用方法、获取或设置字段值等。

    • 动态代理就是利用反射机制在运行时动态生成代理类的技术。

  2. 代理类生成

    • Java动态代理通常使用java.lang.reflect.Proxy类实现。

    • 首先定义一个接口或者获取一个接口的引用,然后使用Proxy.newProxyInstance()方法创建代理类实例。

  3. InvocationHandler接口

    • 实现动态代理需要一个实现InvocationHandler接口的类,该接口包含一个方法 invoke(Object proxy, Method method, Object[] args),在代理对象调用方法时被调用。

    • invoke()方法中,可以定义对原始方法调用的增强逻辑,例如添加日志、性能监控、事务处理等。

  4. 应用场景

    • AOP(面向切面编程):动态代理常用于实现AOP,通过代理类包装业务逻辑,实现横切关注点的分离。

    • 远程方法调用(RMI):动态代理可以用于创建远程对象的本地代理,隐藏远程调用的具体实现细节。

    • 延迟加载(Lazy Loading):动态代理可以延迟加载对象,当真正需要使用时再实例化对象。

  5. 局限性

    • 动态代理只能代理接口,无法直接代理类。

    • 由于使用了反射机制,动态代理可能会带来一定的性能开销。


Spring容器是Spring Framework的核心部分,它负责管理应用中的组件(beans)并协调它们的生命周期和配置。Spring容器的主要功能包括:

  1. 依赖注入(Dependency Injection,DI):Spring容器通过依赖注入将组件之间的依赖关系动态地注入到组件中,从而实现了松耦合。

  2. AOP(Aspect-Oriented Programming,面向切面编程):Spring容器支持AOP,允许开发者通过切面来实现跨越应用逻辑的功能,如事务管理、日志记录等。

  3. 事务管理:Spring容器提供了强大的事务管理支持,可以轻松地在应用中管理事务,支持声明式事务配置。

  4. 简化JDBC操作:Spring提供了JDBC模板(JdbcTemplate)等工具类,简化了数据库操作,减少了样板代码。

  5. 事件发布和监听:Spring容器支持事件驱动模型,可以发布事件并允许其他组件监听这些事件,实现了解耦和增强灵活性。

  6. 面向接口编程:Spring鼓励面向接口编程,通过接口来实现依赖注入,使得代码更易于测试和维护。

Spring容器主要有两种类型:BeanFactoryApplicationContext。ApplicationContext是BeanFactory的子接口,提供了更多的企业级功能,如国际化、事件传播等,是在大多数应用中推荐使用的容器类型。

总体来说,Spring容器是Spring框架的核心,它通过依赖注入和面向切面编程等特性,极大地简化了Java应用的开发和维护工作。


proxyBeanMethods是Spring框架中的一个配置选项,它主要用于控制Spring Boot中@Configuration类的代理行为。在Spring中,通常使用@Configuration注解来标记一个类,表示这是一个配置类,可以包含@Bean方法用于定义Spring Bean。

作用和用法:

  1. 默认行为

    • 默认情况下,Spring会对@Configuration类进行CGLIB代理,以确保@Bean方法的调用可以被拦截,从而管理@Bean方法返回的实例的生命周期和依赖关系。

  2. proxyBeanMethods选项

    • proxyBeanMethods = true:这是Spring Boot 2.2版本引入的默认值。表示Spring会对@Configuration类进行代理,以支持方法调用的拦截和依赖管理。

    • proxyBeanMethods = false:这个选项告诉Spring不要对@Configuration类进行代理。这在某些情况下可以提高性能,尤其是当@Configuration类中的@Bean方法很简单,不涉及复杂的依赖关系时。

  3. 性能考虑

    • proxyBeanMethods = false时,Spring不会为@Configuration类生成代理,这意味着@Bean方法的调用将直接返回实例,不经过Spring的AOP拦截器和增强处理,可以提高应用程序的启动性能和运行时性能。

    • proxyBeanMethods = true时,虽然增加了一些性能开销,但可以确保@Bean方法的各种功能(如AOP切面、依赖注入等)得到正确的支持和管理。

  4. 配置方式

    • 在Spring Boot中,可以通过在@Configuration类上使用@Configuration(proxyBeanMethods = true)或者@Configuration(proxyBeanMethods = false)来显式指定代理行为。

  5. 建议

    • 通常情况下,使用默认的proxyBeanMethods = true是比较安全的选择,因为它保证了Spring框架的各种功能可以正常工作。只有在确实需要优化性能时,才考虑将其设置为false


在Spring框架中,确保@Bean方法的调用可以被拦截意味着Spring容器能够拦截对@Configuration类中@Bean方法的调用,并在需要时执行一些额外的逻辑或者处理。

具体来说,对@Configuration类中@Bean方法的拦截可以实现以下几个方面的功能:

  1. AOP切面

    • Spring框架支持通过AOP(面向切面编程)拦截@Bean方法的调用。这意味着你可以使用切面来在方法执行前后执行额外的逻辑,比如日志记录、性能监控、安全性检查等。

  2. 依赖注入

    • 当@Bean方法返回的对象有依赖其他Spring管理的Bean时,Spring需要拦截@Bean方法的调用,以确保依赖的Bean可以被正确注入。

  3. 单例管理

    • Spring默认情况下会将@Configuration类中@Bean方法返回的对象作为单例管理,即每次调用@Bean方法返回的是同一个实例。这需要Spring能够拦截@Bean方法的调用,并按照单例的要求进行管理。

  4. 条件化Bean的注册

    • 通过条件化的方式,可以根据一定条件决定是否注册某些@Bean方法返回的Bean实例。Spring在拦截@Bean方法时,可以根据条件进行判断,从而控制Bean的注册。

  5. Bean生命周期管理

    • Spring框架负责管理@Bean方法返回的Bean的生命周期,包括初始化和销毁阶段。拦截@Bean方法的调用是确保Spring可以在需要时执行这些生命周期管理操作的关键。

总体来说,Spring框架通过拦截@Configuration类中@Bean方法的调用,能够实现对Bean的完整管理和控制,包括依赖注入、生命周期管理、AOP增强等。这种机制确保了Spring的IoC(控制反转)和DI(依赖注入)特性能够正常工作,使得开发者能够专注于业务逻辑的实现而不必关心底层的管理和维护工作。


个人号推广

博客主页

多多!-CSDN博客

Web后端开发

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端开发

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

数据库开发

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

项目实战

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法与数据结构

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

计算机基础

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回忆录

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

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

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

相关文章

全球最快的 JSON 文件查询工具

本文字数:1684;估计阅读时间:5分钟 审校:庄晓东(魏庄) 本文在公众号【ClickHouseInc】首发 介绍 在 ClickHouse,我们热衷于基准测试和性能优化。所以当我第一次看到 Hacker News 上那篇“查询大…

代码随想录算法训练营day31|134.加油站、135. 分发糖果、406.根据身高重建队列

134.加油站 如下图所示&#xff1a; 当索引一道2的时候&#xff0c;剩余油量的总量13-6 < 0&#xff0c;这个时候说明以索引0为起点不合适&#xff0c;将起点更新为索引3. 两点证明&#xff1a; 1.如果我们从蓝色段中间选一个点开始&#xff0c;是不是最后sumGas就不小于0…

从灵感到成品:使用AI生成博客文章的完整指南

在信息爆炸的时代&#xff0c;每个人都有讲述自己故事的权利和需求。博客作为一种表达方式&#xff0c;不仅能记录个人经历&#xff0c;还能分享知识和观点。然而&#xff0c;许多人在写博客文章时&#xff0c;常常会遇到灵感枯竭、时间不够用或者不知道如何开始等问题。幸运的…

光伏储能系统/安科瑞DTSD1352-CF双向计量表-安科瑞 蒋静

1 长期以来&#xff0c;我国施行居民用电低价政策&#xff0c;居民电价大幅低于供电成本&#xff0c;虽然实施了全天分三时段的阶梯电价政策&#xff0c;但过去近10年中高峰节电的效果却不够明显。从分时用电运作机制来看&#xff0c;居民用电价格的波动幅度不大&#xff0c;但…

华为云鲲鹏架构docker部署2048小游戏

华为云鲲鹏架构docker部署2048小游戏 1. 鲲鹏架构ESC2. 配置docker3. 上传2048镜像4. 删除容器,镜像 1. 鲲鹏架构ESC 2. 配置docker 安装dockeryum -y install docker开机启动 systemctl enable docker启动docker服务 systemctl start docker查询docker的运行版本 docker -v3…

时序分析基本概念介绍——min pulse width 最小脉冲宽度

文章目录 前言一、什么是 min pulse width&#xff1f;二、为什么检查 min pulse width&#xff1f;三、如何设置 min pulse width约束&#xff1f;1. 在sdc里面定义2. library里面定义 四、如何检查 min pulse width&#xff1f;五、如何修复 min pulse width&#xff1f;总结…

docker启动ws-scrcpy和redroid记录

git克隆最新的ws-scrcpy代码 git clone gitgithub.com:NetrisTV/ws-scrcpy.git进入ws-scrcpy目录新建Dockerfile文件&#xff0c;内容如下 FROM node:16-alpine WORKDIR /appRUN npm config set registry http://mirrors.cloud.tencent.com/npm/ RUN npm install -g node-gyp…

攻防世界-Web题目1

目录 cookie 1、题目 2、知识点 3、思路 get_post 1、题目 2、知识点 3、思路 disabled_button 1、题目 2、知识点 3、思路 backup 1、题目 2、知识点 3、思路 cookie 1、题目 2、知识点 cookie&#xff0c;数据包 3、思路 题目提示我们cookie&#xff0c;抓…

【ai】trition:tritonclient.utils.shared_memory 仅支持linux

Can’t find tritonclient.utils.shared_memory on WIN10 #4149yolov4的python客户端 导入以后,windows 的pycharm 就是看不到折腾了很久:SaviorEnv 环境下安装tritonclient[all]也会失败 (base) C:\Users\zhangbin>conda create -n SaviorEnv python=3.8 Collecting pack…

ubuntu 18 虚拟机安装(1)

ubuntu 18 虚拟机安装 ubuntu 18.04.6 Ubuntu 18.04.6 LTS (Bionic Beaver) https://releases.ubuntu.com/bionic/ 参考&#xff1a; 设置固定IP地址 https://blog.csdn.net/wowocpp/article/details/126160428 https://www.jianshu.com/p/1d133c0dec9d ubuntu-18.04.6-l…

元数据管理的发展历程你了解吗?元数据管理要克服哪些挑战?

在当今的信息化时代&#xff0c;数据的价值已被广泛认可&#xff0c;而元数据作为描述数据的数据&#xff0c;其作用日益凸显。元数据管理&#xff0c;作为确保数据质量、促进数据共享和提高数据透明度的关键环节&#xff0c;对企业的数据战略至关重要。随着技术的发展&#xf…

C#1.0-11.0所有历史版本主要特性总结

文章目录 前言名词解释主要版本一览表各版本主要特性一句话总结 C# 1.0 (Visual Studio 2002, .Net Framework 1.0)C# 2.0 (Visual Studio 2005, .Net Framework 2.0)C# 3.0 (Visual Studio 2008, .Net Framework 3.0)C# 4.0 (Visual Studio 2010, .Net Framework 4)C# 5.0 (V…

DataWhale - 吃瓜教程学习笔记(三)

学习视频&#xff1a;第3章-对数几率回归_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 3.3 对数几率回归 sigmoid函数 极大似然估计建模 信息论 以概率论、随机过程为基本研究工具&#xff0c;研究广义通信系统的整个过程 - 信息熵 &#xff08;信息期望&#xff09; 度…

Windows bat 提取多个目录下的文件,到一个目录

批处理命令 echo off setlocalrem 设置源目录和目标目录 set "sourceDirE:\motrix" set "targetDirE:\新建文件夹"rem 创建目标目录&#xff0c;如果不存在 if not exist "%targetDir%" mkdir "%targetDir%"rem 循环遍历源目录中的所…

TCP:TCP连接的建立与终止

TCP连接的建立与终止 建立连接第一次握手第二次握手第三次握手 终止连接第一次挥手第二次挥手第三次挥手第四次挥手 T C P是一个面向连接的协议。无论哪一方向另一方发送数据之前&#xff0c;都必须先在双方之间建立一条连接。本文将详细讨论一个T C P连接是如何建立的以及通信…

2024年能源电力行业CRM研究报告

中国能源电力行业属于大制造业的重要组成部分&#xff0c;在国民经济中的地位举足轻重。据统计&#xff0c;近十年来能源电力行业的整体投资呈现出增长趋势&#xff0c;尤其是“十四五”期间增长显著&#xff0c;2022年全国主要电力企业共完成投资12470亿元&#xff0c;同比增长…

【乐吾乐2D可视化组态编辑器】连线

1 连线的绘制 1.1 钢笔绘制连线 1.1.1 曲线、线段、直线、脑图曲线 开始&#xff1a;单击左键 暂停&#xff1a;单击右键 或 enter 结束&#xff1a;esc 乐吾乐2D可视化组态编辑器demo&#xff1a;https://2d.le5le.com/ 1.1.2 横线 按下快捷键shift,点击鼠标左键绘制…

101.6k星的后台巨擘:一站式SaaS多租户、商城、CRM、ERP解决方案

RuoYi-Vue Pro,一个丰富优化重构的后台管理系统,为企业提供了一个强大、灵活、易用的解-决方案。 特点 丰富的功能支持:包括RBAC动态权限、数据权限、SaaS多租户、工作流、三方登录、支付、短信等。 现代化的技术栈:基于Spring Boot、MyBatis Plus、Vue & Element,支持…

在UE中创建命名管道之创建UE蓝图类

需求 在实际工作遇到了需要 UE 开发进程间通信相关的需求。 经过思考后选择使用命名管道来实现 。 名词概念 首先什么是进程间通信: 进程间通信&#xff08; Inter-Process Communication&#xff0c;IPC&#xff09;是指在操作系统中&#xff0c;不同进程之间进行数据交换…

大厂面试官问我:Redis内存淘汰,LRU维护整个队列吗?【后端八股文四:Redis内存淘汰策略八股文合集】

往期内容&#xff1a; 大厂面试官问我&#xff1a;Redis处理点赞&#xff0c;如果瞬时涌入大量用户点赞&#xff08;千万级&#xff09;&#xff0c;应当如何进行处理&#xff1f;【后端八股文一&#xff1a;Redis点赞八股文合集】-CSDN博客 大厂面试官问我&#xff1a;布隆过滤…