一、静态代理
public class UserServiceImpl implements UserService {
@Override
public void add() {
}
}
public class UserProxy {
private UserService userService;
public UserProxy(UserService userService) {
this.userService = userService;
}
public void add(){
System.out.println("开启静态代理事务");
System.out.println("更新user");
System.out.println("提交静态代理事务");
}
}
2.测试代码
@SpringBootTest
class StaticproxyApplicationTests {
@Test
void contextLoads() {
UserService userService = new UserServiceImpl();
UserProxy userProxy = new UserProxy(userService);
userProxy.add();
}
}
二、动态代理
public class DynamicProxy implements InvocationHandler {
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理开启事务");
Object invoke = method.invoke(target, args);
System.out.println("动态代理提交事务");
return invoke;
}
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
DynamicProxy dynamicProxy = new DynamicProxy(userService);
ClassLoader classLoader = userService.getClass().getClassLoader();
Class<?>[] interfaces = userService.getClass().getInterfaces();
UserService service = (UserService) Proxy.newProxyInstance(classLoader, interfaces, dynamicProxy);
service.add();
}
}
总结:
静态代理编译期生成代理类;动态代理运行期生成代理类。
静态代理和被代理类及其业务逻辑耦合,适用性较差且代理逻辑难以扩展;动态代理可以在不知道被代理类的前提下编写代理逻辑,运行时才决定被代理对象,适用性好且代理逻辑易于扩展。