五、AOP
(1)AOP简介
-
1.AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构
-
OOP(Object Oriented Programming)面向对象编程
-
-
2.作用:在不惊动原始设计的基础上为其进行功能增强
-
3.Spring理念:无入侵式/无侵入式
(2)核心概念
-
连接点(JoinPoint)
-
程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等
-
在Spring中,理解为==》方法的执行
-
-
切入点(PointCut)
-
匹配切入点的式子
-
在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法
-
一个具体方法:com.project.dao包下的BookDao接口中的无形参无返回值的save方法
-
匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法
-
-
-
通知(Advice)
-
在切入点处执行的操作,也就是共性功能
-
在SpringAOP中,功能最终以方法的形式呈现
-
-
-
通知类
-
定义通知的类
-
-
切面(Aspect)
-
描述通知和切入点的对应关系
-
(3)AOP入门案例思路分析
-
案例设定:测试接口执行效率
-
简化设定:在接口执行前输出当前系统时间
-
开发模式:XML or 注解
-
思路分析:
-
1.导入坐标(pom.xml)
-
AOP的依赖Spring自动绑定的,此外还需单独绑定Aspect的依赖==>aspectjweaver
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.7</version> </dependency>
-
-
2.制作连接点所在的Dao接口及其实现类并编写其方法
-
UserDao接口
public interface UserDao { void save(); void delete(); void update(); }
-
UserImpl实现类
@Repository public class UserImpl implements UserDao { public void save() { System.out.println(System.currentTimeMillis()); System.out.println("save is running..."); } public void delete() { System.out.println("delete is running..."); } public void update() { System.out.println("update is running..."); } }
-
-
3.制作共性功能(通知类与通知)
-
使用@Component将其定义成bean,让容器进行管理
-
使用@Aspect设定切面类(AOP)
@Component @Aspect public class Advice {...}
-
-
4.定义切入点
-
使用@Pointcut定义切入点==>一个空参空方法体无返回值的方法
-
@Pointcut的参数是匹配需要加强的连接点即方法,未匹配的连接点不会执行加强的功能
@Pointcut("execution(void com.aop.dao.impl.UserImpl.update())") public void method(){}
-
-
5.绑定切入点与通知的关系(切面)
-
使用@Before定义通知类型,在连接点执行前进行执行通知
@Before("method()") public void before(){ System.out.println("当前系统时间:"+System.currentTimeMillis()); System.out.println(System.currentTimeMillis()); }
-
-
6.在以上步骤完成后,需要在spring的配置类SpringConfig中,使用@EnableAspectJAutoProxy注解向容器告知AOP是使用注解开发的,然后读取通知类中@Aspect,进而运行所需要增强的功能
-