spring的AOP和IOC的原理

article/2025/9/18 10:41:32

目录

一、spring的ioc与aop原理

二、代理模式:

三、静态代理

四、动态代理

五、实际的操作

六、动态代理的实现:

七、什么是AOP

八、主流的AOP框架:

九、术语:

十、通知的五种类型:

十一、AOP的优点:

十二、AOP开发流程


一、spring的ioc与aop原理

  • 核心概念:控制反转(IOC)/(DI),面向切面(AOP)

        IOC和DI:本质相同只是不同的角度描述而已。

        IOC:

                使用Spring框架之后对象的实例不再由调用者来创建,而是直接由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是调用者的程序代码直接控制。控制权由应用程序转移到Spring容器,控制权发生了反转。

        DI:

                从Spring容器的角度来看,Spring容器负责被依赖对象赋值给调用者的长远变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。

aop(面向切面编程) 原理:
    由于组件是在运行期间组装、调用的,因此Spring即可以在执行完A组件后执行组件B,也可以执行完A组件后执行B组件前再执行C组件。也就是说,将C组件插入到A组件与B组件之间。
    如果把A、B、C看成是切面,这就是AOP、面向切面的编程。面向切面编程的思想就是在执行某些代码前执行另外的代码,使程序更灵活、扩展性更好,可以随便地添加、删除某些功能。
 

  • 二、代理模式:

    • 概念
      • 是程序设计的一种
      • 代理模式就是为其他的对象提供一种代理以控制这个对象的访问某些情况下每个对象不适合或者不能直接引用另一个对象二代理对象可以在客户端与目标对象之间起到中介的作用
    • 组成:
      1. 抽象角色:【行为】
        • 通过接口或者抽象类声明真实角色的实现(业务方法)
      2. 代理对象【连接真实角色的桥梁】
        • 实现抽象角色,是真实角色的代理,通过真实的 角色的业务逻辑方法,来实现抽象方法,附加自己的操作。
      3. 真实角色【需要被代理的对象】
        • 实现抽象角色,定义镇海寺的角色搜要实现的业务逻辑,提供代理角色调用
  • 三、静态代理

    • 由我们创建或者工具生成的代理,字编译代理类,所谓的惊涛代理就是在程序执行之前九已经存爱的代理类,代理类和委托类的关系在运行之前就已经确定了。
  • 四、动态代理

    • 动态代理凭借灵活性子框架中应用非常的广泛,是代理模式的一种
    • 是在实现阶段不关心代理类,而是在运行阶段才指定哪一个对象,这就意味着不关心代理类是如何实现的,不需要再写代理类。
  • 、实际的操作

    ​​​​​​​
    • 代理类中没有真实的实现接口,而是调用目标类的租房rent方法。
  • 六、动态代理的实现:

    • 在程序的执行过程中,使用JDK的反射机制,创建代理类对象,并动态的指定要代理的目标类。
    • 它可以实现不用写代理类的实现就可以创建代理类对象。
    • JDK的动态代理是就与反射 实现的,使用JDK中接口和类实现代理对象的创建。
    • JDk动态代理必须实现三个类 Method ,Proxy,InovcationHandler
  • 七、什么是AOP

    • 面向切面编程,和OOP(面向对象编程)类似,一也是一种编程思想。
    • AOP的 作用【横向抽取机制】
      • AOP采取横向抽取【动态代理】,对啊了传统纵向继承的重复性代码,器应用主要体现在事务处理,日志管理,权限管理,异常处理等方面。
      • 主要作用:
        • 分离功能性需求和非功能性需求,是开发人员可以集中 的处理某一个关注点或者横切逻辑
        • 减少对业务代码的侵入
        • 增强代码的可读性和可维护性【简单来说,AOP的作用就是保证开发者在不修改源代码的前提下,为系统业务组件添加某种通用的功能,AOP就是代理模式的经典应用】
  • 八、主流的AOP框架:

    • Spring AOP 
      • 基于AOP编程模式的一个框架,能够有效的减少系统 间的代码重复,达到松耦合的目的。
      • 纯java实现,不需要专门的编译器和类加载器,在运行期间通过代理方式象目标类植入增强的代码。
    • ASpectJ
      • 基于java语言的AOP框架,提供专门的编译器,在编译时提供横向代码的植入。
  • 九、术语:

    • Target:目标类【需要被代理的类】
    • Joinpoint:连接点【指哪些可能被拦截的方法】
    • PointCut:切入点【已经被增强的连接点】
    • Advice:通知/增强【增强代码(前置通知,后置通知,返回通知,抛出异常通知,环绕通知)】
    • WeaVing:植入【把增强的方法,应用到目标的Target来创建新的代理对象Proxy的过程】
    • Proxy:代理类
    • Aspect:切面平【是切入点+通知的结合】
  • 十、通知的五种类型:

    • before:前置通知
    • after:后置通知
    • after-returning:返回后通知
    • after-throwing:抛出异常后通知
    • around:环绕通知
  • 十一、AOP的优点:

    • 是Spring的核心之一,使用AOP来优化编程,在Spring框架中使用AOP的主要优势:
      1. 提供声明式企业服务:
        • 特别是作为EJB声明式服务的替代品,最重要 的是这种事务是声明式事务。
      2. 自定义切面:
        • 允许用户实现自定义切面。在默写不适应OOP编程的场景中吗,采用AOP来补充
      3. 耦合度降低:
        • 可以对业务逻辑的各个部分进行隔离,从而实业务逻辑的各个部分之间的耦合度降低,提高程序的可重用性,同时也提高了开发。
  • 十二、AOP开发流程

    <bean id ="userService" class ="com.shang.aopdemo02.UserServiceImpl" ></bean>
    <bean id="AOPAdvice" class="com.shang.rentdemo.UserAop"></bean>
    <aop:config>
    <aop:pointcut id="pointcut" expression="execution(* com.shang.aopdemo02.*.add*(..))"/>
    <aop:aspect ref="AOPAdvice">
    <aop:before pointcut-ref="pointcut" method="beforeAdvice" ></aop:before>
    <aop:after pointcut-ref="pointcut" method="afterAdvice"></aop:after>
    <aop:after-returning pointcut-ref="pointcut" method="afterReturnAdvice" ></aop:after-returning>
    <aop:around pointcut-ref="pointcut" method="aroundAdvice"></aop:around>
    <aop:after-throwing pointcut-ref="pointcut" method="afterThrowAdvice" ></aop:after-throwing>
    </aop:aspect>
    </aop:config>
    1. 导入依赖
    2. 在xml文件中加入
      1. < ? xml version= "1.0" encoding= "UTF-8" ? >
      2. <beans xmlns="Index of /schema/beans"
      3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4.     xmlns:aop="Index of /schema/aop"
      5.     xsi:schemaLocation="Index of /schema/beans
      6.     http://www.springframework.org/schema/beans/spring-beans-xxx.xsd
      7.     Index of /schema/aop
      8.     http://www.springframework.org/schema/aop/spring-aop-xxx.xsd ">
      9. </beans>
    3. AOP的增强类【before after 等方法】
    4. 实现的第一种方式:在xml自定义切面实现
    5. 实现的第二种方式:注解
      1. 在xml中开启注解和扫描包
      2. 在方法的上面加上注解
        1. @Aspect:定义一个切面
        2. @Pointcut:用于定义一个切入点
        3. @Before:定义前置通知
        4. @After:定义最终通知
        5. @AfterReturning:定义后置通知
        6. @Around:定义环绕通知
        7. @AfterThrowing:定义抛出通知


