动态代理与Spring Aop

news2024/12/28 11:11:30

动态代理

  1. JDK 动态代理 使用JAVA反射包中的类和接口实现动态代理的功能,JAVA.lang.reflect包;主要是三个类:

InvocationHandler,Method,Proxy;

  1. CGLIB动态代理,第三方工具类库,创建代理对象,cglib的原理是继承,通过继承目标类,创建它的子类,在子类中重写父类中同名的方法,实现功能的修改

    注意:cglib是继承,重写方法,所以要求目标类不能是final修饰的,方法也不能是final的,cglib的要求目标类比较宽松,只要继承就可以了,cglib在很多的框架中使用,比如mybatis,spring框架中都有使用

JDK动态代理

  1. Method类表示方法,目标类的方法;通过Method可以执行某个目标类的方法 Method.invoke();

  2. InvocationHandler接口(调用处理器) 就一个方法Invoke方法

public Object invoke(Object proxy, Method method, Object[] args)
 throws Throwable;
  1. Proxy类:核心的对象 创建代理对象

    @param ClassLoader 目标类加载器 getClass().getClassLo ader()

    @param interfaces 接口 目标类实现的接口 也是反射获取的

    @param InvocationHandler 代理类要完成的功能 我们自己写的

    @return 目标对象的代理对象

public static Object newProxyInstance(ClassLoader loader,
                                   Class<?>[] interfaces,
                                   InvocationHandler h){}

AOP

在这里插入图片描述
在这里插入图片描述


Spring三级循环依赖

三级缓存是如何避免循环依赖

在这里插入图片描述


@Autowired(类型注入),@Resource(名称注入) 注解依赖注入如何避免循环依赖

如果存在循环依赖,即 Bean A 依赖于 Bean B,而 Bean B 又依赖于 Bean A,则 Spring 会先创建 Bean A,并将其注入到 Bean B 中的代理对象中,然后再创建 Bean B,并将代理对象注入到 Bean A 中。代理对象可以避免循环依赖问题,因为它并不是完整的 Bean 实例,而是一个动态生成的代理对象,只有在真正需要使用 Bean 实例时才会触发创建。


AOP过程中生成的代理对象是谁管理的

AOP 产生的代理对象实际上是 Bean 实例的一种,因此代理对象会被放到 IOC 容器中管理。但是,代理对象并不是通过三级缓存来管理的,而是通过 BeanPostProcessor 接口来创建和管理

**BeanPostProcessor 接口是 Spring 中非常重要的接口之一,**它定义了在 Bean 创建过程中的两个回调方法:postProcessBeforeInitialization() 和 postProcessAfterInitialization()。在 Bean 创建过程中,当 Spring 创建一个 Bean 实例后,会先调用 postProcessBeforeInitialization() 方法,然后再调用 postProcessAfterInitialization() 方法。


代理对象直接替换掉原来的bean吗

在 Spring 中,AOP 产生的代理对象是通过 BeanPostProcessor 接口来创建和管理的。当 Spring 创建一个 Bean 实例时,如果该 Bean 需要使用 AOP,会先创建一个代理对象,然后将代理对象注入到 Bean 实例中。

具体来说,代理对象的注入过程分为以下几个步骤:

  1. Spring 通过 BeanPostProcessor 接口的 postProcessAfterInitialization() 方法创建代理对象。
  2. Spring 将代理对象作为参数传递给 postProcessAfterInitialization() 方法,同时也会将 Bean 的名称和类型等信息传递给该方法。
  3. 在 postProcessAfterInitialization() 方法中,如果需要创建代理对象,则可以使用 Spring 提供的 AOP API(例如 ProxyFactoryBean)来创建代理对象,并将其注入到 Bean 实例中。
  4. Spring 将代理对象注入到 Bean 实例中,替换原来的 Bean 实例。

原来的 Bean 实例已经完成了所有的初始化工作(包括属性注入、生命周期回调等),而代理对象则是在这个基础上进行的增强。因此,在使用 AOP 时,需要确保代理对象的增强不会影响到 Bean 实例的初始化和生命周期回调等操作


Bean容器与三级缓存容器的相关

Bean 实例是按照名称或类型进行管理的。

存放 Bean 的容器和三级缓存的三个容器虽然都是 Map 集合,但是它们的作用和管理方式是不同的。存放 Bean 的容器是用于管理所有 Bean 实例的,它负责创建和管理 Bean 实例,并将 Bean 实例按照名称或类型进行分类和管理。而三级缓存则是用于解决循环依赖问题的,它只在出现循环依赖时才会被使用。

