springAOP
的底层是代理模式!
代理模式就是为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。
其实就是代理类为被代理类预处理消息、过滤消息并在此之后将消息转发给被代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系(即上面提到的持有的被带离对象的引用),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。
代理模式的分类:
- 静态代理
- 动态代理
静态代理
角色分析
- 抽象角色:一般使用接口或者抽象类取解决
- 真实角色:被代理的角色
- 代理角色:代理真实角色,代理角色后,会使用一些附属操作
- 客户:访问代理对象的人
优点:
- 可以使用真实角色的操作更加纯粹,不用去关注一些公共的业务
- 公共也就是交给了代理角色,实现了业务的分工
- 公共业务发生扩展时,方便集中管理
缺点:
- 一个真实角色会产生一个代理角色,开发效率会变低
为什么不能直接改变原有代码,在公司改动原有的代码是大忌,可能把别人的代码改错。
动态代理
- 代理对象必须实现一个接口,否则会报异常,原理就是根据接口来生成代理对象的。
- 是通过反射来实现调用的
- 动态代理和静态代理角色是一样的
- 动态代理是代理类是动态生成的,不是直接写好的。
- 需要了解两个类:
Proxy
和InvocationHandler
例子如下:
public interface UserService {
public void add();
public void del();
}
public class UserServiceImpl implements UserService{
@Override
public void add() {
System.out.println("添加");
}
@Override
public void del() {
System.out.println("删除");
}
}
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);
}
//处理代理实例,并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质,是通过反射机制实现
Object result = method.invoke(target,args);
return result;
}
}
import com.chen.ProxyInvocationHandler;
import com.chen.UserService;
import com.chen.UserServiceImpl;
public class Test {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setTarget(userService);
UserService proxy = (UserService) pih.getProxy();
proxy.add();
}
}
输出:
添加