Spring 传统AOP

2019-01-24  本文已影响0人  新晋魔法师

什么是AOP

AOP Aspect Oriented Programing面向切面编程

AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码,可用于:性能监视、事务管理、安全检查、缓存等

Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码

AOP相关术语

代理知识总结

Spring AOP增强类型

Spring按照通知Advice在目标类方法的连接点位置,可分为5类
  1. 前置通知 org.springframework.aop.MethodBeforeAdvice
  1. 后置通知 org.springframework.aop.AfterReturningAdvice
  1. 环绕通知 org.aopalliance.intercept.MethodInterceptor
  1. 异常抛出通知 org.springframework.aop.ThrowsAdvice
  1. 引介通知 org.springframework.aop.IntroductionInterceptor

Spring AOP切面类型

  1. Advisor:代表一般切面,Advice本身就是一个切面,对目标类所有方法进行拦截
  2. PointcutAdvisor:代表具有切入点的切面,可以指定拦截目标类哪些方法
  3. IntroductionAdvisor:代表引介切面,针对引介通知而使用切面

Advisor切面案例

代码

<!--配置目标类-->
<bean id="studentDao" class="demo4.StudentDaoImpl" />

<!--前置通知类型-->
<bean id="myBeforeAdvice" class="demo4.MyBeforeAdvice" />

<!--Spring的AOP产生代理对象-->
<bean id="studentDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <!--配置目标类-->
    <property name="target" ref="studentDao" />
    <!--实现接口-->
    <property name="proxyInterfaces" value="demo4.StudentDao" />
    <!--采用拦截的名称-->
    <property name="interceptorNames" value="myBeforeAdvice" />
</bean>

ProxyFactoryBean常用可配置属性

PointcutAdvisor切点切面

代码

<bean id="studentDao" class="demo4.StudentDao" />
<bean id="myAdvice" class="demo4.MyAdvice" />

<bean id="myAdvicer" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="pattern" value=".*" />
    <property name="advice" ref="myAdvice" />
</bean>

<bean id="proxyStudent" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target" ref="studentDao"/>
    <property name="proxyTargetClass" value="true"/>
    <property name="interceptorNames" value="myAdvicer" />
</bean>

自动创建代理

  1. BeanNameAutoProxyCreator根据Bean名称创建代理
  2. DefaultAdvisorAutoProxyCreator根据Advisor本身包含信息创建代理
  3. AnnotationAwareAspectJAutoProxyCreator基于Bean中的AspectJ注释进行自动代理

BeanNameAutoProxyCreator例子

<!--配置基于Bean名称的自动代理-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <!--配置Bean名称-->
    <property name="beanNames" value="*Dao" />
    <!--配置增强的名称-->
    <property name="interceptorNames" value="beforeAdvice" />
</bean>

DefaultAdvisorAutoProxyCreator例子

<!--配置目标类-->
<bean id="personDao" class="demo3.PersonDaoImpl" />
<!--配置增强-->
<bean id="proxyPerson" class="demo3.MyPersonProxy" />
<!--配置切面-->
<bean id="myadvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <!--为add方法添加增强-->
    <property name="pattern" value="demo3.PersonDaoImpl.add" />
    <property name="advice" ref="proxyPerson" />
</bean>
<!--创建自动代理-->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>
上一篇下一篇

猜你喜欢

热点阅读