spring AOP代码实例

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

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

aop代码实例:

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

2.创建接口

package com.AspectTest.service;
public interface personServer {
	public void save(String uname,int age);	
}
3.接口的实现

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配置文件



	
	
 
      
     
    

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!

【运行结果2】:

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

demo下载地址:http://download.csdn.net/detail/lp1052843207/9624305



你可能感兴趣的:(spring)