AOP定义
- AOP (Aspect Orient Programming):直译过来就是 面向切面编程。AOP 是一种编程思想
- 用途:
- Transactions (事务调用方法前开启事务, 调用方法后提交关闭事务 )、日志、性能(监控方法运行时间)、权限控制等。也就是对业务方法做了增强
SpringAOP和AspectJ联系
- Spring AOP旨在通过Spring IoC提供一个简单的AOP实现,以解决编码人员面临的最常出现的问题。这并不是完整的AOP解决方案,它只能用于Spring容器管理的beans。
- AspectJ是最原始的AOP实现技术,提供了完整的AOP解决方案。
- 简单的:spirng aop够用了,但是spring aop借助了aspectj的注解功能,需要添加aspectj的依赖。
- 在高级点,比如切面很多,上万个,这是就要用到aspectj的高级功能了
- 在Spring的框架中包含Aspectj,当然也包括Spring AOP,在进行开发时候,这两个框架是完全兼容的
- 区别:
- AspectJ使用的是编译期和类加载时进行织入
- Spring AOP利用的是运行时织入
Spring如何实现AOP
AOP的代理对象
都知道AOP是通过代理对象实现对对象功能的增强,代理对象分为静态代理和动态代理
静态代理
- 需要定义接口、目标对象与代理对象
- 代理类需要对代理对象的每个方法有对应方法
- 优点
- 也就是代理模式的优点,可以在被代理方法的执行前或后加入别的代码,实现诸如权限及日志的操作
- 不是运行时生成的代理,效率更高
- 缺点
- 如果代理对象增加一个方法,所有代理类也需要实现此方法
动态代理
- 动态代理类的源码是在程序运行期间由JVM根据反射等机制动态织入的
- 不存在代理类的字节码文件,直接进了虚拟机
- 通过proxy提供了一组静态方法来为一组接口动态地生成代理类及其对象。
// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器
static InvocationHandler getInvocationHandler(Object proxy)
// 方法 2:该方法用于获取关联于指定类装载器和一组接口的动态代理类的类对象
static Class getProxyClass(ClassLoader loader, Class