AOP简介
AOP介绍
- AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构\
- 作用:在不惊动原始设计的基础上为其进行功能增强
- Spring理念:无入侵式
- 连接店(joinPoint):程序执行过程中共的任意位置,粒度位执行方法,抛出异常,设置变量等
- 在SpringAOP中,理解位方法的执行
- 切入点(pointcut):匹配连接点的式子
- 在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法
- 一个具体的方法:com.wangxh.bao下的BookDao接口中无形参无返回值的save方法
- 匹配多个方法:所有的save方法,所有的get开头的方法,所有以dao结尾的接口中的任意方法,所有带有一个参数的方法
- 通知(advice):在切入点执行的操作,也就是共性功能**
- 通知类:定义通知的类
- 切面(Aspect):描述通知与切入点的对应关系
AOP入门案例(注解版)
- 定义dao接口与实现类
publicinterfaceBookDao {
publicvoidsave();
publicvoidupdate();
}
- 实现类
@Repository
publicclassBookDaoImplimplementsBookDao {
publicvoidsave(){
System.out.printlnn(System.currentTimeMillis());
System.out.println("book dao save...");
}
publicvoidupdate(){
System.out.printlb("book dao update...");
}
}
- 通知类
publicclassMyAdvice {
publicvoidbefore(){
System.out.println(System.currentTimeMillis());
}
}
- 定义切入点
publicclassMyAdvice {
@Pointcut("execution(void com.wangxh.dao.BookDao.update())")
privatevoidpt(){}
}
说明:切入点定义依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体实际逻辑
- 绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置
publicclassMyAdvice{
@Pointcut("execution(void com.wangxh.dao.BookDao.update())")
privatevoidpt(){}
@Before("pt()")
publicvoidbefore(){
System.out.println(System.currentTimeMillis());
}
}
- 定义通知类受Spring容器管理,并定义当前类为切面类
@Component
@Aspect
publicclassMyAdvice {
@Pointct("execution(void com.wangxh.dao.BookDao.update())")
privatevoidpt(){}
@Before("pt()")
publicvoidbefore()
System.out.println(System.currentTimeMillis());
}
- 开启Spring对AOP注解驱动支持
@Configuration
@ComponentScan("com.wangxh")
@EnableAspectJAutoProxy
publicclassSpringConfig{
}
AOP切入点表达式
- 切入点:要进行增强的方法
- 切入点表达式:要进行增强的方法的描述方式
- 描述方法一:执行com.wangxh.dao包下的BookDao接口中的无参数update方法
execution(void com.wangxh.dao.BookDao.update()) - 描述方法二:执行com.wangxh.dao.impl包下的BookDaoImpl类中的无参数update方法
- excecution(void com.wangxh.dao.impl.BookDaoImpl.update())
语法格式
通配符
书写技巧
AOP通知类型
- AOP通知描述了抽取的共性功能,根据共性功能抽取的位置的不同,最终运行代码时要将其加入到合理的位置
- AOP通知共分为5中类型
- 前置通知
- 后置通知
- 环绕通知(重点)
- 注意事项
- 返回后通知(了解)
- 抛出异常后通知(了解)