aop
1)
面向切面编程,能在不影响原功能的前提下进行扩展,是方法的增强。
2)
比如:如果要给一些对象的功能上进行相同功能的扩展,但这些功能不是业务代码,不适合写在类中,而且如果每个类都去写会有大量代码重复,aop能帮我们把拓展功能封装成一个切面,根据想要切面执行的位置和时间 ,在目标方法执行的时候,执行切面方法,对原功能进行扩展, 降低了模块间的耦合度,同时提高了系统的可维护性
3)
spring aop是基于动态代理的,是动态代理的规范化,把动态代理的实现步骤,方式都定义好了,让开发人员用一种统一 的方式,使用动态代理。
aop实现是基于代理模式的,主要分为静态代理和动态代理。 静态代理的代表为 AspectJ;动态代理则以 Spring AOP为代表。
AspectJ 是静态代理的增强,静态代理,它会在编译阶段生成AOP 代理类, 将切面织入 Java 字节码中, 运行的时候就是经过增强之后的 AOP 对象,因此也称为编译时增强。
Spring AOP 使用的动态代理,在程序运行时,运用反射机制动态创建代理对象,无需手动编写代码,AOP 框架不会去修改字节码,在特定的切点做了增强处理,并回调原对象的方法。
动态代理主要有两种方式:JDK 动态代理和 CGLIB 动态 代理
jdk动态代理:只能对实现了接口的类生成代理,未实现接口则没办法完成动态代理
1.创建SomeServiceImpl接口实现目标类 ,给它的doSome, doother增加 输出时间,事务。
2.创建InvocationHandler接口的实现类,在这个类实现给目标方法增加功能。
3.使用jdk中类Proxy, 创建代理对象,执行方法。
CGLib是针对类实现代理,可以在运行时动态的生成指定类的一个子类对象,并覆盖 其中特定方法并添加增强代码,从而实现 AOP
1.目标类不实现接口
2.创建一个 CglibProxy 的类并实现 MethodInterceptor 接口 ,并实现接口的方法
效率:1.8之后jdk代理高于cglib代理