http://chatgpt.dhexx.cn/article/l15vnYoO.shtml

相关文章

spring aop原理

&#x1f345; Java学习路线&#xff1a;搬砖工逆袭Java架构师 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、CSDN哪吒公众号作者✌ 、Java架构师奋斗者&#x1f4aa; &#x1f345; 扫描主页左侧二维码&#xff0c;加入群聊&#xff0c;一起学习、一起进步…

AOP原理

AOP原理 什么是AopAOP的作用AOP的基本概念AOP使用场景AOP原理如何动态修改功能AOP的编程思想AOP面向切面编程操作AOP通知执行的顺序代码执行流程准备工作源码揭开面纱 什么是Aop AOP&#xff08;Aspect Orient Programming&#xff09;也就是面向切面编程&#xff0c;作为面向对…

无法显示页面,因为发生内部服务器错误。

用iis添加网站后&#xff0c;访问域名&#xff0c;显示“无法显示页面&#xff0c;因为发生内部服务器错误。” 之前我将这些文件放在一个Demo文件夹中&#xff0c;把Demo放在test站点下&#xff0c;通过域名访问Demo报错。 我将Demo下的文件直接放在test下&#xff0c;访问成…

遇到“服务器内部错误http500怎么办?

出现500错误的原因是很多的&#xff0c;一般来说都是程序错误导致的&#xff0c;如果程序出错&#xff0c;那么在浏览器内会返回给用户一个友好的错误提示&#xff0c;统一称之为服务器500错误。 解决的方法就是您必须在http中能够正确的获得错误信息&#xff0c;方法为&#x…

