总结
JDK的动态代理和 Spring中的动态代理cglib区别
- JDK 的动态代理 :针对实现了接口的类产生代理.
- Cglib 的动态代理 :针对没有实现接口的类产生代理. 通过生成实现类类的子类对象来产生代理.
1.什么是动态代理技术
1.1 动态代理技术是面向切面编程的一种思想(aop)。
1.2 思想模型
Snip20180605_22.png
2.动态代理技术的好处
可以动态的在B实现类的doSomething()方法前后,添加一些其他的操作方法,对方法进行增强。
3.案例讲解
3.1 场景模拟
在操作数据库之前,我们都需要开启事物,当操作完毕之后还要提交事物,但是如果在每一个操作数据库的方法中都要调用一次的话就会显得很繁琐了,所以我们在动态代理中统一进行处理。
3.2 代码演示
3.2.1 准备一个接口
public interface UserService {
void save();
void delete();
void update();
void find();
}
3.2.2 准备一个实现类
package cn.jianghai.service;
public class UserServiceImpl implements UserService{
@Override
public void save() {
System.out.println("保存用户!");
}
@Override
public void delete() {
System.out.println("删除用户!");
}
@Override
public void update() {
System.out.println("更新用户!");
}
@Override
public void find() {
System.out.println("查找用户!");
}
}
3.2.3 准备一个动态代理类
public class UserServiceProxyFactory implements MethodInterceptor {
public UserService getUserServiceProxy() {
Enhancer enhancer = new Enhancer(); //帮我们生成代理对象
enhancer.setSuperclass(UserServiceImpl.class); // //设置对谁进行代理
enhancer.setCallback(this); // 设置代理回调方法
UserService userService = (UserService) enhancer.create(); //创建代理对象
return userService;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//打开事务
System.out.println("打开事务!");
//调用原有方法
Object returnValue = methodProxy.invokeSuper(o, objects);
//提交事务
System.out.println("提交事务!");
return returnValue;
}
}
3.2.4 测试
public class Demo {
@Test
public void func(){
UserServiceProxyFactory userServiceProxyFactory = new UserServiceProxyFactory();
UserService userServiceProxy = userServiceProxyFactory.getUserServiceProxy();
userServiceProxy.save();
//判断代理对象是否属于被代理对象类型
//代理对象继承了被代理对象=>true
System.out.println(userServiceProxy instanceof UserServiceImpl);//true
}
}
查看测试结果

网友评论