spring实现AOP原理

作者:@kuaiquxie
作者的github:https://github.com/bitebita
本文为作者原创,如需转载,请注明出处:https://www.cnblogs.com/dzwj/p/16482548.html


代理模式 AOP的底层

为什么要学习代理模式?

因为这就是SpringAOP的底层!【SpringAOP和SpringMVC】

 

代理模式的分类: ·静态代理 ·动态代理

 

静态代理

角色分析: ·抽象角色∶一般会使用接口或者抽象类来解决 ·真实角色︰被代理的角色 ·代理角色︰代理真实角色,代理真实角色后,我们一般会做一些附属操作 ·客户:访问代理对象的人!

I 代理模式的好处: ·可以使真实角色的操作更加纯粹! 不用去关注一些公共的业务 ·公共也就就交给代理角色!实现了业务的分工! ·公共业务发生扩展的时候,方便集中管理!

缺点: ·一个真实角色就会产生一个代理角色;代码量会翻倍开发效率会变低~ 优化:使用反射,既能代理,又不增加类

动态代理的底层: 都是反射,反射能够动态的加载类

动态代理

·动态代理和静态代理角色一样 ·动态代理的代理类是动态生成的,不是我们直接写好的! ·动态代理分为两大类:基于接口的动态代理,基于类的动态代理 。基于接口---JDK动态代理【我们在这里使用】 。基于类: cglib 。 java字节码实现: javassist

需要了解两个类:Proxy:代理,InvocationHandler:调用处理程序

动态代理的好处: ·可以使真实角色的操作更加纯粹!不用去关注一些公共的业务 ·公共也就就交给代理角色!实现了业务的分工! ·公共业务发生扩展的时候,方便集中管理! 。一个动态代理类代理的是一个接口,一般就是对应的一类业务。 一个动态代理类可以代理多个类,只要是实现了同一个接口即可

 

即Aop在不改变原有代码的情况下,去增加新的功能.

 

spring 实现 aop:

方式一:使用原生的spring API接口(接口)

<!--方式一:使用原生的spring API接口-->
<!--配置 aop ,需要先导入约束-->
<aop:config>
   <!--切入点:expression 表达式,execution(要执行的位置! * * * * *) -->
   <aop:pointcut id="pointcut" expression="execution(* com.jing.service.UserServiceImpl.*(..))"/>
   <!--执行环绕增加-->
   <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
   <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>

 

方式二:自定义来实现(主要是切面定义)

<!--自定义类-->
<bean id="diy" class="com.jing.diy.DiyPointCut"/>

<aop:config>
<!--自定义切面,ref 要引用的类-->
<aop:aspect ref="diy">
<!--切入点-->
<aop:pointcut id="point" expression="execution(* com.jing.service.UserServiceImpl.*(..))"/>
<!--通知-->
<aop:before method="before" pointcut-ref="point"/>
<aop:after method="after" pointcut-ref="point"/>
</aop:aspect>
</aop:config>

 

方式三:使用注解

<!--方式三:使用注解-->
<bean id="annotationPointCut" class="com.jing.diy.AnnotationPointCut"/>
<!--开启注解支持
JDK (默认 proxy-target-class="false")
cglib proxy-target-class="true"
-->
<aop:aspectj-autoproxy proxy-target-class="true"/>
 
posted @   kuaiquxie  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示