1.什么是动态代理技术
1.1 动态代理技术是面向切面编程的一种思想(aop)。
1.2 思想模型 Snip20180601_19.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 InvocationHandler {
private UserService userService;
public UserServiceProxyFactory(UserService userService) {
super();
this.userService = userService;
}
public UserService getUserServiceProxy() {
// 生成动态代理(这里需要一个任意的classLoader)
ClassLoader classLoader = UserServiceProxyFactory.class.getClassLoader();
// 实现类中的全部接口方法
Class<?>[] classes = UserServiceImpl.class.getInterfaces();
// 代理类是谁,那么这个invocationHandler 传的就是谁的实例
InvocationHandler invocationHandler = this;
// 返回的是接口的实现类
UserService usProxy = (UserService)Proxy.newProxyInstance(classLoader, classes, invocationHandler);
return usProxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("打开事务!");
Object invoke = method.invoke(this.userService, args);
System.out.println("提交事务!");
return invoke;
}
}
3.2.4 测试
public class Demo {
@Test
public void func() {
UserService userService = new UserServiceImpl();
UserServiceProxyFactory userServiceProxyFactory = new UserServiceProxyFactory(userService);
UserService userServiceProxy = userServiceProxyFactory.getUserServiceProxy();
userServiceProxy.save();
}
}
查看测试结果
Snip20180601_20.png
网友评论