1.AOP,也就是面向切面编程,其次还有面向过程和面向对象编程.
2.SpringAOP实现主要是通过代理类的方式来实现的,有jdk动态代理和CGLIB代理两种方式.
3.Java动态代理只能对接口进行代理,不能对普通的类进行代理(因为所有生成的代理类的父类都是Proxy,Java类继承机制不允许多重继承);CGLIB能够代理普通类
4.Spring内部,发现如果目标对象没有实现接口,默认会采用CGLIB代理,如果目标对象实现了接口,默认会采用Java动态代理.
5.AOP用到的动态代理是对方法增强的方式之一
6.AOP的典型应用就是事务管理.
简要回答
1.SpringAOP有jdk动态代理和CGLIB方式
2.Spring内部,发现目标对象有接口就使用Java动态代理,没有就用CGLIB
3.AOP的典型应用就是事务管理
辅助理解
1、验证Java动态代理只能够对接口进行代理,不能对普通的类进行代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxy {
interface IHello {
void sayHello();
}
static class Hello implements IHello {
public void sayHello() {
//before
System.out.println("hello world");
//add
}
}
static class DynamicProxyTest implements InvocationHandler {
Object originalObj;
Object bind(Object originalObj) {
this.originalObj = originalObj;
return Proxy.newProxyInstance(originalObj.getClass().getClassLoader(),
originalObj.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");//之前
Object invoke = method.invoke(originalObj, args);
System.out.println("after");//之后
return invoke;
}
}
public static void main(String[] args) {
//设置这个值,在程序运行完成后,可以生成代理类 jdk1.8测试
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
IHello hello = (IHello) new DynamicProxyTest().bind(new Hello());
hello.sayHello();
}
}
运行结果
用everyThing找到$Proxy0.class
使用idea打开,查看结果,继承了Proxy,java单继承,所以验证了我们的结论。
2、对java方法进行功能增强的三种方法 1.通过继承的方式
a.对哪个类的方法进行增强,可以采用继承那个类的方式,通过继承该类,可以重写方法,如果还需要老方法的一些功能,使用super调用
2.通过装饰者模式
a.需要对某个接口或抽象类的实现类的重写的方法进行功能增强可以使用装饰者模式
3.动态代理
参考对java方法进行功能增强的三种方法