动态代理设计模式
动态创建代理类的对象,为原始类的对象添加辅助功能。
核心业务
public interface FangDong {
void zufang();
}
public class FangDongImpl implements FangDong {
@Override
public void zufang() {
//核心功能
System.out.println("钱合同");
System.out.println("每月收钱");
System.out.println("每半年加租");
}
}
1.JDK动态代理实现(基于接口)
/**
* @author: qiuyongqi
* @time: 21:01 2021/5/17
* @description: jdk动态代理
*/
@Test
public void t(){
//实现动态代理
//1 代理目标
final FangDong fd = new FangDongImpl();
//2 代理类 JDK动态代理
InvocationHandler ih=new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//辅助功能
System.out.println("发布房源");
System.out.println("带人看房");
System.out.println("这个房东很烦不要乱说话");
//核心业务
fd.zufang();
return null;
}
};
//3 执行动态代理
FangDong o = (FangDong) Proxy.newProxyInstance(text.class.getClassLoader(), FangDongImpl.class.getInterfaces(), ih);
//4调用代理的方法
System.out.println(o);
}
2. CGlib动态代理实现(基于继承)
/**
* @author: qiuyongqi
* @time: 21:22 2021/5/17
* @description: cglib
*/
@Test
public void t1(){
//实现动态代理
//1 代理目标
final FangDong fd = new FangDongImpl();
//2
Enhancer en =new Enhancer();
//设置生成出来的动态代理类的父类
en.setSuperclass(FangDongImpl.class);
//设置动态代理的业务
en.setCallback(new org.springframework.cglib.proxy.InvocationHandler(){
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
//辅助功能
System.out.println("发布房源");
System.out.println("带人看房");
System.out.println("这个房东很傻去压价");
//核心业务
fd.zufang();
return null;
}
});
//生成对应的动态代理类
FangDongImpl o = (FangDongImpl) en.create();
o.zufang();
}