Spring笔记整理——AOP

来源:互联网 发布:js验证表单 编辑:程序博客网 时间:2024/04/28 05:32
AOP(Aspect Oriented Programming)是GoF四人组设计模式的一种扩展,设计模式所追求的是降低代码之间的耦合度,增加程序的灵活性和可重用性,AOP实际上就是设计模式所追求的目标的一种实现。将通用的功能从不想通的类中分离,也就是多个类的共享行为。AOP的核心思想类似动态代理模式,把共同的功能以额外功能的形式加入原始对象。

面向对象的编程(OOP)方法是在面向过程的编程方法基础上进行的改进,而面向方面编程(AOP)方法又是在面向对象编程(OOP)方法的基础上进行改进而来的一种创新的软件开发方法。AOP和OOP虽然在字面上十分相似,但是却是面向不同领域的两种设计思想。OOP(面向对象编程)针对问题领域中以及业务处理过程中存在的实体及其属性和操作进行抽象和封装,面向对象的核心概念是纵向结构的,其目的是获得更加清晰高效的逻辑单元划分;而AOP则是针对业务处理过程中的切面进行提取,例如,某一个操作在各个模块中都有涉及,这个操作就可以看成“横切”存在于系统当中。在许多情况下,这些操作都是与业务逻辑相关性不强或者不属于逻辑操作的必须部分,而面向对象的方法很难对这种情况做出处理。AOP则将这些操作与业务逻辑分离,使程序员在编写程序时可以专注于业务逻辑的处理,而利用AOP将贯穿于各个模块间的横切关注点自动耦合进来。AOP所面对的是处理过程中的某个步骤或阶段,对不同的阶段领域加以隔离,已获得逻辑过程中各部分之间低耦合性的隔离效果,其与面向方面编程在目标上有着本质的差异。AOP的核心思想就是将应用程序中的业务逻辑处理部分同对其提供支持的通用服务,即所谓的“横切关注点”进行分离,这些“横切关注点”贯穿了程序中的多个纵向模块的需求。

Spring提供了额外功能的4个接口

MethodBeforeAdvice

/** * 该额外功能在目标方法执行之前执行 */public class BeforeAdviceDemo implements MethodBeforeAdvice {@Override/** before:执行的外功能 @Method:当前增加了额外功能的目标方法 @Object[]:目标方法的参数 @Object:目标对象*/public void before(Method method, Object[] args, Object target)throws Throwable {System.out.println("目标方法="+method.getName());System.out.println("目标对象="+target.getClass());System.out.println("-------执行的额外功能-------");}}

  AfterReturningAdvice【较少使用】


/** * 额外功能在目标方法之后执行 */public class AfterAdviceDemo implements AfterReturningAdvice {@Overridepublic void afterReturning(Object returnValue, Method method,Object[] args, Object target) throws Throwable { System.out.println("-----额外功能在目标方法执行之后-----");}}

 MethodInterceptor

/** * 额外功能在目标方法的前后执行 *  * @author Administrator *  */public class RroundAdvice implements MethodInterceptor {/* * @MethodInvocation:代表目标对象 @return Object:目标方法值的返回值 */@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("-----开启事务------");Object obj = null;try {obj = invocation.proceed();// 执行目标方法} catch (Exception e) {System.out.println("----事务回滚----");return obj;}System.out.println("-----提交事务------");return obj;}}

ThrowsAdvice

/** * 额外功能在目标方法发生异常时执行 *  * @author Administrator *  */public class ExceptionDemo implements ThrowsAdvice {/*该方法从API中定义*/public void afterThrowing(Method method, Object[] args, Object target,Exception ex) {     System.out.println("-----发生了异常。。。-----");}}

在Spring AOP开发中,主要步骤
   1.定义额外功能[根据功能选择四个接口]
   2.目标对象
   3.切面【建议者】 NameMatchMethodPointcutAdvisor
   4.配置Spring自动代理 BeanNameAutoProxyCreator

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd "><!-- 1.定义目标对象 --><bean id="userBiz" class="com.spring.biz.impl.UserBizImpl"></bean><bean id="orderBiz" class="com.spring.biz.impl.OrderBizImpl"></bean><!-- 2.定义额外功能 --><bean id="after" class="com.spring.advice.AfterAdviceDemo"></bean><bean id="before" class="com.spring.advice.BeforeAdviceDemo"></bean><bean id="round" class="com.spring.advice.RroundAdvice"></bean><bean id="excpe" class="com.spring.advice.ExceptionDemo"></bean><!-- 追加Spring建议者的配置,实现方法的过滤 --><bean id="methodPointCut"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"><!-- 为属性注入,设定符合要求的方法和额外功能 --><property name="mappedNames"><!-- 指定方法的名称那些方法需要额外功能,数组 --><list><value>log*</value><!-- 只对login方法追加额外功能,只关心方法名不关心目标对象 --><!-- 建议者中定义的方法名称为 切入点 --><value>sendCommit</value><!-- 追加sendCommit方法【切入点】 --></list></property><property name="advice" ref="round"><!-- 指定额外功能,对象 --></property></bean><!-- 3.创建Spring的动态代理对象:时一个复杂对象,通过id获得的就是需要的代理类 --><bean id="userBizProxy"class="org.springframework.aop.framework.ProxyFactoryBean"><!-- 为代理类定义目标对象和对应的额外功能 --><property name="target" ref="userBiz"><!--是ProxyFactoryBean的属性,注入目标对象 --></property><property name="interceptorNames"><!--【数组】是ProxyFactoryBean的属性,注入额外功能 --><list><!--<value>round</value> 直接定义额外功能的名称 --><value>methodPointCut</value><!-- 如果有建议者,使用建议者名称 --></list></property></bean><!-- 定义orderBiz的代理类 --><bean id="orderBizProxy"class="org.springframework.aop.framework.ProxyFactoryBean"><property name="target" ref="orderBiz"></property><property name="interceptorNames"><list><value>methodPointCut</value></list></property></bean></beans>


自动装配

<bean id="autoProxy"class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"><property name="beanNames"><!-- 注入原始对象 ,数组 --><list><!--<value>userBiz</value> 目标对象的id值 --><value>*Biz</value></list></property><property name="interceptorNames"><!-- 定义额外功能 --><list><value>methodPointCut</value></list></property></bean>


原创粉丝点击