简单概述:
用户通过调用代理类创建对象,无法直接访问目标对象;通过反射创建代理对象,获得代理类、获得构造器,然后构造新实例,实例第一次创建会放入缓存中。
应用场景:
统计每个 api 的请求耗时
统一的日志输出
校验被调用的 api 是否已经登录和权限鉴定
Spring的 AOP 功能模块就是采用动态代理的机制来实现切面编
1.引入依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<scope>test</scope>
</dependency>
2.创建一个接口拦截类,通过该类创建代理对象,本质就是一个拦截器
public class TestIntercepter implements MethodInterceptor {
private static TestIntercepter instance = new TestIntercepter();
public static TestIntercepter getInstance(){
return instance;
}
//创建代理类对象,并返回
@SuppressWarnings("unchecked")
public <T> T getProxyBean(Class<T> clazz){
return (T)Enhancer.create(clazz, this);
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//方法执行前后,可加校验、日志记录
System.out.println("invoker before");
Object o1 = methodProxy.invokeSuper(o, objects);
System.out.println("invoker after");
return o1;
}
}
3.创建被代理类,实际业务逻辑处理
public interface IPhoneService {
String watch();
}
@Service
public class APhone implements IPhoneService{
@Override
public String watch() {
return "Is A watch";
}
}
4.重点,使用代理类创建对象执行方法
public String test(){
//静态方法获取代理类对象,调用方法创建被代理类对象
APhone aPhone = TestIntercepter.getInstance().getProxyBean(APhone.class);
return aPhone.watch();
}
贴一段创建代理对象的原代码