Spring AOP 中底层以代理模式实现,主要为JDK动态代理和cglib动态代理
JDK动态代理(目标类实现了接口,spring中默认采用jdk动态代理):
①定义接口Person
public interface Person {
public void sing();
public void dance();
}
②定义目标类实现接口PersonImpl
public class PersonImpl implements Person {
@Override
public void sing() {
System.out.println("开始唱歌...");
}
@Override
public void dance() {
System.out.println("开始跳舞...");
}
}
③定义handler类,实现InvocationHandler接口,重写invoke方法
public class PersonHandler implements InvocationHandler{
//目标对象
private Object targetobject;
public PersonHandler(Object targetobject){
this.targetobject = targetobject;
}
//增强目标类方法
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object re = null;
System.out.println("动态代理执行...");
re = method.invoke(targetobject, args);
System.out.println("动态代理执行完毕...");
return re;
}
}
④创建Person接口的代理类,执行代理类后的方法
public static void main(String[] args) {
//1.创建handler类
PersonHandler pH = new PersonHandler(new PersonImpl());
//2.创建Person的代理类
Person proxy = (Person)Proxy.newProxyInstance(PersonImpl.class.getClassLoader(),
PersonImpl.class.getInterfaces(),pH);
//3.执行代理类的方法
proxy.dance();
}
⑤代码展示
动态代理执行...
开始跳舞...
动态代理执行完毕...
cglib动态代理(没有接口,只有目标类):
①定义目标类
public class User {
public void sing(){
System.out.println("开始唱歌...");
}
}
②定义类实现MethodInterceptor接口,重写intercept方法,定义创建代理类方法
public class MyMethodInterceptor implements MethodInterceptor{
private User user;
public MyMethodInterceptor(User user){
this.user = user;
}
@Override
public Object intercept(Object arg0, Method method, Object[] arg2,
MethodProxy arg3) throws Throwable {
System.out.println("cglib动态代理前向通知...");
Object userProxy = method.invoke(user, arg2);
System.out.println("cglib动态代理后向通知...");
return userProxy;
}
//创建代理类方法
public Object createProxy(){
Enhancer enhancer = new Enhancer();//核心类
enhancer.setSuperclass(user.getClass());//确定代理类的父类
enhancer.setCallback(this);//设置回调函数,相当于调用重写的intercept方法
Object proxy = enhancer.create();//创建代理类
return proxy;
}
}
③创建代理对象,执行代理方法
public static void main(String[] args){
User user = new User();
MyMethodInterceptor myMethodInterceptor = new MyMethodInterceptor(user);
User proxy = (User)myMethodInterceptor.createProxy();
proxy.sing();
}
④代码展示
cglib动态代理前向通知...
开始唱歌...
cglib动态代理后向通知...