Cglib之动态代理

代理三要素:

1)被代理的目标

2)代理的增强类

3)增强类和目标的关联

这里演示spring使用的动态代理,所以需要依赖spring core核心包,该包已经集成了Cglib

spring core依赖的maven坐标:

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
    </dependencies>

一:目标对象

public class CustomerService {
	public int save() {
		System.out.println("保存客户");
		return 1;
	}

	public void update() {
		System.out.println("修改客户");
	}

	public void delete() {
		System.out.println("删除客户");
	}

	public void search() {
		System.out.println("查询客户");
	}
}

二:代理增强类

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

// 工具类,对目标进行cglib代理
public class CglibProxyFactory implements MethodInterceptor {

   // 被代理目标对象
   private Object target;

   // 1、 通过构造器,传入被代理目标对象
   public CglibProxyFactory(Object target) {
      this.target = target;
   }

   // 2、 提供生成代理对象的方法
   public Object createProxy() {
      // 用于生成代理 API类
      Enhancer enhancer = new Enhancer();
      // 设置目标类,根据类生成子类代理
      enhancer.setSuperclass(target.getClass());
      // 设置回调函数
      enhancer.setCallback(this);
      // 生成代理返回
      return enhancer.create();
   }

   @Override
   // 3、 编写回调拦截函数,拦截目标对象所有方法
   public Object intercept(Object proxy, Method method, Object[] args,
         MethodProxy methodProxy) throws Throwable {
      System.out.println("记录日志:" + method.getName() + "方法被调用....");
      return methodProxy.invokeSuper(proxy, args);// 调用父类(真实对象)的方法
      // return method.invoke(target, args);
   }
}

三:关联关系

public class CglibProxyTest {

	@Test
	// 测试 cglib代理
	public void testCglibProxy() {
		// 目标
		CustomerService target = new CustomerService();
		// 生成代理
		CglibProxyFactory factory = new CglibProxyFactory(target);
		CustomerService proxy = (CustomerService) factory.createProxy();
		// 调用代理对象的方法
		proxy.save();
		proxy.update();
		proxy.delete();
		proxy.search();
	}
}

执行结果:

猜你喜欢

转载自blog.csdn.net/qq_15076569/article/details/82532691
今日推荐