Java动态代理模式框架
为什么学习:
这是SpringAOP的底层! 代理模式的分类: ·静态代理 ·动态代理 1.静态代理 ·抽象角色:使用接口或抽象类来解决 ·真实角色:被代理的角色 ·代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作 ·客户:被访问代理对象的 代理模式的好处: ·真实角色更加纯粹!不用去关注一些公共的业务 ·公共也就交给了代理角色!实现了业务的分工! ·公共业务发生扩展的时候,方便集中管理!
· ·一个动态代理类代理的是一个接口,一般就是对应的一类业务
·一个动态代理类可以代理多个类,只要实现了同一个接口即可!
框架:
package com.xiong.demo04;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
//被代理的接口
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//生成得到代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
//处理代理实例并返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
Object result = method.invoke(target,args);
return result;
}
public void log(String msg){
System.out.println("增加了一个" + msg + "方法");
}
}
package com.xiong.demo04;
import com.xiong.demo02.UserService;
import com.xiong.demo02.UserServiceImpl;
public class Client {
public static void main(String[] args) {
//真实角色
UserServiceImpl userService = new UserServiceImpl();
//代理角色不存在
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setTarget(userService); //设置需要代理的对象
//动态生成代理类
UserService proxy =(UserService) pih.getProxy();
//之前写的UserServiceImpl中的方法
proxy.add();
}
}
本质还是java的反射机制,不懂的可以先去了解,