提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:
代理是理解Spring容器重要的途径,但是代理模式的核心就是去复杂的部分,
将我们不关心的、共同的部分提到一个公共的部分。
这个公共部分由其特点分为JDK代理、CGlib代理。
提示:以下是本篇文章正文内容,下面案例可供参考
一、代理应用场景?
代理的应用场景体现在一种统一的思想,何为统一的思想,就是复杂的事交给专业的人去做。就像你通讯录中只需保存修理工-小王,装修工-小张。那么家里的修理、装修的事情你就啥都不用问了,只需要按一下电话按钮。同时,你当然可以将联系方式推荐给你自己的同事或朋友。
二、java代理
代理这个东西也是分类的,简单的说
1. 静态代理
2. 动态代理
3. cglib代理
静态代理
/**
* 买房子的中介
*/
public class Proxy implements Rent{
Rent rent = new Host();
@Override
public void Rent() {
System.out.println("把房源信息挂在网站中,打电话,找买家,谈好价格");
rent.Rent();
System.out.println("跟踪资金走向");
}
}
public class Client {
public static void main(String[] args) {
Rent hostRent = new Proxy();
hostRent.Rent();
}
}
这种方式的缺点是代码中将会充满xxxProxy类,这就很恶心。
动态代理
public class ProxyHandler implements InvocationHandler {
// 要代理的类
private Object object;
// 构造函数中将要代理的类请进来
public ProxyHandler(Object object){
this.object = object;
}
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
System.out.println("开始代理");
method.invoke(object,objects);
System.out.println("结束代理");
return null;
}
}
public static void main(String[] args) {
// 要被代理的类来了
Rent rent = new Host();
// 被代理的类找到了代理类
InvocationHandler handler = new ProxyHandler(rent);
// 告诉代理类“加载器、接口方法、被代理类
Rent rentProxy = (Rent)Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(), handler);
rentProxy.rent();
}
很明显,卖房子不好卖了,是不是可以只要“开始代理、结束代理”就可以依然可以使用该代理类,啥都不用改,但是这里存在一个问题是,抽象层方面必需是接口
CGLIB代理实现
public class ProxyHandler implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("开始代理");
methodProxy.invokeSuper(o,objects);
System.out.println("结束代理");
return null;
}
}
public class CglibClient {
public static void main(String[] args) {
// 增强类
Enhancer enhancer = new Enhancer();
// 房东揉进来
enhancer.setSuperclass(Host.class);
// 中介进行代理
enhancer.setCallback(new ProxyHandler());
// 开始工作喽
Host proxyHost = (Host) enhancer.create();
proxyHost.rent();
}
}
在这里注意ASM与jdk的版本问题。这个是Spring用的最多的一种,所以要注意
3.java代理与spring AOP的关系
其实Spring容器的AOP实际使用CGlib的动态代理。
总结
提示:这里仅仅是简单的介绍,要结合Spring AOP的源代码来理解,才可以。