配置文件
<bean id="userDao" class="dao.impl.UserDaoImpl"/>
<bean id="comboAspect" class="aop.aspect.ComboAspect"/>
<aop:config>
<aop:pointcut id="pointCut" expression="execution(* modUser(..))" />
<aop:aspect id="comboAdvice" ref="comboAspect">
<aop:around pointcut-ref="pointCut" method="aroundIntercept"/>
<aop:after-returning pointcut-ref="pointCut" method="afterIntercept" returning="result"/>
<aop:before pointcut-ref="pointCut" method="beforeIntercept"/>
</aop:aspect>
</aop:config>
<aop:pointcut/>
配置切入点<aop:aspect/>
配置切面实现类- expression属性配置要执行切面的方法的表达式
切面实现类
package aop.aspect
import org.aspectj.lang.JoinPoint
import org.aspectj.lang.ProceedingJoinPoint
public class ComboAspect {
// 前置增强,第一个参数必须是连接点类型
public void beforeIntercept(JoinPoint jp) {
System.out.println("=========前置增强----beforeIntercept===========")
Object[] params = jp.getArgs()
String methodName = jp.getSignature().getName()
Object target = jp.getTarget()
Object target02 = jp.getThis()
System.out.println("目标对象target:" + target)
System.out.println("目标对象this:" + target02)
System.out.println("目标方法methodName:" + methodName)
System.out.println("方法参数params:" + params)
}
// 环绕增强
public Object aroundIntercept(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("=========环绕增强----aroundInterceptBefore===========")
Object[] params = pjp.getArgs()
String methodName = pjp.getSignature().getName()
Object target = pjp.getTarget()
Object target02 = pjp.getThis()
System.out.println("目标对象target:" + target)
System.out.println("目标对象this:" + target02)
System.out.println("目标方法methodName:" + methodName)
System.out.println("方法参数params:" + params)
Object result = pjp.proceed(params)
System.out.println("=========aroundInterceptAfter===========")
return 2
}
// 后置增强,如果是异常增强处理方法则第二个参数可以定义为:Exception exception
public void afterIntercept(JoinPoint jp, Object result) {
System.out.println("=========后置增强----afterIntercept===========")
Object[] params = jp.getArgs()
String methodName = jp.getSignature().getName()
Object target = jp.getTarget()
Object target02 = jp.getThis()
System.out.println("目标对象target:" + target)
System.out.println("目标对象this:" + target02)
System.out.println("目标方法methodName:" + methodName)
System.out.println("方法参数params:" + params)
System.out.println("目标方法返回结果:" + result)
}
}
切面表达式详解
- modUser(..) :表示匹配所有方法名称为modUser的方法
- mod*(..) :表示匹配所有方法名以mod开头的方法
- mod*(String,..) :表示匹配所有方法名以mod开头且第一个参数为String类型的方法
- mod*(String,*) :表示匹配所有方法名以mod开头、有两个参数且第一个参数为String类型的方法
- com.scxh.dao.impl..mod(..):表示匹配com.scxh.dao.impl包下所有类中以mod开头的方法
- com.scxh.dao...mod*(..):表示匹配com.scxh.dao包下所有类中以mod开头的方法
- com.scxh.dao..UserDaoImpl.(..):表示匹配com.scxh.dao包下所有UserDaoImpl类中的所有方法
- com..dao..UserDaoImpl.mod*(..)):表示匹配com包下二级子包名为dao中的所有UserDaoImpl类中的所有以mod开头的方法
测试代码
package dao.impl;
public class UserDaoImpl{
public Integer addUser() {
return 0;
}
public Integer delUser() {
return 1;
}
public Integer modUser() {
System.out.println("==========目标类(DAO实现类)中的方法被调用=========");
return 1;
}
public Object getUser() {
return null;
}
}
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import dao.impl.UserDaoImpl;
public class TestAop {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
UserDaoImpl userDaoImpl = (UserDaoImpl)context.getBean("userDao", UserDaoImpl.class);
userDaoImpl.modUser();
}
}