动态代理之CGLIB

来源:互联网 发布:张佳玮 知乎 编辑:程序博客网 时间:2024/06/16 02:34

CGLIB的原理:运行时动态的生成一个被代理类的子类(通过ASM字节码处理框架实现),子类重写了被代理类中所有非final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势植入横切逻辑。
好处:不用再像使用Java动态代理那样去实现特定的接口,一个普通的Java类就可以了
(1)LogAround.java ,负责输出日志信息,实现了接口MethodInterceptor,重写了invoke()方法

public class LogAround implements MethodInterceptor{     Logger logger=Logger.getLogger(this.getClass().getName());    @Override    public Object invoke(MethodInvocation mi) throws Throwable {        // TODO Auto-generated method stub        logger.log(Level.INFO, mi.getArguments()[0]+" 开始...");        //通过proceed方法执行被调用的方法        Object result=mi.proceed();        logger.log(Level.INFO, mi.getArguments()[0]+" 结束...");        //被调用方法的返回值        return result;    }}

(2)配置文件,主要设定ProxyFactoryBean的proxyTargetClass属性,属性值设为true

<bean id="log" class="CGLIB.LogAround"></bean><bean id="timeBook" class="spring.aop.TimeBook"></bean><bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">   <property name="proxyTargetClass">     <value>true</value>   </property>   <property name="target">      <ref bean="timeBook"/>   </property>   <property name="interceptorNames">     <list>        <value>log</value>     </list>   </property></bean>

(3)测试

public class Test {    public static void main(String[] args) {        ApplicationContext context = new FileSystemXmlApplicationContext(                "classpath:cglib-config.xml");        TimeBook timeProxy = (TimeBook) context                .getBean("logProxy");        timeProxy.doAuditing("CSDN");    }}

运行结果
这里写图片描述

0 0
原创粉丝点击