定义AspectJTestBean.java
package com.apjept.bean.chapter;
import org.springframework.stereotype.Service;
@Service
public class AspectJTestBean{
public String MyMethod(String loginInfo) {
System.out.println("Person login() " + "LoginInfo:" + loginInfo + this);
return " logining..."+loginInfo;
}
public void loginThrow() throws Exception {
throw new Exception();
}
}
定义切面MyAspectJ.java
package com.apjept.bean.chapter;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
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.Service;
@Service
@Aspect
public class MyAspectJ {
// @Pointcut("execution(* com.apjept.bean.chapter.MyMethod(..))&&"+"args(name,..)")
// public void logPerson(String name) {}
//
// @After("logPerson()&&"+"args(name,..)")
// public void logafter(String name){
// System.out.println("logafter 后通知 方法名:" + name);
// }
// 后通知 (After (finally) advice) 使用切入点 logPerson (在“返回后通知”之前)
@AfterReturning("execution(* com.apjept.bean.chapter.*.MyMethod(..))&&"
+ "args(name,..)")
public void logAfter(String name) {
System.out.println("logAfter********** 后通知 方法名:" + name);
}
// 前置通知 (Before advice) 使用切入点 logPerson
@Before("execution(* com.apjept.bean.chapter..*.*(..))&&" + "args(name,..)")
public void logBefore(String name) {
System.out.println("logPerson 前置通知 方法名:" + name);
}
//
// // 前置通知 (Before advice) 使用切入点 logPerson
// @Before("com.apjept.bean.chapter.logPerson() &&"
// + "args(info)")
// public void logBeforeArgs(JoinPoint joinPoint, String info) {
// System.out.println("logPerson 前置通知(有参数) 方法名:"
// + joinPoint.getSignature().getName() + " 参数: " + info);
// }
//
// 返回后通知1 (After returning advice) 使用切入点 logPerson (在“后通知”之后)
@AfterReturning("execution(* com.apjept.bean.chapter..*.*(..))&&"
+ "args(name,..)")
public void logAfterReturning(JoinPoint joinPoint, String name) {
System.out.println("logPerson 返回后通知1 方法名:"
+ joinPoint.getSignature().getName() + " return: ");
}
//
// // 返回后通知2 (After returning advice) 使用切入点 logPerson (在“后通知”之后)
// @AfterReturning(pointcut = "com.apjept.bean.chapter.logPerson()",
// returning = "retVal")
// public void logAfterReturning2(JoinPoint joinPoint, Object retVal) {
// System.out.println("logPerson 返回后通知2 方法名:"
// + joinPoint.getSignature().getName() + " return: "
// + retVal.toString());
// }
//
// 环绕通知 (Around Advice) 使用切入点 logPerson (在“前通知”之后)
@Around("execution(* com.apjept.bean.chapter..*.*(..))&&" + "args(name,..)")
public Object logAround(ProceedingJoinPoint pjp, String name)
throws Throwable {
// start stopwatch
System.out.println("logPerson 环绕通知 start stopwatch 方法名:"
+ pjp.getSignature().getName());
// 执行切入点
Object retVal = pjp.proceed();
// stop stopwatch
System.out.println("logPerson 环绕通知 stop stopwatch 方法名:"
+ pjp.getSignature().getName() + " return: "
+ retVal.toString());
return retVal;
}
}
配置application.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<context:component-scan base-package="com.apjept.bean.chapter"/>
<aop:aspectj-autoproxy/>
</beans>
调用示例
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
ctx.registerShutdownHook();//注册勾子
AspectJTestBean aspec = (AspectJTestBean) ctx.getBean("aspectJTestBean");
aspec.MyMethod("**");