当前位置: 代码迷 >> 综合 >> SSM之动态代理-cglib
  详细解决方案

SSM之动态代理-cglib

热度:37   发布时间:2023-11-20 07:44:08.0

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

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();}// 回调方法@Overridepublic 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类