SSM之动态代理-cglib

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37606901/article/details/82493004

定义一个目标类的两个方法:

package com.bjpowernode.service;

// 目标类:一个有返回值,一个没有返回值
public class SomeService {

    public String doFirst() {
        System.out.println("执行doFirst()方法");
        return "abcde";
    }

    public void doSecond() {
        System.out.println("执行doSecond()方法");
    }

}
代理类:

private SomeService target;

public MyCglibFactory() {
    target = new SomeService();
}
这段代码就是定义目标对象并且放在无参数构造函数里面,当函数进行加载的时候就会进行初始化。
package com.bjpowernode.factory;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import com.bjpowernode.service.SomeService;

public class MyCglibFactory implements MethodInterceptor {

    private SomeService target;

    public MyCglibFactory() {
        target = new SomeService();
    }

    public SomeService myCglibCreator() {
        // 创建增强器对象
        Enhancer enhancer = new Enhancer();
        // 指定目标类,即父类,通过反射技术
        enhancer.setSuperclass(SomeService.class);
        // 设置回调接口对象
        enhancer.setCallback(this);

        return (SomeService) enhancer.create();
    }

    // 回调方法
    @Override
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        // 调用目标方法
        Object result = method.invoke(target, args);
        if (result != null) {
            result = ((String) result).toUpperCase();
        }
        return result;
    }

}

测试类:

package com.bjpowernode.test;

import com.bjpowernode.factory.MyCglibFactory;
import com.bjpowernode.service.SomeService;

public class MyTest {

    public static void main(String[] args) {
        SomeService service = new MyCglibFactory().myCglibCreator();
        String result = service.doFirst();
        System.out.println("result = " + result);
        service.doSecond(); 
    }

}

使用JDK的代理要求目标类与代理类实现相同的接口,若目标类不存在接口,则无法使用该方式进行。cglib代理生成的原理是生成目标类的子类,而子类是增强国的,这个子类对象就是代理对象。所以使用cglib代理生成动态代理,要求目标类必须是可以继承,即不能是final类

猜你喜欢

转载自blog.csdn.net/qq_37606901/article/details/82493004