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; } }