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"/>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)