在 Spring 中,存放 Bean 的容器和三级缓存的三个容器之间的关系可以简单描述如下:

  1. 当 Spring 创建一个 Bean 实例时,首先会检查该 Bean 实例是否已经被创建。如果该 Bean 实例已经被创建,则直接从存放 Bean 的容器中获取该 Bean 实例,否则进入下一步。
  2. 如果该 Bean 实例还未被创建,则会检查该 Bean 实例是否处于循环依赖中。如果该 Bean 实例处于循环依赖中,则会将该 Bean 实例放入三级缓存中的第一个 Map 集合中,否则进入下一步。
  3. 如果该 Bean 实例既不处于循环依赖中,也没有被创建过,则会创建该 Bean 实例,并将其放入存放 Bean 的容器中进行管理。

三级缓存解决了循环依赖之后,会生成bean实例

总之,在 Spring 中,三级缓存最终会生成 Bean 实例。当一个 Bean 实例处于循环依赖中时,Spring 会将其放入三级缓存中的第一级缓存中,并在后续的处理中逐步生成该 Bean 实例。三级缓存中的 Bean 实例是按照依赖关系顺序进行创建的,并最终被放入存放 Bean 的容器中进行管理。需要注意的是,不是所有的 Bean 实例都会进入三级缓存中,只有处于循环依赖中的 Bean 实例才会进入三级缓存。


可以理解为三级缓存只是暂时的缓存bean示例工具,最后解决完依赖注入之后,将bean放回到bean容器中

三级缓存只是 Spring 中用于解决循环依赖问题的一个临时工具,它并不是用来管理所有的 Bean 实例的。当 Spring 创建 Bean 实例时,如果发现该 Bean 实例处于循环依赖中,就会将该 Bean 实例放入三级缓存中,在后续处理中逐步生成该 Bean 实例。当所有的 Bean 实例都创建完成后,Spring 会将它们放入存放 Bean 的容器中进行管理。

需要注意的是,三级缓存只是一个暂时的缓存工具,它并不是用来管理 Bean 实例的长期存储工具。一旦 Bean 实例被创建成功并放入存放 Bean 的容器中进行管理,它们就不再需要被存储在三级缓存中了。因此,在 Spring 中,三级缓存只是一个用于解决循环依赖问题的辅助工具,其生命周期和作用范围是有限的。


Bean容器

Bean 容器的构造实际上是由 ApplicationContext 接口的实现类来完成的。ApplicationContext 接口是 Spring 中应用上下文的核心接口,它继承了 BeanFactory 接口,提供了更多的功能,例如国际化支持、事件传播、应用上下文层次结构等

ApplicationContext 接口的实现类的构造过程一般包括以下几个步骤:

  1. 解析配置文件:ApplicationContext 接口的实现类需要解析配置文件,将配置文件中定义的 Bean 实例信息解析成相应的 Java 对象,例如 BeanDefinition 对象等。

  2. 创建 Bean 实例:ApplicationContext 接口的实现类需要根据配置文件中定义的 Bean 实例信息,创建相应的 Bean 实例。这个过程一般包括 Bean 实例化、属性注入、生命周期回调等步骤。

  3. 注册 Bean 实例:ApplicationContext 接口的实现类需要将创建好的 Bean 实例注册到 Bean 容器中。在注册 Bean 实例时,需要将 Bean 实例按照名称或类型进行分类和管理。

  4. 处理 Bean 实例之间的依赖关系:ApplicationContext 接口的实现类需要处理 Bean 实例之间的依赖关系。这个过程一般包括解析依赖关系、查找依赖对象、注入依赖对象等步骤。

  5. 初始化容器:ApplicationContext 接口的实现类需要初始化容器,包括初始化事件监听器、初始化 AOP 相关的对象、初始化国际化相关的对象等。

  6. 启动容器:ApplicationContext 接口的实现类需要启动容器,使得容器能够开始工作。在启动容器时,需要完成容器的预处理、事件监听器的注册、AOP 代理的生成等步骤。

ApplicationContext 接口的实现类可以有多种方式来完成 Bean 容器的构造。例如,ClassPathXmlApplicationContext 类可以使用 XML 配置文件来构造 Bean 容器;AnnotationConfigApplicationContext 类可以使用 Java 配置类来构造 Bean 容器;WebApplicationContext 接口的实现类可以在 Web 应用程序中构造 Bean 容器等。不同的实现方式可能会有一些细节上的差异,但是它们的基本构造过程都是类似的。


