静态代理和动态代理
静态代理
可以在不修改原有代码的基础上实现功能增强的功能,但缺点是要对每一个需要增强的类新建一个代理类。
public class UserServiceImplProxy implements UserService {
private UserServiceImpl userService;
public UserServiceImplProxy() {
this.userService = new UserServiceImpl();
}
@Override
public void addUser() {
System.out.println("添加前。。。");
userService.addUser();
System.out.println("添加后。。。");
}
}
动态代理
- jdk动态代理 :需要实现接口
- cglib动态代理 :不需要实现接口
/**
* 公共jdk动态代理对象生成
* @return
* ClassLoader loader 类加载器 ,通常指定的被代理类的接口的类加载器
* Class<?>[] interfaces 类型, 通常指定被代理类的接口的类型
* InvocationHandler h 委托执行的处理类 加强的功能写在这
*/
public static Object createProxy(Object needProxy){
ClassLoader loader = needProxy.getClass().getClassLoader();
Class<?>[] interfaces = needProxy.getClass().getInterfaces();
InvocationHandler handler = new MyInvocationHandler(needProxy);
// 动态代理类的创建
Object o = Proxy.newProxyInstance(loader, interfaces, handler);
System.out.println("动态代理类:"+o);
return o;
}
// 加强的处理类
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
try {
System.out.println("前置通知。。。");
result = method.invoke(target, args);
}catch (Exception e){
System.out.println("异常通知。。。");
}finally {
System.out.println("后置通知。。。");
}
return result;
}
}
//测试
@Test
public void test01(){
UserService userService = (UserService) MainTest.createProxy(new UserServiceImpl());
userService.addUser(new User());
}
我成功因为我志在成功
浙公网安备 33010602011771号