注解:
- @Aspect:声明通知类
- @Pointcut:声明切入点
- 声明通知:
- @Before:前置通知
- @AfterReturning:后置通知
- @Around:环绕通知
- @AfterThrowing:异常通知
- @After:最终通知
applicationContext.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"> <!-- bean definitions here -->
<!-- 1.配置目标对象 -->
<bean id="daoImpl" class="aop.Target" />
<!-- 2.配置通知对象 -->
<bean id="myaspectj" class="aop.Myadvice" />
<!-- 3.开启使用注解完成织入 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
配置目标类:
package aop;
public class Target {
/**
* 存储方法
*/
public void save() {
System.out.println("save方法执行");
}
/**
* 修改方法
*/
public void modify() {
System.out.println("modify方法执行");
}
/**
* 删除方法
*/
public void delet() {
System.out.println("delet方法执行");
}
}
配置通知类:
package aop;
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;
/*该类时通知类*/
@Aspect
public class Myadvice {
/**
* 声明切入点
*/
@Pointcut(value = "execution(* aop.Target.save(..))")
public void pc(){}
/**
* 前置通知
*
* @param joinPoint:获取切入点信息
*/
/* 配置设置前置通知:设置切入点 */
@Before("Myadvice.pc()")
public void beforeMethod(JoinPoint joinPoint) {
System.out.println("前置通知*********************");
}
/**
* 后置通知,获取返回值
*
* @param afterResult
*/
/* 配置后置通知:设置切入点,returning:获取返回值 */
@AfterReturning(value = "execution(* aop.Target.delet(..))", returning = "result")
public void afterRunMethod(Object result) {
System.out.println("后置通知*********************");
}
/**
* 环绕通知
*
* @throws Throwable
*/
@Around(value = "execution(* aop.Target.modify(..))")
public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕通知前*********************");
Object tagert = pjp.proceed();
System.out.println("环绕通知后*********************");
return tagert;
}
/**
* 异常通知:获取异常类型
*
* @param exresult
*/
@AfterThrowing(value = "execution(* aop.Target.modify(..))", throwing = "exresult")
public void exMehtod(Exception exresult) {
System.out.println("异常通知*********************");
}
/**
* 最终通知
*/
@After(value = "execution(* aop.Target.modify(..))")
public void afterMehtod() {
System.out.println("最终通知*********************");
}
}
测试类:
package aop;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:applicationContext.xml")
public class test {
@Resource(name="daoImpl")
Target dao;
@Test
public void saveTest() {
dao.save();
dao.delet();
dao.modify();
}
}