IOC

spring的IOC是通过什么实现的?

pring中IOC的实现主要是由BeanFactoryApplicationContext这两个核心接口以及它们的多个实现类来完成的。

  • BeanFactory是IOC容器的基础接口,提供了最基本的IOC功能,例如根据名称或类型获取bean等。
  • ApplicationContextBeanFactory的基础上增加了更多的企业级功能,例如国际化支持、事件驱动、AOP等。它是Spring应用程序中使用最广泛的容器。

在具体实现上,Spring IOC的核心代码在spring-core模块中,其中通过XmlBeanDefinitionReader等类对XML配置文件进行解析,并将解析结果存储在BeanDefinition对象中,然后将BeanDefinition对象注册到IOC容器中。当应用程序需要访问某个bean时,IOC容器根据BeanDefinition信息创建相应的bean并返回给应用程序。

除了XML配置方式外,Spring还支持注解和Java配置方式来定义bean,从而更加灵活地满足不同场景下的需求。

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

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

相关文章

城市内涝监测需要什么设备

近年来&#xff0c;随着城市化进程的加快&#xff0c;城市内涝问题愈发突出。强降雨、缺乏排水设施和过度的人类活动等因素&#xff0c;导致城市内涝灾害频发。内涝不仅给居民生活和财产安全带来威胁&#xff0c;还对城市基础设施和经济发展造成严重影响。 为了应对城市内涝灾…

spring中事务失效的情况(常见的5种)

1.多线程调用 从上面的例子中&#xff0c;我们可以看到事务方法add中&#xff0c;调用了事务方法doOtherThing&#xff0c;但是事务方法doOtherThing是在另外一个线程中调用的。 这样会导致两个方法不在同一个线程中&#xff0c;获取到的数据库连接不一样&#xff0c;从而是两…

centos7宝塔项目配置步骤

0、 1、 2、前面两个空格去掉勾 3、window 配置虚拟机 对应的域名

Django高级扩展之celery使用

Celery是一个简单、灵活、可靠的分布式系统&#xff0c;用于处理大量消息&#xff0c;同时为操作提供维护此类系统所需的工具。是一个专注于实时处理的任务队列&#xff0c;同时还支持任务调度。 目录 应用场景 问题 解决 celery架构图 安装 配置celery Settings.py配置…

CVE-2022-25099

文章目录 CVE-2022-25099一、漏洞介绍二、渗透步骤1、打开网站2、登录后台3、文件上传4、查看flag值 CVE-2022-25099 一、漏洞介绍 WBCE CMS v1.5.2 RCE。 WBCE CMS v1.5.2 /language/install.php 文件存在漏洞&#xff0c;攻击者可精心构造文件上传造成RCE。 二、渗透步骤 1…

宝塔面板实用教程(1):10分钟部署在线客服系统

客服系统发布以来&#xff0c;一直有朋友询问如何在宝塔面板中安装部署&#xff0c;开始我一直认为参考 Linux 版的安装教程就可以了&#xff0c;一直没有专门写宝塔环境的教程。这段时间来咨询的朋友越来越多&#xff0c;经过了解&#xff0c;我才知道宝塔面板的普及率有多高&…

SSM流浪动物救助网站-计算机毕设 附源码82131

SSM流浪动物救助网站 摘 要 随着生活水平的持续提高和家庭规模的缩小&#xff0c;宠物已经成为越来越多都市人生活的一部分&#xff0c;随着宠物的增多&#xff0c;流浪的动物的日益增多&#xff0c;中国的流浪动物领养和救助也随之形成规模&#xff0c;同时展现巨大潜力。本次…

XML文件

xml文件 类似于html那种标签语言 但是用途却大不一样&#xff0c;xml一般用于小型数据传输&#xff08;存储数据&#xff09; xml文件作用 xml语法规则 一个简单的xml文件案例 xml解析 解析思想 所谓的xml解析 也就是从xml文件提取数据 解析思想&#xff1a;前端的文档对…

【C++实现】RPC框架的简单实现介绍

文章目录 介绍为什么使用protobufprotobuf的service rpc 框架发布方的上层使用逻辑框架的提供方逻辑Rpc调用方框架实现客户端上层框架使用重新梳理简单聊一下RpcController 引入缓冲区队列zookeeper总结 介绍 以下博客覆盖内容&#xff1a; 集群和分布式概念原理&#xff1b; …

