一、什么事代理模式?
代理模式就是说某一个功能不能直接调用而要通过一个中间人来实现这样一个互通的功能,比如在spring与hibernate集成的时候,我们要做增删改操作时不能直接开启事务操作,所以可以通过TransactionManager事务管理器这个代理来完成,我们要做的就只有配置了,代理它分为三种角色:实际角色,抽象角色,代理角色。根据业务需求,实际角色不会被调用,而是通过代理角色来动态实现的。
二、代理模式分为哪几种?分别是怎么用的?
(1)静态代理
静态代理的特点就是一个业务操作对应一个代理,这样的话,如果业务需求很多就要写很多代理角色,这非常不利于维护和管理,所以这种静态代理并不太被认同。
(2)动态代理
动态代理,顾名思义,就是动态的可以实现多个业务需求实现多种代理服务。这就需要我们定义一个公用的代理类,这个类不是代理类,只是一个可以拿到代理对象的类,该类要实现InvocationHandler
接口,重写invoke(),该方法实际上是通过反射动态掉用的目标方法。但是如何拿到代理对象呢。
- /**
- * 动态代理
- * @author Administrator
- *
- */
- 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 result = method.invoke(target, args);
- System.out.println("完成增加~~~~~");
- return result;
- }
- //动态得到代理对象
- public Object getProxy(){
- return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
- }
- }
/**
* 动态代理
* @author Administrator
*
*/
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 result = method.invoke(target, args);
System.out.println("完成增加~~~~~");
return result;
}
//动态得到代理对象
public Object getProxy(){
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
三、说说代理模式的好处?
动态代理,它实现了无法直接调用目标对象而是通过代理实现调用目标对象的这样一个需求,满足了某些特殊功能的需求。