1、概念
2、静态代理设计模式
3、动态代理设计模式
4、动态代理示例
1.FangDongService
public interface FangDongService {
public void zufang();
}
2.FangDongServiceImpl
// 原始业务类
public class FangDongServiceImpl implements FangDongService{
@Override
public void zufang() {
// 核心功能
System.out.println("签合同");
System.out.println("收房租");
}
}
3.测试类
public class DynamicProxyTest {
@Test
public void testJDK(){
// 目标
FangDongService fangDongService=new FangDongServiceImpl();
// 额外功能
InvocationHandler ih=new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//辅助功能,非核心功能
System.out.println("发布租房信息!");
System.out.println("带租客看房!!");
//核心
fangDongService.zufang();
return null;
}
};
// 动态生成 代理类
//参数:(当前类加载器, 接口数组(代理和目标有相同的接口实现) ,额外功能(非核心代理执行功能))
FangDongService proxy=(FangDongService) Proxy.newProxyInstance(DynamicProxyTest.class.getClassLoader(),
fangDongService.getClass().getInterfaces(),
ih);
//执行
proxy.zufang();
}
@Test
public void testCGLIB(){
// 目标
FangDongService fangDongService=new FangDongServiceImpl();
//CGLIB核心对象
Enhancer enhancer=new Enhancer();
//将目标类做为其父类(保证接口一致)
enhancer.setSuperclass(FangDongService.class);
//额外功能
enhancer.setCallback(new org.springframework.cglib.proxy.InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
//辅助功能
System.out.println("发布租房信息2!");
System.out.println("带租客看房2!");
//核心功能
fangDongService.zufang();
return null;
}
});
// 动态生成代理类
FangDongService proxy=(FangDongService)enhancer.create();
proxy.zufang();
}
}