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

news2024/11/18 15:32:04

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.coloradmin.cn/o/1867607.html

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

相关文章

R语言数据分析案例37-旅游景点聚类分析

一、研究背景 近年来,随着旅游业的迅猛发展,旅游景点的竞争日益激烈。如何在众多景点中脱颖而出,吸引更多游客,成为各大景点管理者关注的焦点。通过对旅游景点进行深入的数据分析,可以帮助管理者更好地了解景点的优势…

HashMap第5讲——resize方法扩容源码分析及细节

put方法的源码和相关的细节已经介绍完了,下面我们进入扩容功能的讲解。 一、为什么需要扩容 这个也比较好理解。假设现在HashMap里的元素已经很多了,但是链化比较严重,即便树化了,查询效率也是O(logN),肯定没有O(1)好…

最新MDYS14源码影视视频网站模板/苹果CMS系统/附搭建教程

最新MDYS14源码影视视频网站模板/苹果CMS系统/附搭建教程 基本介绍: 1、后台增加自定义参数,对应会员升级页面,以及积分充值 2、视频,演员,专题,收藏,会员系统模块齐全,支持子分类…

本地读取classNames txt文件

通过本地读取classNames,来减少程序修改代码,提高了程序的拓展性和自定义化。 步骤: 1、输入本地路径,分割字符串。 2、将className按顺序放入vector容器中。 3、将vector赋值给classNmaes;获取classNames.size(),赋值给CLASSES;这样,类别个数和类别都已经赋值完成。…

阀门盘根的介绍

盘根(编制盘根)(packing)也叫密封填料,通常由较柔软的线状物编织而成,通常截面积是正方形或长方形、圆形的条状物填充在密封腔体内,从而实现密封。填料密封最早是以棉麻等纤维塞在泄漏通道内来阻止液流泄漏…

牛客挑战赛75 D. 不存在的玩家(sg图dp)

题目 思路来源 灵茶山群群友 https://blog.csdn.net/Code92007/article/details/110354429 题解 其实想了想,和20年小米邀请赛决赛这个G题的dp思路是一样的,姑且称为sg图dp吧 按sg值从大到小dp,每次补上全局sg值-1的这些点, …

XML简介XML 使用教程XML的基本结构XML的使用场景

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

VCS编译bug汇总

‘typedef’ is not expected to be used in this contex 注册前少了分号。 Scope resolution error resolution : 声明指针时 不能与类名同名,即 不能声明为adapter. cannot find member "type_id" 忘记注册了 拼接运算符使用 关键要加上1b&#xff0…

开发板以电脑为跳板连接互联网

标题 开发板以电脑为跳板连接互联网网络共享方式桥接方式 开发板以电脑为跳板连接互联网 分享下用网线直连电脑的开发板如何以电脑为跳板连接互联网的两个方法。 网络共享方式桥接方式 补充下,我的电脑连接的是无线网络,开发板和电脑是用网线进行连接的…

Microsoft Teams新版升级或安装方法

Microsoft Teams作为一款国际化公司会议软件,在2024年7月1日起不再支持经典版本,提示升级New Teams。 由于New Teams官网提供的Windows系统安装包并不是传统的可执行文件MSI,EXE等,而是新型封装的MSIX格式,无法直接双击…

Vitis IDE 艰难切换--从传统 Vitis GUI 到 2024.1 统一软件界面

目录 1. 简介 2. 界面展示 2.1 启动方式 2.2 Settings 对比 3. 创建 HLS 工程 3.1 选择 HLS 组件 3.2 名称和路径 3.3 创建配置文件 3.4 选择综合源文件和TestBench 3.5 选择硬件平台 3.6 配置Clock和Flow 3.7 查看摘要 3.8 新建组件完毕 4. 总结 1. 简介 Vitis…

海南聚广众达电子商务咨询有限公司抖音电商服务专家

在当下这个数字化浪潮汹涌的时代,电子商务无疑是商业领域的一颗璀璨明星。而在这其中,抖音电商以其独特的魅力,吸引了无数目光。海南聚广众达电子商务咨询有限公司,作为抖音电商领域的佼佼者,以其敏锐的洞察力和卓越的…

无人机操作注意事项

检查飞行设备 每次飞行前,要认真检查无人机的各处细节,遥控器等地面设备也不例外。 确保设备电量充足 起飞前,检查无人机是否电量充足,以及辅助设备如遥控器、手机等。 选择空旷的飞行场地 选择适宜的场地进行操作&#xff0…

“我,前YC学员,做了新创业项目——用AI把帽子空投给纽约客”

大数据产业创新服务媒体 ——聚焦数据 改变商业 当大部分工程师还在用AI技术打造改变世界的产品,建立自己的商业帝国时,纽约的创业者James Steinberg另辟蹊径,研究如何利用AI把帽子精准地扔给路过自家楼下的路人。 不得不说,这种…

Uniapp打包苹果app证书过期操作流程+辅助工具【香蕉云编】(没有苹果电脑可以使用香蕉云编,有的另说)

1、登录香蕉云编,创建ios证书 2、登录苹果开发者,在【Certificates】创建新的描述并且将【1步骤中csr文件】上传,后 创建成功后将后缀为【cer】文件下载下来, 然后到香蕉云编中上传cer文件,并生成p12文件 3、删除过期文…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十八)

课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 28 节) P28《27.网络连接-Http请求数据》 案例: 这里不懂后端假设服务器的前端小伙伴就需要课程源码资料了…

网易严选礼品卡有什么用?

网易严选的礼品卡可以在网易商城里买东西 但是现在好多人买东西基本上都用的是淘宝京东之类的 很少会有人用网易吧 但是最近我朋友送了我几张网易的卡,我自己也用积分兑换一张,一直不知道怎么用 最后还是在收卡云上转让出去了,价格高不说…

引用别的组件

在脚本中,也可以引用别的物体下的组件。 第一种办法, (1)添加一个变量, public GameObject bgmNode ; 然后在检查器里指定这个引用。 例如:在背景音乐空物体下面有个Audio Source组件 游戏主控脚本代码…

简单的springboot整合activiti5.22.0

简单的springboot整合activiti5.22.0 1. 需求 我们公司原本的流程服务是本地workflow模块以及一个远程的webService对应的activiti服务,其中activiti版本为5.22.0,之前想将activiiti5.22.0进行升级,选择了camunda,也对项目进行了…

Houdini 通过wedge来做模拟参数对比 (PDG TOP)

我们的设定如下例子 这是个简单的布料悬挂的例子。上方两个角分别被固定住了,然后在distance约束下布料下垂。 我们现在的目的是想要对比不同的streach stiffness对模拟的影响。 第一步:找到stiffness参数,右键expression->edit expre…