安科瑞智能照明系统在绿色建筑中的应用与产品选型

【摘要】&#xff1a;智能照明系统应用在智能建筑中不仅能营造出舒适的生活、工作环境以及现代化的管理方式而且要具有一定的节能效果。给出了智能照明和传统照明系统的比较并分析了智能照明系统的节能。 【关键字】&#xff1a;智能建筑&#xff1b;智能照明&#xff1b;节能…

什么样的口译是好的?交传和同传的评估标准是什么?

众所周知&#xff0c;交传和同传是口译的两种高级形式&#xff0c;难度比较大&#xff0c;一般应用于国际会议、商务洽谈、重大新闻发布会等领域。那么&#xff0c;如何做好交传和同传翻译&#xff0c;什么样的口译是好的&#xff0c;交传和同传的评估标准是什么&#xff0c;北…

密码学obe软件思路

匿名通信与暗网研究综述 匿名通信系统是一种建立在Internet之上综合利用数据转发、内容加密、流量混淆等多种技术隐藏通信实体关系和内容的覆盖网络.由于匿名通信主体难以被追踪定位,匿名通信网络中各类匿名滥用问题层出不穷,而其中隐藏服务机制更是被用于构建充斥着各种非法…

Integer移位算法

常用移位算法 给定值最高位1的权重给定值最低位1的权重给定值高位连续零的个数给定值低位连续零个数 给定值最高位1的权重 也就是给定值左侧。返回给定值左侧最大的2的次幂 //获取i最高位1代表的2次幂&#xff0c;最高位1代表的权值public static int highestOneBit(int i) …

轻量化技术 | 大面积模型秒加载、TB级数据处理能力、多平台便捷展示应用...

实景三维技术的发展日新月异&#xff0c;但在应用上却一直无法深入&#xff0c;尤其是在大场景三维模型展示与应用过程中&#xff0c;不可避免地会遇到占内存、渲染慢、加载卡顿、模型塌陷等情况&#xff0c;这是由于数据格式类型多、内存占比大、模型体量大。 对此&#xff0…

C++ STL关联式容器和无序容器(哈希容器)

文章目录 5.2 C STL关联式容器5.2.1 C STL map容器5.2.2 C STL multimap容器5.2.3 C STL set容器5.2.2 C STL multiset容器 5.3 C STL无序容器&#xff08;哈希容器&#xff09; 参考 5.2 C STL关联式容器 关联式容器在存储元素值的同时&#xff0c;会为各元素额外再配备一个值…

让你不再疑惑PDF转Excel怎么操作

你是否曾经遇到过需要编辑PDF表格的情况&#xff0c;但却不知道如何进行转换&#xff1f;不用担心&#xff0c;现在有一些简单的方法可以将PDF表格转换为Excel&#xff0c;让你轻松地编辑和修改表格。如果你还不知道PDF表格转Excel怎么转的话&#xff0c;那么接下来三种实用的小…

摆脱传统模式,快速构建系统只需要7步~

摆脱传统模式&#xff0c;快速构建系统只需要7步~ 首先我们来说说用“低代码开发平台”来进行开发是一种怎样的感受&#xff1f;它可以帮助您更快、更可靠地提供价值。通过在可视化设计器中&#xff0c;以拖拽的方式快速构建应用程序&#xff0c;您可以跳过基础架构以及可能会让…

聚观早报 | TikTok首席运营官离职;AMDR7 7840HS轻薄本开始上市

今日要闻&#xff1a;TikTok首席运营官离职&#xff1b;AMDR7 7840HS轻薄本开始上市&#xff1b;美国5月AI招聘岗位增加约20%&#xff1b;荷兰传最收紧ASML对华出口限制&#xff1b;力斯SERES5完成欧洲首批交付 TikTok首席运营官离职 当地时间 6 月 22 日&#xff0c;TikTok 首…

LangChain 基于 Prompts 提示管理 构建特定领域模型

一、langChain Prompts 上篇文章对 langChain 进行了简单的介绍与使用&#xff0c;可以知道LangChain 是一个由语言模型LLMs驱动的应用程序框架&#xff0c;使用 LangChain 可以极大的降低开发成本&#xff0c;本篇文章主要基于 LangChain 中的 Prompts 提示管理实现特定领域的…

【软件设计师暴击考点】知识产权高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…