平时我们总用到代理,这里我简单讲解一下我们用的静态代理和动态代理。
一 、静态代理:通过代理来实现真实对象的方法,在访问的时候不需要访问真实的对象,从而实现了对真实对象的保护。
静态代理实现:
public class UserManagerProxy implements UserManager {
private UserManager userManager;
public UserManagerProxy(UserManager userManager){
this.userManager=userManager;
}
@Override
public void addUser(String username, String password) {
// TODO Auto-generated method stub
checkSecurity();
userManager.addUser(username, password);
}
@Override
public void delUser(int userId) {
// TODO Auto-generated method stub
checkSecurity();
userManager.delUser(userId);
}
private void checkSecurity(){
System.out.println("------UserManagerImpl.checkSecurity()-------");
}
}
从上述代码我们可以看到checkSecurity方法出现在各个角落,复用性不强。并且我们通过public class UserManagerProxy implements UserManager可以发现一个代理方法只能代理一个真实的类,这样我们在代理其他类的时候其实并不灵活,为了解决这个问题我们采用动态代理。动态代理,其实在代理方法中并没有确定一个具体的代理类,而是通过传入一个代理方法的参数来确定代理的真实的方法。并且我们需要调用的服务也只需要写一次就可以。这样可以讲服务横向加入我们的程序中代码会更加简洁,AOP的核心思想就是动态代理,通过将服务横向加入程序来简化我们的diamante,更好的管理我们的程序。
二 、动态代理实现:
<span style="font-size:14px;">public class SecurityHandler implements InvocationHandler {
private Object targetObject;
public Object createProxyInstance(Object targetObject){
this.targetObject=targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
checkSecurity();
//真正的掉目标方法
Object ret=method.invoke(targetObject, args);
return ret;
}
private void checkSecurity(){
System.out.println("------UserManagerImpl.checkSecurity()-------");
}
} </span>
客户端代码:<span style="font-size:14px;">public class Client {
public static void main(String[] args){
SecurityHandler handler= new SecurityHandler();
UserManager usermanager=(UserManager)handler.createProxyInstance(new UserManagerImpl());
usermanager.addUser("张三", "123");
}
}</span>
总结:
动态代理的优点:
(1)不会访问真实的类,对真实的类优保护
(2)延迟到具体实现的时候采取决定调用的方法,更加灵活。
(3)将一些服务横向加入程序,更简便,代码复用性也更强。