代理模式之Cglib动态代理

Cglib动态代理

前两篇博文静态代理和JDK动态代理,他们各有优缺点,JDK动态代理缺点:

  1. 目标类必须实现的某个接口,如果某个类没有实现接口则不能生成代理对象;
  2. 只能代理接口,要代理类需要使用第三方的CLIGB等类库;

Cglib动态代理则没有对被代理对象必须实现接口的要求,cglib生成的代理类会继承被代理类,并在代理类中对代理方法进行强化处理(前置处理、后置处理等)。


实例演示

被代理对象:UserService

@Component
public class UserService {
    public void print() {
        System.out.println("==== 真正的业务逻辑 ====");
    }
}

代理类:CglibcglibProxy

@Component
public class CglibProxy implements MethodInterceptor {

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {

        System.out.println("++++ 目标对象执行前逻辑 ++++");
        Object result = methodProxy.invokeSuper(obj, args);
        System.out.println("++++ 目标对象执行后逻辑 ++++");

        return result;
    }

    public Object getProxyInstance(Object target) {
        // 创建工具类
        Enhancer enhancer = new Enhancer();
        // 设置父类
        enhancer.setSuperclass(target.getClass());
        // 设置要织入的类
        enhancer.setCallback(this);

        // 返回代理对象
        return enhancer.create();
    }
}

测试类

@SpringBootTest
@RunWith(SpringRunner.class)
public class ProxyTest {
    @Autowired
    private CglibProxy cglibProxy;
    @Autowired
    private UserService userService;
    
    @Test
    public void testCglibProxy(){
        UserService proxyInstance = (UserService) cglibProxy.getProxyInstance(userService);
        proxyInstance.print();
        System.out.println("-------------------------------");
        proxyInstance.printClassName();
    }
}

运行结果

代理模式之Cglib动态代理_第1张图片


GitHub源码地址:Cglib动态代理


你可能感兴趣的:(Spring,设计模式)