设计模式中的代理模式理解。代理模式又分为动态代理和静态代理。今天就来入门一下 这两种代理的区别。
首先 来说说 为什么要用代理模式呢。在我们日常程序开发中 经常会遇到这样的需求,要求改变某一个执行方法的逻辑,实际情况中 经常见到的 比如 在执行某个方法的时候 先来 查看执行此方法的权限。
通常的方法 一开始 我们也许会直接改变方法体 在里面进行硬代码植入,这样就改变了原来的实现代码,如果此方法在程序种用到很多 势必造成大量的修改,也会改变 原有的测试准确性。在加上设计模式的OCP(开闭原则) 这也是不可行的。
public interface UserManager { /** * 添加 */ public void add(); /** * 查询 * @return */ public int selectById(); /** * 删除 */ public void del(); }
public class UserManagerIml implements UserManager { @Override public void add() { // TODO Auto-generated method stub System.out.println("添加"); } @Override public int selectById() { // TODO Auto-generated method stub System.out.println("查询"); return 2; } @Override public void del() { // TODO Auto-generated method stub System.out.println("删除"); }
以上是接口和实现类的代码。
突然老板 哪天说 我要在这些方法执行前 加一些特殊的处理,以checkMethod() 方法为例
public void checkMethod(){ System.out.println("--------security----------"); }
难道我们要在每个方法调用前都要加上此方法吗,那是一个什么样的工作量呢?就算加上了,后期老板又说 不需要呢? 我们继续注释掉? 这个时候 就出现了我们常说的代理模式,首先来看静态代理的处理方法。
依然创建一个类 来实现 UserManager 接口。
静态代理:
public class StaticProxyTest implements UserManager { private UserManager um; public StaticProxyTest(UserManager um){ this.um = um; } @Override public void add() { checkMethod(); um.add(); } @Override public int selectById() { checkMethod(); return um.selectById(); } @Override public void del() { checkMethod(); um.del(); } //切点 public void checkMethod(){ System.out.println("--------security----------"); } }
实现代理功能的类,实现的方法也只是代理功能,并非真正的调用 最终实现方法。虽然此方法避免了 在程序各个地方 进行粘贴checkMethod方法,但是在 这个代理类中 还是重复了粘贴,并且此代理类 只代理了UserManager 一个类。拓展性 依然有局限。
动态代理:
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 createProxyObject(Object object){ this.targetObject = object; return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub //切点 checkMethod(); return method.invoke(targetObject, args); } public void checkMethod(){ System.out.println("--------security----------"); } }
动态代理 运用了几个 java jdk中常用的一些基础知识。在实现createProxyObject创建代理方法的时候 我们要实现一个代理Proxy.newProxyInstance创建代理,传入要代理类对象的装载器,接口方法,以及实现InvocationHandler接口的方法类,并返回代理类。代理类创建成功时 在执行中运用反射 Method调用 invoke()方法 传递参数。
public class Client { public static void main(String[] args) { SecurityHandler sh = new SecurityHandler(); UserManager um = (UserManager)sh.createProxyObject(new UserManagerIml()); um.add(); } }
执行打印:
--------security----------
添加
在以前常用的 一些 系统中 一些权限的处理和实现 就是动态代理实现。还有spring 最重要的特性aop也是动态代理原理。
相关推荐
Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...
总结来说,Spring的静态代理和动态代理都用于实现AOP,静态代理适用于简单场景,但需要手动编写代理类,而动态代理则更加灵活,可以在运行时动态创建代理对象,适用于接口众多的情况。了解和掌握这两种代理模式对于...
代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...
本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...
在这个“包含静态代理和动态代理demo代码”的压缩包中,我们可能会看到两种常见的Java代理实现方式的示例:静态代理和动态代理。 首先,我们来详细讲解静态代理。在静态代理中,代理类和真实类(目标类)都是在编译...
静态代理和动态代理是两种常见的代理模式,它们在Java中有着广泛的应用,特别是在SpringBoot等框架中。本资源提供了一个简单的Java实现,适用于JDK1.8版本,并经过了验证,对初学者理解设计模式具有指导意义。 静态...
代理模式分为两种主要类型:静态代理和动态代理。 **静态代理** 静态代理是通过程序员手动创建一个代理类来实现的。这个代理类实现了与目标类相同的接口,并且在调用目标方法时添加额外的逻辑。以下是一个简单的...
本教程将深入探讨静态代理和JDK动态代理的概念、工作原理以及如何实现。 ### 静态代理 静态代理是在编译时就确定了代理类和目标类的关系。代理类和目标类通常都需要实现相同的接口,以便于在代理类中调用目标类的...
代理模式可以分为两种主要类型:静态代理和动态代理。这两种代理方式各有特点,广泛应用于软件系统中,如权限控制、缓存、事务管理等场景。 **静态代理** 静态代理是最基础的代理形式,代理类和被代理类在编译时就...
总结来说,静态代理和动态代理都是为了在调用对象方法时添加额外的行为,但静态代理需要预先定义代理类,而动态代理可以在运行时动态创建代理对象。在某些场景下,如接口数量多或频繁变动时,动态代理更具优势,因为...
代理模式通常分为静态代理和动态代理两种类型,这两种代理方式各有特点,适用于不同的场景。 **静态代理** 静态代理是通过程序员手动创建一个代理类来实现的。代理类和真实目标类需要实现相同的接口,以便代理类...
在Java中,代理主要分为静态代理和动态代理。 1. 静态代理: 静态代理是在编译时就已经明确代理类与被代理类关系的一种方式。为了实现静态代理,我们需要手动创建一个代理类,这个代理类通常会实现与被代理类相同的...
Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 - **JDK动态代理**:基于接口的代理,要求被代理的类必须实现至少一个接口。动态代理通过实现`java.lang.reflect.InvocationHandler`接口并...
Java提供了两种主要的代理实现方式:静态代理和动态代理。 ### 静态代理 静态代理是在编译时就已经确定了代理关系。首先,我们需要定义一个接口,比如`Car`,这个接口描述了汽车的行为: ```java public ...
Java中的代理模式--静态代理和动态代理 Java中的代理模式--静态代理和动态代理