版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011301372/article/details/81483577
JDK的动态代理
接口
public interface UserDao {
public void update();
public void save();
}
实现类
public class UserDaoImpl implements UserDao {
public void update(){
System.out.println("修改用户。。。");
}
public void save(){
System.out.println("保存用户。。。");
}
}
工具类
public class MyProxyUtils {
public static UserDao getProxy(UserDao dao){
//使用Proxy类生成代理对象
UserDao proxy=(UserDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new InvocationHandler() {
@Override
//代理对象方法一执行,invoke方法就被调用。
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("aaa");
return null;
}
});
//返回代理对象
return proxy;
}
public static UserDao getProxy2(final UserDao dao){
//使用Proxy类生成代理对象
UserDao proxy2 = (UserDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("aaa");
if("save".equals(method.getName())){
System.out.println("记录日志。。。");
}
return method.invoke(dao,args);
}
});
return proxy2;
}
}
测试类
public class Demo1 {
@Test
public void run1(){
UserDao ud = new UserDaoImpl();
ud.update();
ud.save();
}
@Test
public void run2(){
UserDao ud = new UserDaoImpl();
//使用工具类获取代理对象
UserDao proxy= MyProxyUtils.getProxy(ud);
proxy.save();
proxy.update();
}
@Test
public void run3(){
UserDao ud = new UserDaoImpl();
UserDao proxy= MyProxyUtils.getProxy2(ud);
proxy.update();
proxy.save();
}
}
CGLIB的动态代理技术
实现类
public class BookDaoImpl {
public void save(){
System.out.println("保存图书,,,");
}
public void update(){
System.out.println("修改图书。。。");
}
}
工具类
public class MyCglibUtils {
//使用CGLIB的方式生成代理的对象
public static BookDaoImpl getProxy(){
Enhancer enhancer = new Enhancer();
//设置父类
enhancer.setSuperclass(BookDaoImpl.class);
// Callback call = null;
//设置回调函数
enhancer.setCallback(new MethodInterceptor() {
@Override
//代理对象的方法执行,回调函数就会执行
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("bbb");
if(method.getName().equals("save")){
System.out.println("记录日志。。。");
}
//正常执行方法
return methodProxy.invokeSuper(o,objects);
// return null;
}
});
//生成代理对象
BookDaoImpl proxy=(BookDaoImpl)enhancer.create();
return proxy;
}
}
测试类
public class Demo2 {
@Test
public void run1(){
//目标对象
BookDaoImpl dao = new BookDaoImpl();
dao.save();
dao.update();
System.out.println("--------");
BookDaoImpl proxy= MyCglibUtils.getProxy();
proxy.update();
proxy.save();
}
}