关于Spring AOP的一些知识

大家好,我是修真院武汉分院第15期java学员,今天我给大家分享一下java任务三中需要使用的Spring AOP进行日志管理。


 1、背景介绍

        AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类:其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;而动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。

 Spring AOP

        AOP 代理其实是由 AOP 框架动态生成的一个对象,该对象可作为目标对象使用。AOP 代理包含了目标对象的全部方法,但 AOP 代理中的方法与目标对象的方法存在差异:AOP 方法在特定切入点添加了增强处理,并回调了目标对象的方法。Spring 的 AOP 代理由 Spring 的 IoC 容器负责生成、管理,其依赖关系也由 IoC 容器负责管理。因此,AOP 代理可以直接使用容器中的其他 Bean 实例作为目标,这种关系可由 IoC 容器的依赖注入提供。


2.知识剖析

Spring AOP 相关名词

连接点(Joinpoint): 程序执行过程中明确的点,例如一个方法的执行, 或者是一个异常的处理;

在 Spring AOP 中, join point 总是方法的执行点, 即只有方法连接点.简单的来说就是Java程序执行过程中的方法。

切点(point cut) :匹配 join point 的谓词(a predicate that matches join points).

在 Spring 中, 所有的方法都可以认为是 joinpoint, 但是我们并不希望在所有的方法上都添加 Advice,而 pointcut 的作用就是提供一组规则(使用 AspectJ pointcut expression language 来描述) 来匹配joinpoint, 给满足规则的 joinpoint 添加 Advice.

增强(Advice): 也叫通知

它是织入到目标类连接点上的一段程序代码。我们通过AOP将功能加到原有的业务逻辑上,这就是对原有业务逻辑的一种增强

Spring AOP 切面可应用的有 5 种增强类型.

Before——在方法调用之前调用增强

After——在方法完成之后调用增强,无论方法执行成功与否

After-returning——在方法执行成功之后调用增强

After-throwing——在方法抛出异常后进行增强

Around——环绕增强包裹了被增强的方法,在被增强的方法调用之前和调用之后执行自定义的行为

织入(Weaving): 将 aspect 和其他对象连接起来, 并创建 adviced object 的过程.

 根据不同的实现技术, AOP织入有三种方式:
1、编译器织入, 这要求有特殊的Java编译器.
2、类装载器织入, 这需要有特殊的类装载器.
3、动态代理织入, 在运行期为目标类添加增强(Advice)生成子类的方式.
Spring 采用动态代理织入, 而AspectJ采用编译器织入和类装载器织入.

切面(Aspect): 切面是增强和切点的集合

aspect 由 pointcount 和 advice 组成. 它将切面所定义的横切逻辑织入到切面所指定的连接点中
AOP的工作重心在于如何将增强织入目标对象的连接点上, 这里包含两个工作:
1、如何通过 pointcut 和 advice 定位到特定的 joinpoint 上
2、如何在 advice 中编写切面代码. 

目标对象(Target):织入 advice 的目标对象,也叫advised object

Spring AOP 使用运行时代理的方式来实现 aspect, 因此 adviced object 总是一个代理对象(proxied object)
注意, adviced object 指的不是原来的类, 而是织入 advice 后所产生的代理类.


3.常见问题

提问:如何实现spring的AOP操作?


4.解决方案

      在sring里面进行aop操作,使用aspectJ来实现。aspectJ本身是一个单独的面向切面的框架,里面定义了AOP语法,不是spring的一部分,和spring协同完成springAOP的操作,使用aspectJ来实现springAOP的操作有两种方式

1.基于注解

2.基于xml文件


5.编码实战

任务三中需要通过统计db接口的访问时间


6.扩展思考

Spring AOP 实现方式

Spring有两种实现AOP的方式:Java动态代理 和 Cglib. 默认使用动态代理,当目标对象没有实现接口时,就会使用后者. 我们这里使用Java的动态代理实现一个简单的AOP, 可以更深刻的理解Spring AOP


7.参考文献

https://www.ibm.com/developerworks/cn/java/j-lo-springaopcglib/index.html

http://www.cnblogs.com/EasonJim/p/6901806.html


8.更多讨论

今天的分享就到这里啦,欢迎大家提问和探讨!




猜你喜欢

转载自blog.csdn.net/qq_42218123/article/details/80775196