spring实现AOP原理
代理模式 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"/>

浙公网安备 33010602011771号