每天分享一点 Java 知识,码字不易,喜欢的可以关注一波,共同学习。20191127
本篇将详细讲解SpringAOP的概念以及如何实现。
1. 何为 aop
AOP: 面向切面编程 ,相对于 OOP 面向对象编程。
Spring AOP存在的目的是为了 解耦 ,AOP可以让一组类共享相同的行为,在OOP中只能通过继承类喝实现接口,来使代码的耦合度增强,且类继承只能为单继承,阻碍更多行为添加到一组类上,AOP弥补了OOP的不足。
2. AspectJ的注解式切面编程
a. 使用注解@Aspect声明是一个切面;
b. 使用注解@After、@Before、@Around等定义建言(advice),可直接将拦截规则(切点)作为参数;
c. 其中@After、@Before、@Around参数的拦截规则为切点(PointCut),为了使切点复用,可使用@PointCut专门定义拦截规则,然后在@After、@Before、@Around的参数中调用;
d. 其中符合条件的每一个被拦截处为连接点(JoinPoint)。
3. 下面将演示基于注解拦截和基于方法规则拦截两种方式,演示一种模拟记录操作的日志系统的实现。其中注解式拦截能够很好的控制要拦截的粒度和获得更丰富的信息,Spring本身在事务处理(@Transcational)和数据缓存(@Cacheable等)上面都使用此种形式的拦截。
4. 代码示例:
a. 添加依赖
i. 添加Spring Aop支持以及AspectJ依赖
<!–AspectJ依赖–>
b. 编写拦截规则的实现
解释:注解本身是没有功能的,就和xml一样。注解和xml都是一种 元数据 ,元数据即解释数据的数据,这就是所谓配置。注解的功能来自用这个注解的地方。
c. 编写使用注解的被拦截类
d. 编写使用方法规则被拦截类
e. 编写切面
解释:
i. 通过@Aspect注解声明一个切面;
ii. 通过@ Component 让此切面成为Spring容器管理的Bean;
iii. 通过@PointCut注解声明切入点;
iv. 通过@After注解声明一个建言,并使用@PointCut定义的切点;
v. 通过反射可以获得注解上的属性,然后做日志记录相关的操作,下面的相同;
vi. 通过@Before注解声明一个建言,此建言直接使用拦截规则作为参数。
f. 配置类
解释:使用@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持。
g. 运行
h. 结果
5. 至此,便完成了Spring Aop的实现,相信大家对aop的理解也会更深一步。
想获取完整面试题及答案的同学请点赞、关注并转发。私信楼主:“Java面试题”获取完整资料,更有超全spring、 jvm 、linux、 docker 等电子书相送。更有整理的200多页的面试重点知识点,非常全面,需要的私信。