500 - 内部服务器错误--解决方案

一般网上的方法是这样的&#xff1a; 一、打开 Internet 信息服务(IIS)管理器。点击出错的站点&#xff0c;并双击右边的ASP图标&#xff0c;如下图所示&#xff1a; 二、展开右侧配置中的“调试属性”&#xff0c;把“将错误发送到浏览器”的值设为 "true"&#xf…

HTTP状态 500 - 内部服务器错误 类型 异常报告,初学servlet遇到的问题

写给自己看&#xff0c;初学记录一下&#xff0c;maven项目中tomcat,Servlet遇到的问题 HTTP状态 500 - 内部服务器错误 类型 异常报告&#xff0c;初学servlet遇到的问题 类似这种报错&#xff0c;在hello world级别的servlet中碰到。 报错分析 大概是说自定义java类在实例…

IIS 配置网站出现500内部服务器错误,显示具体错误信息

1、打开IIS 找到如下图的部分&#xff0c;双击点开 2、点开之后找到如下图部分&#xff0c;点击 3、选择如下图部分&#xff0c;然后点击确定。 4、这个时候页面会出现详细的错误&#xff0c;如果没有出现详细错误&#xff0c;配置如下图部分&#xff0c;不勾选。 5、这时会出现…

Nextcloud 内部服务器错误解决

在部署nextcloud过程中最后登录页面时出现内部服务器错误&#xff0c;心态当时就炸了。 在网上找了各种方案&#xff0c;但是大部分博主都告诉我是/var/lib/php/session/属组的权限问题&#xff0c;或者web目录的权限不对。但是对我这个问题没有用。 我把他们的方案贴出来对你…

IDEA中HTTP500 - 内部服务器错误类型 在 [] 行处理 [/.jsp] 时发生异常情况;java.lang.NoSuchMethodError: com.Bean.Person.setId

问题&#xff1a; HTTP状态 500 - 内部服务器错误 类型 异常报告 消息 在 [65] 行处理 [/pages/el 5/elDataDemo2.jsp] 时发生异常 描述 服务器遇到一个意外的情况&#xff0c;阻止它完成请求。 例外情况 org.apache.jasper.JasperException: 在 [65] 行处理 [/pages/el 5/elDa…

HTTP状态 500 - 内部服务器错误:No converter found for return value of type: class xxx(简单分析及解决)

问题描述 以下内容基于ssm框架&#xff0c;当我们向tomcat服务器发起请求时&#xff0c;出现如下的错误状态提示–500。 Tomcat日志信息&#xff1a; 原因分析&#xff1a; 未找到类型返回值的转换器&#xff1a;类 com.ssm.utils.Msg&#xff0c;使用jackson绑定数据时出现…

