1.AOP基本概念
找到程序中的共性功能,抽取出来,在通知类中定义一个方法叫做通知,通知实现共性功能.
把执行通知的方法定义成切入点
切入点与通知关系绑定 叫做切面
2.入门案例
实现类:
@Repository
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println(System.currentTimeMillis());
System.out.println("book dao save ... ");
}
@Override
public void update() {
System.out.println("book dao update ... ");
}
}
实现AOP
@Component
@Aspect
public class MyAdvice {
// 定义切入点
@Pointcut("execution(void com.itheima.dao.BookDao.update())")
private void pt(){}
@Before("pt()")
public void method(){
System.out.println(System.currentTimeMillis());
}
}
主函数:
public class App {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = ctx.getBean(BookDao.class);
bookDao.save();
}
}
3.切入点表达式
使用通配符加速描述表达式
4.AOP的通知类型
环绕用法:
@Around("pt()")
public int around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("before around");
int j = (int) pjp.proceed();
System.out.println("after around");
return j;
}
public class App {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = ctx.getBean(BookDao.class);
int i = bookDao.select();
System.out.println(i);
}
}
5.AOP通知获取数据
话不多说直接上代码,通过JoinPoint 获取args 参数集合,返回一个数组
@Before("pt()")
public void before(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
System.out.println(Arrays.toString(args));
System.out.println("before");
}