Aspect J 是一个基于Java语言的AOP框架
使用Aspect J需要导入Spring AOP 和 Aspect J的相关jar包
工程结构:
相关类:
StudentServiceI.java
package com.baidu.beans2;
public interface StudentServiceI {
void delete();
String add();
}
StudentServiceImpl.java
package com.baidu.beans2;
public class StudentServiceImpl implements StudentServiceI{
@Override
public void delete() {
// TODO Auto-generated method stub
System.out.println("delete student...");
}
@Override
public String add() {
// TODO Auto-generated method stub
System.out.println("add student...");
return "add";
}
}
Aspect J的几种增强:
@Before 前置通知,相当于BeforeAdvice
@AfterReturning 后置通知,相当于AfterReturningAdvice
@Around 环绕通知,相当于MethodInterceptor
@AfterThrowing抛出通知,相当于ThrowAdvice
@After 最终final通知,不管是否异常,该通知都会执行
@DeclareParents 引介通知,相当于IntroductionInterceptor
方式一:MyAspectJ.java
package com.baidu.beans2;
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.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class MyAspect {
@Before(value="execution(* com.baidu.beans2..*(..))")
public void myBefore(JoinPoint joinPoint) {
System.out.println("前置增强。。。"+joinPoint);
}
@AfterReturning(value="execution(* com.baidu.beans2..*(..))",returning="reval")
public void myAfterReturning(JoinPoint joinPoint,Object reval) {
System.out.println("后置增强!!!,返回值"+reval);
}
@Around(value="execution(* com.baidu.beans2..*(..))")
public void myAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("1.环绕增强前");
Object res = joinPoint.proceed();
System.out.println("2.环绕增强后"+res);
}
}
方式二:MyAspectJ.java
package com.baidu.beans2;
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.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class MyAspect {
@After(value = "MyAspect.zz()")
public void myAfter() {
System.out.println("最终通知。。。。");
}
@Pointcut(value="execution(* com.baidu.beans2..*(..))")
public void zz() {
}
}
配置beans3.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:aop="http://www.springframework.org/schema/aop"
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.xsd">
<!-- 开启AspectJ自动代理-->
<aop:aspectj-autoproxy/>
<!-- 把studentServiceImpl配置进来交给Spring进行管理-->
<bean id="studentServiceImpl" class="com.baidu.beans2.StudentServiceImpl"></bean>
<!-- 把MyAspecy类配置进来-->
<bean class="com.baidu.beans2.MyAspect"></bean>
</beans>