Spring AOP原理探究(CGLIB代理机制)

 2022-09-09
原文地址:https://cloud.tencent.com/developer/article/1530323
    public class PersonProxyFactory {
    	public static Person getAuthInstance() {
    		Enhancer en = new Enhancer();
    		//设置要代理的目标类
    		en.setSuperclass(Person.class);
    		en.setCallback(new AroundAdvice());
    		return (Person)en.create();
    	}
    }

在默认情况下,如果Spring AOP发现目标实现了相应的Interface,则采用动态代理为其生成代理对象实例;而如果目标对象没有实现任何的Interface,Spring AOP会尝试使用CGLIB动态字节码生成类库,为目标对象生成代理对象实例。这里通过DEMO来演示CGLIB的实现原理。

下面是使用CGLIB做一个 around的例子。

目标Person类。

    public class Person {
    	public String sayHello(String name) {
    		System.out.println("你好," + name);
    		return "你好," + name;
    	}
    }

拦截类AroundAdvice,实现aop的around

    public class AroundAdvice implements MethodInterceptor {
    	@Override
    	public Object intercept(Object arg0, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    		System.out.println("执行目标方法之前,模拟开始事务 ..."); 
    		Object rvt = proxy.invokeSuper(arg0, args);
    		System.out.println("执行目标方法之后,模拟结束事务 ..."); 
    		return rvt + " 新增的内容"; 
    	}
    }

代理工厂PersonProxyFactory类

    public class PersonProxyFactory {
    	public static Person getAuthInstance() {
    		Enhancer en = new Enhancer();
    		//设置要代理的目标类
    		en.setSuperclass(Person.class);
    		en.setCallback(new AroundAdvice());
    		return (Person)en.create();
    	}
    }

测试类

    public class PorxyTest {
    	public static void main(String[] args) {
    		Person person = PersonProxyFactory.getAuthInstance();
    		person.sayHello("张三");
    	}
    }

运行结果

202209092304100021.png