Spring AOP(xml)

来源:互联网 发布:微星 网络唤醒 编辑:程序博客网 时间:2024/05/21 02:50

AOP

面向切面编程,通过预编译的方式和运行期动态代理实现程序功能的统一维护的一种技术。可以在执行方法之前或者执行之后添加额外的功能。
struts的拦截器是在acton方法执行之前或者之后执行,有一些相似之处。
struts 拦截器链接

主要的功能  

日志记录,性能统计,安全控制,事务处理,异常处理。

AOP基本概念

  • Aspect 切面,模块化出来的在方法执行前后的操作
  • Join point 连接点
  • Advice 通知,方法执行之前或者之后执行的操作
  • Point Cut 切入点
  • Introduce 引入 ,添加新的方法和属性到当前类中
  • Target object 方面通知对象,这个对象是代理对象,也称被通知对象
  • Weaving Weaving 把方面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。

通知的类型

  • 前置通知 在一个方法执行之前通知
  • 后置通知 在一个方法执行之后通知
  • 返回后通知 在一个方法执行之后并且有返回的时候通知
  • 抛出异常后通知 在执行一个方法之后,只有抛出异常才会通知
  • 环绕通知 在建议方法调用前后通知

基于xml的实现

导入aop所需的包

  • aspectjweaver-1.7.4.jar
  • aspectjrt-1.7.4.jar
  • aopalliance-1.0.jar
  • spring-aop-4.0.5.RELEASE.jar

创建切面类 TestAspect

package com.spring.aspect;import org.aspectj.lang.ProceedingJoinPoint;public class TestAspect {    //前置通知    public void beforeAdvice()    {        System.out.println("这是前置通知");    }    //后置通知    public void afterAdvice()    {        System.out.println("这是后置通知");    }    //返回通知    public void returnAdvice(String js)    {        System.out.println("这是返回通知");    }    //异常通知    public void exceptionAdvice(Exception e)    {        System.out.println("这是异常通知");    }    //环绕通知    public Object roundAdvice(ProceedingJoinPoint point)    {        Object o = new Object() ;        try        {            System.out.println("环绕通知前");            o = point.proceed();            System.out.println("环绕通知后");        }         catch (Throwable e)         {            e.printStackTrace();        }        return o;    }}

创建测试bean

package com.spring.beans;public class BeanTest {    public String method()     {        System.out.println("bean 方法执行");        return "sad";    }    }

测试类

package com.spring.test;import com.spring.beans.BeanTest;import org.junit.Test;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainTest {    @Test    public void Test() throws Exception {        ClassPathXmlApplicationContext context =        new ClassPathXmlApplicationContext("applicationContext.xml");        BeanTest test = (BeanTest) context.getBean("beanTest");        test.method();       context.close();    }}

测试结果

这是前置通知环绕通知前bean 方法执行环绕通知后这是返回通知这是后置通知

异常通知测试

<aop:config>    <aop:aspect id="testAspect" ref="aspect">        <aop:pointcut id="pointCut" expression="execution(* com.spring.beans.BeanTest.*(..))"/>        <aop:after-throwing method="exceptionAdvice" throwing="e" pointcut-ref="pointCut" />    </aop:aspect></aop:config>

修改测试bean

package com.spring.beans;import java.io.IOException;public class BeanTest {    public String method() throws IOException     {       throw new IOException();    }}

结果

这是异常通知

同时使用异常通知和环绕通知的话,如果有异常,异常通知不会执行。

0 0