spring AOP代码实例

AOP 概述

AOP(Aspect-OrientedProgramming,面向切面编程,好多人喜欢说面向方面编程,我以为切面更容易解释AOP。)java

面向切面编程,有效的下降了代码之间的耦合性,易于维护;例如:咱们习惯在代码中加上一些日志信息,在程序出错时方便快速查找找到问题,一般作法是在请求进入方法的时候打印日志,退出前打印日志,还有在出错时打印日志,那么问题就来了,每一个方法中都须要打印日志,这些相同的部分就能够当作一个切面,经过配置切点来触发所须要的功能,好比,我须要在请求进入方法的时候打印,便可使用aop当中的前置通知来作到,这样就不须要每一个方法中都去写一遍,配置好以后引用便可。spring

aop代码实例

1.建立一个控制台程序;导入包

2.建立接口与接口的实现类

建立接口编程

package com.AspectTest.service;  
public interface personServer {  
    public void save(String uname,int age);   
}

接口的实现app

package com.AspectTest.service;  
public class personServerImpl implements personServer{  
    @Override  
    public void save(String uname,int age) {  
        int a=0;  
        age= age/a;//打开上面两行报错,可触发异常通知  
        System.out.println("come in personServerImpl save method...");  
    }  
}

4.建立(aop)切面类

package com.AspectTest.aop;  
import java.util.Arrays;  
import org.aspectj.lang.JoinPoint;  
import org.aspectj.lang.ProceedingJoinPoint;  
import org.aspectj.lang.annotation.After;  
import org.aspectj.lang.annotation.AfterReturning;  
import org.aspectj.lang.annotation.AfterThrowing;  
import org.aspectj.lang.annotation.Around;  
import org.aspectj.lang.annotation.Aspect;  
import org.aspectj.lang.annotation.Before;  
import org.aspectj.lang.annotation.Pointcut;  
import org.springframework.stereotype.Component;  
  
@Aspect//声明这是一个切面  
@Component//声明这是一个组件,泛指...能够去掉  
public class AspectIntercepter {  
  
      @Pointcut(value="execution(* com.AspectTest.service.personServerImpl.*(..))")  
      private void pointCut(){//定义一个切入点 后面的通知直接引入切入点方法pointCut便可            personServerImpl下面的全部方法  
      }  
            
       //环绕通知(链接到切入点开始执行,下一步进入前置通知,在下一步才是执行操做方法)  
        @Around(value="pointCut()")  
        public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{  
            System.out.println("@Around进入环绕通知...");  
            Object object = pjp.proceed();//执行该方法  
            System.out.println(pjp.getThis()+"  操做结束,退出方法;环绕[@Around]结束!...");  
            return object;  
        }  
          
        //前置通知(进入环绕后执行,下一步执行方法)  
        @Before(value="pointCut()")  
        public void doAccessCheck(JoinPoint joinPoint){  
            System.out.println("@Before前置通知:"+Arrays.toString(joinPoint.getArgs()));  
        }  
  
        //异常通知(出错时执行)  
        @AfterThrowing(value="pointCut()",throwing="ex")  
        public void doAfterThrow(JoinPoint joinPoint,Throwable ex){  
            System.out.println("@AfterThrowing例外通知(异常通知)"+Arrays.toString(joinPoint.getArgs()));  
            System.out.println("@AfterThrowing异常信息:"+ex);  
        }  
          
        //后置通知(返回以前执行)  
        @After(value="pointCut()")  
        public void after(){  
            System.out.println("@After后置通知...");  
        }  
            
        //最终通知(正常返回通知,最后执行)  
        @AfterReturning(value="pointCut()")  
        public void doAfter(){  
            System.out.println("@AfterReturning最终通知...End!");  
        }  
}

5.配置aop配置文件

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">  
    <!-- 使 AspectJ 的注解起做用 -->  
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>  
   
    <bean id="personServiceBean" class="com.AspectTest.service.personServerImpl"/>    
    <bean id="myInterceptor" class="com.AspectTest.aop.AspectIntercepter"/>   
      
</beans>

6.建立测试类

package com.AspectTest;  
import org.junit.Test;  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
import com.AspectTest.service.personServer;  
public class SpringAopTest {  
        @Test  
        public void inteceptorTest(){  
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-aop.xml");  
            personServer bean = (personServer)ctx.getBean("personServiceBean");  
            bean.save("badMonkey",23);  
              
//          personServer p = new personServerImpl();//经过new对象是不会触发aop的  
//          p.save("11", "22");  
        }  
}

【运行结果1】:

@Around进入环绕通知... @Before前置通知:[badMonkey, 23] come in personServerImpl save method... com.AspectTest.service.personServerImpl@11023cad 操做结束,退出方法;环绕[@Around]结束!... @After后置通知... @AfterReturning最终通知...End!ide

【运行结果2】:

@Around进入环绕通知... @Before前置通知:[badMonkey, 23] @After后置通知... @AfterThrowing例外通知(异常通知)[badMonkey, 23] @AfterThrowing异常信息:java.lang.ArithmeticException: / by zero测试

连接

spring AOP代码实例.net

相关文章
相关标签/搜索