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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Intentional设计分析,一款个人提效的AI产品

Intentional 是一款专注于提高工作效率的应用程序。 它允许用户设定上网目标,并会自动屏蔽与目标无关的网站,帮助用户保持专注,避免在网上无谓地浏览和分心。 这款应用程序是由开发者 Samy RAHIM 创造的,为了解决当今上网时容易…

AIPainter:创意绘画的智能助手

AIPainter 介绍 AIPainter是一款简单易用的AI画图工具,支持文生图、图生图(提示词改图、图片变体、分辨率增强等),底层大模型基于开源的腾讯混元文生图、SDXL等。 功能特点 提示词库 AIPainter默认提供了一些常用场景的提示词供…

PLC梯形图(置位与复位)的使用方法

置位指令相当于我们把照明灯的开关按到开的状态,即便我们把手离开,开关也是通的,灯也是亮的。 想要关闭必须要把它按到关的状态,即使用复位指令。 复位指令相当于我们把照明灯的开关按到关的状态,把手离开,开关也是断的,灯也是不亮的。 想要打开必须要把它按到开的状…

【JPCS独立出版】2024计算建模与应用数学国际学术会议暨中俄微分方程及其应用学术会议(CMAM 2024 DEA,8月2-4)

2024计算建模与应用数学国际学术会议暨中俄微分方程及其应用学术会议(CMAM 2024 & DEA)由大连海事大学理学院主办,上海海关学院、俄罗斯科学院科学城数学中心、辽宁省数学学会、大连市数学学会协办,AEIC学术交流中心承办。会议…

还不到6个月,GPTs黄了

相比起来,人们还不如使用一个足够强大、灵活且通用的AI助手来满足各类复杂需求。更严重的是一些独立GPTs显露出的安全隐患。除此之外,最大的问题在于OpenAI模糊不清的货币化政策。 文章正文 上周,不少人发现微软官网忽然更新了一条“GPT Bu…

AD手动添加网络

AD手动添加网络,(用于不画原理图直接画PCB用)一看就懂_ad不用原理图画pcb-CSDN博客https://blog.csdn.net/feifeiccode/article/details/107198441#:~:text%E6%B7%BB%E5%8A%A0%E8%A6%81%E6%B7%BB%E5%8A%A0%E7%9A%84%E7%BD%91%E7%BB%9C,%E6%8C…

Android简介-历史、API等级与体系结构

1. Android简介 Android是一种基于Linux内核的自由及开放源代码的操作系统。最初是由安迪鲁宾(Andy Rubin)开发的一款相机操作系统。2005年8月被Google收购。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。…

GISSERVER 管理器 1.0(私有化地图离线部署)

一、 简介 QGIS现在在全世界已经成为ARCGIS的最佳代替产品,而且是开源免费的。其用户社区和产品功能都已经可以与arcgis相媲美! GISSERVER管理工具是一个零代码地图网站建站工具(私有化地图离线部署),可以直接将QGIS工程转换为GIS网站(功能类似ARCGISM…

中国版Sora来了!一键生成16秒1080P的AI视频,直面对标OpenAI

追赶 OpenAI 文生视频模型 Sora 需要多久?在中关村论坛未来人工智能先锋论坛上,中国首个长时长、高一致性、高动态视频大模型 Vidu 正式发布,支持一键生成长达 16 秒、分辨率为 1080P 的高清视频内容。 Vidu 生成的视频 demo 甫一发布,便迅速…

Java25年还有更多的工作岗位适合二本学生就业吗?

Java作为一种广泛使用的编程语言。尽管技术领域不断发展和变化,Java依然在许多行业中占据重要地位。以下是一些原因,刚好我有一些资料,是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」, 点个关注在评论区…

Linux通用LInux高危漏洞(CVE-2024-1086)修复案例

一、漏洞描述 2024年3月28日,监 Linux kernel权限提升漏洞(CVE-2024-1086)的PoC/EXP在互联网上公开,该漏洞的CVSS评分为7.8,目前漏洞细节已经公开披露,美国网络安全与基础设施安全局(CISA&…

政务网站(.gov)应选择什么样的SSL证书

政府网站作为公共服务的重要平台,承载着发布政策信息、提供在线服务、促进政民互动等功能,其数据安全性和网站可信度尤为重要。因此,选择合适的SSL证书对于政府网站而言,不仅是遵循网络安全法规的需要,也是提升公众信任…

OpenCV-Python——环境配置及图像基本操作

一、环境配置 1、在虚拟环境中安装以下库: opencv-python3.4.1.15 opencv-contrib-python3.4.1.15 建议安装3.4.1的版本,3.4.2之后的版本做了专利保护,有的功能不能实现。 虚拟环境的安装以及安装库的问题见PyQt5专栏中的第一节。 2、安…

权限传递,提取明文密码

一、cs与msf权限传递 创建foreign监听器-->msf监听模块设置端口-->cs执行新建会话选择创建的监听器 1.创建监听器: 2.msf监听设置端口: use exploit/multi/hander set payload windows/meterpreter/reverse_http set lport 4444 exploit 二、mi…

书酒共舞:品味文字之韵,沉醉酒香之境

在喧嚣的都市中,我们常常渴望找到一片宁静的角落,让心灵得到片刻的休憩。此刻,一杯雷盛红酒与一本心仪的书籍,便成了很好的伴侣,它们相互映衬,共同编织出一幅优雅的画卷,让我们在品味中感受文字…

三、循环语句

循环语句 今日目标: 能够理解循环语句的四个组成部分能够知道三种循环的各自格式和执行流程能够知道三种循环的区别能够使用循环语句完成今日案例能够知道跳转语句的使用场景 1:for循环结构 来,继续啊,下面我们来学习循环结构…

什么牌子的开放式耳机质量好?五大优质机型,新手必看!

耳机的应用场景越来越多,各种类型的耳机开石出现,开放式耳机就是其中一种。从最初的单一音效到现在的高清晰度解析,开放式耳机已经是非常成熟的产品。耳机不仅音质纯净,佩戴起来也极为舒适,无论你身在何处,…

element 问题整合

没关系,凡事发生必有利于我 文章目录 一、el-table 同级数据对齐及展开图标的位置问题二、el-table 勾选框为圆角及只能勾选一个 一、el-table 同级数据对齐及展开图标的位置问题 element 官方提供的扩展tree型数据在表格里默认是靠左边对齐,项目需求需要…

一键下单“鲜”到先得!生鲜电商小程序解决方案

随着消费者生活节奏的加快,以及移动互联网技术的普及,人们对于便捷、高效、个性化的生鲜购物体验需求日益旺盛。生鲜电商小程序以其独特的优势,正在改变着传统生鲜零售的格局,越来越多的消费者选择在线上购买生鲜食品,…

第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

重要信息 会议官网:www.icbase.org(查看详情) 会议时间:2024年9月20-22日 会议地点:中国温州 截稿时间:以官网信息为准 收录检索:EI Compendex,Scopus稳定检索 *更多优质学术会…