1. 需要加入jar包
cglib.jar aspectjweaver.jar aspectjrt.jar aopalliance-1.0.jar
2.aop理解
3. 注解方式
(1). 接口BusinessService
package com.cn.service; public interface BusinessService { public void save(String name); public void update(String name, Integer id); public String getName(Integer id); }
(2).类BusinessServiceImpl实现BusinessService接口
package com.cn.service; public class BusinessServiceImpl implements BusinessService{ public String getName(Integer id) { // TODO Auto-generated method stub System.out.println("我是save()方法"); return "myname"; } public void save(String name) { // TODO Auto-generated method stub System.out.println("我是save()方法"); } public void update(String name, Integer id) { // TODO Auto-generated method stub System.out.println("我是update()方法"); } }
(3).定义面向切面的类MyInterceptor
package com.cn.service; 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; @Aspect public class MyInterceptor { @Pointcut("execution(* com.cn.service.*.save*(..))") //第一个* 说明方法的类型
//第二个* 说明包下的所有的类 如果是包下类和自包中的类* com.cn..*.save*(..))
//(..)方法中的参数
private void anyMethod() { }// 定义一个切入点 @Pointcut("execution(* com.cn.service.*.update*(..))") private void doMethod() { }// 定义一个切入点 @Before("anyMethod()&&args(name)") public void doAccessCheck(String name) { System.out.println(name); System.out.println("前置通知"); } /* @AfterReturning("anyMethod()") */ @AfterReturning("anyMethod()") public void doAfter() { System.out.println("后置通知"); } @After("anyMethod()") public void after() { System.out.println("最终通知"); } @AfterThrowing("anyMethod()") public void doAfterThrow() { System.out.println("例外通知"); } @Around("anyMethod()") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { System.out.println("进入环绕通知"); Object object = pjp.proceed();// 执行该方法 System.out.println("退出方法"); return object; } @Around("doMethod()") public Object doBasic(ProceedingJoinPoint pjp) throws Throwable { System.out.println("进入环绕通知..."); Object object = pjp.proceed();// 执行该方法 System.out.println("退出方法..."); return object; } }
(4).测试类
package com.cn.service; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class AopTest { public static void main(String args[]) { ApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext.xml"); BusinessService service = (BusinessService) ctx.getBean("service"); service.save("555"); service.update("123", 589); } }
运行结果:
555
前置通知
进入环绕通知
我是save()方法
后置通知
退出方法
最终通知
进入环绕通知...
我是update()方法
退出方法...
3.xml方式
<?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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:config> <aop:aspect id="TestAspect" ref="myInterceptor"> <aop:pointcut id="servicem" expression="execution(* com.cn.service.BusinessService.*(..))" /> <aop:before pointcut-ref="servicem" method="doAccessCheck"/> <aop:after pointcut-ref="servicem" method="after"/> <aop:around pointcut-ref="servicem" method="doBasicProfiling"/> <aop:after-throwing pointcut-ref="servicem" method="doAfterThrow" throwing="ex"/> </aop:aspect> </aop:config> <bean id="myInterceptor" class="com.cn.service.MyInterceptor"/> <bean id="service" class="com.cn.service.BusinessServiceImpl"></bean> </beans>
package com.cn.service; 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; public class MyInterceptor { public void doAccessCheck(JoinPoint jp) { //System.out.println(jp.getTarget().getClass().getName()); System.out.println("前置通知"); } /* @AfterReturning("anyMethod()") */ public void doAfter(JoinPoint jp) { System.out.println("后置通知"); } public void after(JoinPoint jp) { System.out.println("最终通知"); } public void doAfterThrow(JoinPoint jp,Throwable ex) { System.out.println("例外通知"); } public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { System.out.println("进入环绕通知"); Object object = pjp.proceed();// 执行该方法 System.out.println("退出方法"); return object; } public Object doBasic(ProceedingJoinPoint pjp) throws Throwable { System.out.println("进入环绕通知..."); Object object = pjp.proceed();// 执行该方法 System.out.println("退出方法..."); return object; } }