阿里云服务器出错500 - 内部服务器错误

阿里云服务器部署并发布成功后&#xff0c;访问该网页时出错&#xff0c;报 500 - 内部服务器错误。 原因&#xff1a;1.http 500内部服务器错误说明IIS服务器无法解析ASP代码&#xff0c;如果你联网还发现找不到服务器就是500错误了. 2.在安装Framework v4.0之后&#xff0c…

HTTP 500 - Internal Server Error 服务器内部错误

php出现如下错误 原因是出现了中文字符 修改后&#xff0c;页面成功访问

500错误及服务器内部错误

500错误及服务器请求错误 一、简言&#xff1a;500错误代表着你请求的后端或者说服务器端出现了错误。 可能的原因非常多&#xff0c;因为很多程序内部都会把代码运行出现的错误捕捉然后直接返回一个“服务器内部错误500”&#xff0c;这也就导致了我们在前端发送请求时见到的…

远程服务器返回错误: (500) 内部服务器错误解决办法

在.net中发送 xml post请求和接受xml 的post请求时&#xff0c;经常会遇到“远程服务器返回错误: (500) 内部服务器错误”。 这里有2种解决办法&#xff1a; 第一种方法&#xff1a;修改请求端Content-Type 为“text/xml”(httpclient.Headers.Add("Content-Type",…

服务器错误500-内部服务器错误。您查找的资源存在问题,因而无法显示。

当我们用iis环境搭建的网站出现了服务器错误500错误时我们该怎么处理呢&#xff0c;小编的网站织梦网站就出现了服务器错误 500 - 内部服务器错误。 您查找的资源存在问题&#xff0c;因而无法显示这个问题&#xff0c;如下图所示。织梦网站后台登陆前台预览都是正常的&#x…

什么是HTTP 500内部服务器错误,要怎么修复

HTTP 500是一种原始的错误代码&#xff0c;它指示网站服务器在处理请求时发生了内部错误&#xff0c;不过具体错误原因是不确定的。一般情况下&#xff0c;这种错误通常是由服务器程序上的bug或者配置问题造成的。当服务器收到请求时&#xff0c;尝试执行它时&#xff0c;但是发…

HTTP状态500-内部服务器错误

SSM整合时出现的问题 起初关注点一直在Mapper.xml上&#xff0c;CSDN查询解决方法大致在这样几种。 1.SQL语句问题 2.resultType返回类型问题&#xff08;List集合中的参数类型&#xff09; 3.database.properties数据库配置文件问题&#xff08;Mysql8以上加时区&#xff0c;文…

Java问题解决:HTTP状态 500 - 内部服务器错误 Servlet[SpringMVC]的Servlet.init()引发异常

问题&#xff1a; 在学习11_尚硅谷_SpringMVC_HelloWorld 课程中部署SpringMVC项目时遇到如下问题&#xff1a; HTTP状态 500 - 内部服务器错误 类型 异常报告消息 Servlet[SpringMVC]的Servlet.init&#xff08;&#xff09;引发异常描述 服务器遇到一个意外的情况&#xff0…

“500 - 内部服务器错误。”解决办法

建站时遇到如下页面错误&#xff1a; 解决办法&#xff1a; 打开计算机管理IIS后&#xff0c;展开网站&#xff0c;点击出现错误的具体网站->"高级设置"->"物理路径凭据", 在弹出的对话框中查看路径凭据是不是选择在"特定用户",如果是请改…

【Python面向对象】封装、继承、多态

面向对象有三个基本特征&#xff0c;分别是封装、继承和多态。其中&#xff0c;封装可以隐藏实现细节&#xff0c;使得代码模块化&#xff1b;继承可以扩展已存在的代码模块&#xff08;类&#xff09;&#xff1b;它们的目的都是为了——代码重用。而多态则是为了实现另一个目…