在配置类上方添加@EnableAspectJAutoProxy即可
@Configuration
@ComponentScan("com.neu")
@EnableAspectJAutoProxy
public class SpringConfig {
}
通知类
package com.neu.advice;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class MyAspectAdvice {
//切点方法
@Pointcut("execution(* com.neu.dao.UserDao.*(..))")
public void pointCut(){}
//后置通知
@AfterReturning("pointCut()")
public void MyAfterReturning(JoinPoint joinPoint){
System.out.println("切点方法名:"+joinPoint.getSignature().getName());
System.out.println("目标对象:"+joinPoint.getTarget());
System.out.println("打印日志:"+joinPoint.getSignature().getName()+"方法被执行了");
}
//前置通知
@Before("pointCut()")
public void myBefore(){
System.out.println("前置通知");
}
//异常通知
@AfterThrowing(value = "pointCut()",throwing = "ex")
public void myAfterThrowing(Exception ex){
System.out.println("异常通知");
System.out.println(ex.getMessage());
}
//最终通知
@After("pointCut()")
public void myAfter(){
System.out.println("最终通知");
}
//环绕通知
@Around("pointCut()")
public Object myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕前");
Object obj = proceedingJoinPoint.proceed();//执行切点方法
System.out.println("环绕后");
return obj;
}
}
核心类
package com.neu.dao;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
public void add(){
System.out.println("用户新增");
}
public void del(){
System.out.println("用户删除");
}
public void update(){
int i = 1/0;
System.out.println("用户修改");
}
}
测试类
@Test
public void testAdd1(){
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
UserDao userDao = (UserDao) ac.getBean("userDao");
userDao.add();
}