aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般像系统的公共日志记录,事务处理,权限的控制等都可以通过AOP来实现。
可能继续追问的问题:
1).你们项目中有没有使用到AOP?
这个很多地方都用到了,比如我们当时在后台管理系统中,就是使用aop来记录了系统的操作日志、以及权限控制。那就来说一下,记录日志的操作思路吧。
主要思路是这样的,使用aop中的环绕通知 加上基于注解@annotation 的切点表达式来实现的。
首先,自定义了一个注解,比如叫 @Log,然后哪些操作需要记录日志,我们就在哪些方法上加上这个注
解。然后再定义一个切面类,通过环绕通知,来获取原始方法在运行的各项信息,比如:类信息、方法信息、注解、请求方式、请求参数、当前操作人、操作时间、返回值等信息,全部记录下来,保存在数据库中。当时,我们主要记录的是一些核心业务模块的增删改的操作日志,主要便于数据追踪。2).AOP的底层是如何实现的?
SpringAOP的底层主要是通过动态代理技术实现的,主要是两种代理技术。一种是JDK的动态代理,而IDK的动态代理呢,有限制,只能针对于实现了接口的类做代理,所以,在spring中还有一种是Cglib动态代理,那Cglib动态代理呢,就没有这个限制。
3).JDK动态代理 与 Cglib动态代理有什么区别呢?
限制不同。JDK动态代理,要求被代理对象必须实现了接口才可以。而Cglib动态代理,无论是否实现接口都可以(只要类不是final修饰即可)。
代理对象不同。JDK动态代理生成的代理对象,与被代理对象其实是实现了相同的接口,可以说是兄弟关系。而Cglib动态代理生成的代理对象,其实是继承了被代理类,是基于继承体系的,所以是父子关系。也正是因为此,所以Cglib不能为被final修饰的类做代理