面向切面编程思想
概念:基于OCP原则(对扩展开放,对修改关闭)在不修改类的核心业务代码的的情况下,在对象运行时动态的织入功能。对比OOP,面向对象是一个静态的过程。
底层原理分析:
1.目标对象(被代理的对象)实现接口,底层采用JDK动态代理机制为目标对象创建代理对象(代理类和目标实现共同接口,兄弟关系)
2.目标对象没有实现接口,底层采用CGLIB代理机制,默认创建的代理对象集成目标对象。
相关术语:
切面:一个具体的类对象,包含了切入点和通知。
切入点:切入需要扩展业务的目标类的点(粗粒度下可能是很多个类中的所有的方法,细粒度下可能是某一个类中某一个具体的方法),切入点正则表达式,可以指定粗细粒度的切入点。
通知:要动态织入目标类的扩展的功能(在切面的某个连接点上执行的动作)
连接点:指被拦截到的方法。
AOP通常用于日志处理/事务处理/缓存/权限,大多应用在业务层。
五种类型的通知
类型 | 描述 |
---|---|
前置通知 | 方法执行前执行 @Before 优先级第二 |
返回通知 | 方法return之后执行 @AfterReturning 异常不执行 |
异常通知 | 方法出现异常以后执行 @AfterThrowing 无异常不执行 |
后置通知 | 最后通知 @After 优先级其次 |
环绕通知 | @Around 优先级最高 |
切入点正则表达式
关键字 | 描述 |
---|---|
bean | 匹配指定bean id的方法执行 |
within | 匹配指定包名下的类型内的方法 |
execution | 用于细粒度方法匹配执行具体业务 |
@annotation | 用于匹配指定注解修饰的方法执行 |