场景描述: 假设我们有一个实现类- userManager , 这个实现类有很多方法(增删改查).现在需求发生了改变,当我们调用这个类里面的方法的时候,我们要检查一下,你有没有权利调用这些方法.
原接口:userManager
package com.fd;
public interface UserManager {
public void addUser(String username ,String password);
public void delUser(int userId);
public String findUser(int userId);
public void modifyUser(int userId , String username ,String password);
}
原接口实现:userManagerImpl
package com.fd;
public class UserManagerImpl implements UserManager {
public void addUser(String username, String password) {
System.out.println("addUser");
}
public void delUser(int userId) {
System.out.println("delUser");
}
public String findUser(int userId) {
System.out.println("findUser");
return "张三";
}
public void modifyUser(int userId, String username, String password) {
System.out.println("modifyUser");
}
}
现在需求变化,要在调用每一个方法之前,你都要检查一下是否有权限调用这些个方法.
原接口不变
原来的实现类要改变,当然我们不希望改变,我们都知道设计程序的一些原则:”对扩展开放,对修改关闭”.
那么由于需求的变化,我们现在的实现类要修改.(假如实现类中有很多方法的话,那就更痛苦了.)
package com.fd;
public class UserManagerImpl implements UserManager {
public void addUser(String username, String password) {
checkSecurity();
System.out.println("addUser");
}
public void delUser(int userId) {
checkSecurity();
System.out.println("delUser");
}
public String findUser(int userId) {
checkSecurity();
System.out.println("findUser");
return "张三";
}
public void modifyUser(int userId, String username, String password) {
checkSecurity();
System.out.println("modifyUser");
}
public void checkSecurity(){
System.out.println("----------checkSecurity-----------");
}
}
我们在其中加了一个权限检查的方法,而且,在实现类里面的每个方法里面都调用了一次.太麻烦了.而且容易出问题.
那现在我们使用静态代理. 保持原来的实现类不变.多加一个类,同样实现接口UserManager.再加上权限检查的方法.加上一个UserManager的引用.这样让它在执行的时候,去调用这个代理类,如果它有这个权限的话,再让它去调用真正实现类的方法.代码如下.
package com.fd;
public class UserManagerImplProxy implements UserManager {
private UserManager userManager;
public void addUser(String username, String password) {
checkSecurity();
userManager.addUser(username, password);
}
public void delUser(int userId) {
checkSecurity();
userManager.delUser(userId);
}
public String findUser(int userId) {
checkSecurity();
return userManager.findUser(userId);
}
public void modifyUser(int userId, String username, String password) {
checkSecurity();
userManager.modifyUser(userId, username, password);
}
public void checkSecurity() {
System.out.println("----------checkSecurity-----------");
}
}
这样一来,好处就是,原来的程序保持不变,仅仅扩展了一个类.就算出了问题,也好定位.但是,在调用它的方法之前,同样都要先调用同一个方法,就像一个独立的服务.我们可以单独的把它剥离出来.什么时候想加,就加上,想去掉,很轻松的就去掉了.那就看看我们的动态代理.面向接口编程.让目标和代理共同实现一个接口.
动态代理类SecurityHandler
package com.fd;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
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;
}
public void checkSecurity() {
System.out.println("----------checkSecurity-----------");
}
}
客户端代码
package com.fd;
public class Client {
public static void main(String[] args){
SecurityHandler handler = new SecurityHandler();
UserManager userManager = (UserManager)handler.createProxyInstance(new UserManagerImpl());
userManager.addUser("张三", "123");
userManager.delUser(1);
userManager.findUser(2);
}
}
分享到:
相关推荐
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...
java提高-动态代理与静态代理.docx
在故事中,小明是一个客户,它让小红帮忙购买香水,小红就成了一个代理对象,而香水提供商是一个真实的对象,可以售卖香水,小明通过代理商小红,购买到法国的香水,这就是一个代购的例子。我画了一幅图帮助理解这个...
Java中的代理模式--静态代理和动态代理 Java中的代理模式--静态代理和动态代理
Spring专题与案例 Spring代理 静态代理和动态代理 Spring专题与案例-代理(静态和动态) Spring专题与案例-代理(静态和动态)
JAVA静态代理和动态代理
Java静态代理和动态代理
Java各种代理模式以及AOP的实现代码 : 1.AspectJ - 静态代理 2. 动态代理 (1)JDK动态代理 (2)CGlib代理
动态代理的代码例子 里面敲好了注释 搭配文章观看更好
Java中提供了一个java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。代理类在运行时会根据被代理接口自动生成,并且可以通过InvocationHandler接口对方法进行增强。
包含静态代理和动态代理demo代码
Java 动态代理 - Java 动态代理 ...如上图所示,用户不能直接使用目标对象,而是构造出一个代理对象,由代理对象作为中转,代理对象负责调用目标对象真正的行为,从而把结果返回给用户。 也就是说
这里提供了静态代理和动态代理的入门写法~一看即懂!
静态代理和动态代理简单实现代码.Proxy.其中静态代理我写了两个demo,有一个是最原始的,还有一个放在程杰的大化设计模式的代理模式写的,纯属娱乐。
Java动态代理的实现 1 程序架构 创建包proxy.jdk,里面包含下面类和接口,详见批注。 类,实现了UserDao接口接口类测试类,包含main方法 类,实现了UserDao接口 接口 类 测试类,包含main方法 2 功能需求 (1) ...
动态代理和静态代理demo
静态代理和动态代理的讲解和案例,有详细的注释
jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口,则没办法代理这个类。 cglib代理, 1.cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在...
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码