`
y806839048
  • 浏览: 1126233 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

JAVA两种代理模式

阅读更多

总括:

代理实现的基本思路:(aop原理)现在直接用aop的多

1,实现相应的代理接口(jdk--invocationHandle,cglib---MethodInceptor)

 

2,定义获取代理实例方法

 

3,重写代理组合执行的方法

 

jdk--实现接口类的实现类才可生成此代理

cglib--任何实现类都可生成此代理

 

 

应用的时候:

先根据需要生成代理的类生成代理,然后操作代理类调用原始方式,此时会自动拦截进入代理类的组合方法组合执行

 

 

示例:

 

 

简单设计动态代理,基本模拟spring的动态代理方式。

before afterReturning around afterException after这些通知方法都可以这块模拟出来

spring的AOP: 

1.在容器中的对象如果实现了接口则采用JDK的动态代理。

2在容器中的对象没有实现接口,则用(cglib)继承的方式实现动态代理。

现在模拟spring的动态代理。

首先准备接口(UserService)和实现接口的目标对象(UserServiceImpl)。

 

1 public interface UserService {
2 
3 void save(); 
4 
5 }
复制代码
1 public class UserServiceImpl implements UserService {
2 
3     public void save() {
4         System.out.println("保存用户");
5     } 
6 
7 }
复制代码

 

1.动态代理

复制代码
 1 /**
 2  * 动态代理1
 3  * 
 4  * @author shihaibin
 5  * @param <T>
 6  *
 7  */
 8 public class UserServiceProxyFactory implements InvocationHandler {
 9 
10     Object impl;
11 
12     public <T> Object getProxy(Class<T> clz) {
13         try {
14             impl = clz.newInstance();
15         } catch (InstantiationException e) {
16             // TODO Auto-generated catch block
17             e.printStackTrace();
18         } catch (IllegalAccessException e) {
19             // TODO Auto-generated catch block
20             e.printStackTrace();
21         }
22         // 生成动态代理
23         Object usProxy = Proxy.newProxyInstance(clz.getClassLoader(), clz.getInterfaces(), this);
24         // 返回
25         return usProxy;
26     }
27 
28     /**
29      * 参数:1.当前代理對象 2.当前方法 3.当前方法执行的时候的参数
30      */
31     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
32         before();
33         Object invoke = method.invoke(impl, args);
34         after();
35         return invoke;
36     }
37     //可以重写
38     public void before() {
39         System.out.println("之后");
40     }
41 
42     public void after() {
43         System.out.println("之后");
44     }
45 }
复制代码

测试:

复制代码
1 @Test
2     public void find1() {
3         // 简单的aop
4         UserServiceProxyFactory factory = new UserServiceProxyFactory();
5         UserService userServiceProxy = (UserService) factory.getProxy(UserServiceImpl.class);
6         userServiceProxy.save(); 
7         System.out.println(userServiceProxy instanceof UserServiceImpl);
8     }
复制代码

 

2.cglib代理

复制代码
 1 /**
 2  * 动态代理2 cglib代理
 3  * 
 4  * @author shihaibin
 5  *
 6  */
 7 public class UserServiceProxyFactory2 implements MethodInterceptor {
 8 
 9     public <T> Object getProxy(Class<T> clz) {
10         Enhancer en = new Enhancer();// 帮我们生成代理对象
11         en.setSuperclass(clz);// 设置对谁进行代理
12         en.setCallback(this);//回调函数
13         return en.create();// 创建代理对象;
14     }
15 
16     /**
17      * prxoyobj:被代理的原始对象 method:被代理的原始方法 arg:运行期的参数 methodProxy:产生的代理方法
18      */
19     public Object intercept(Object prxoyobj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
20         // 打开事务
21         System.out.println("打开事务!");
22         // 调用原有方法
23         Object invokeSuper = methodProxy.invokeSuper(prxoyobj, arg);
24         // 提交事务
25         System.out.println("提交事务!");
26         return invokeSuper;
27     }
28 }
复制代码

 

测试:

复制代码
 1 @Test
 2     public void find2() {
 3         // 重写aop前后方法
 4         UserServiceProxyFactory2 factoryContext = new UserServiceProxyFactory2();
 5         UserService userServiceProxy = (UserService) factoryContext.getProxy(UserServiceImpl.class);
 6         userServiceProxy.save();
 7         // 判断代理对象是否属于被代理对象类型
 8         // 代理对象继承了被代理对象=>true
 9         System.out.println(userServiceProxy instanceof UserServiceImpl);// 判断是否属于被代理对象类型
10     }
复制代码
分享到:
评论

相关推荐

    Java两种代理模式案例

    下面将详细介绍这两种代理模式,并结合`ProxyDemo`案例进行说明。 ### 1. 静态代理 静态代理是最基础的代理形式,它通过显式创建一个代理类来实现对目标对象的代理。代理类和目标对象实现相同的接口,从而可以在不...

    Java设计模式-代理模式例子

    在Java中,代理模式主要有静态代理和动态代理两种实现方式。 1. 静态代理:在编译时就已经确定了代理类与目标类的关系。通常,代理类会实现和目标类相同的接口,以便于在代理类中调用目标类的方法。这种方式的缺点...

    JAVA设计模式之代理模式实例

    代理模式主要分为静态代理和动态代理两种类型。 1. 静态代理 在静态代理中,代理类和目标类是在编译时就已经确定的,它们通常具有相同的接口。客户端通过代理类调用方法,代理类再转发到目标类。以下是一个简单的...

    JAVA设计模式(代理模式)

    2. **动态代理:**在运行时动态生成代理对象,Java提供了两种动态代理方式:一是通过实现InvocationHandler接口,利用反射机制动态创建代理对象;二是JDK的动态代理API,如java.lang.reflect.Proxy类。动态代理更加...

    Java中的代理模式Demo

    在Java中,有两种主要的实现代理模式的方式: 1. 静态代理:静态代理是通过程序员手动创建一个代理类,这个代理类实现了与目标类相同的接口,然后在代理类的方法中调用目标类的相应方法。这种方式的优点是代码清晰...

    用Java实现的代理模式之动态代理

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

    Java设计模式——代理设计模式(静态代理和动态代理)

    代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...

    java代理模式

    在Java中,代理模式主要有静态代理和动态代理两种实现方式。 一、静态代理 静态代理是在编译时就已经确定了代理关系。代理类和目标类需要实现相同的接口,这样代理类就可以持有目标类的引用,并在调用目标类方法...

    java装饰模式及动态代理模式示例源码

    装饰模式和动态代理模式是Java编程中两种非常重要的设计模式,它们都在代码的扩展性和灵活性方面发挥着关键作用。下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。...

    java23种设计模式之代理模式

    在Java中,代理模式有两种主要实现方式:静态代理和动态代理。 1. 静态代理: 静态代理是在编译时就已经确定代理关系的方式。首先,我们需要创建一个实现了相同接口的代理类,该类将持有原对象的引用并转发调用。...

    java24种设计模式详解

    - **代理模式(Proxy)**:为其他对象提供一种代理以控制对这个对象的访问。 - **组合模式(Composite)**:允许你将对象组合成树形结构,表现得像单个对象。 - **享元模式(Flyweight)**:在不影响单个对象的...

    java三种方法实现代理模式(源码+jar包)

    总的来说,掌握这三种代理模式对于提升Java开发能力至关重要,尤其是在大型项目中,合理使用代理模式可以有效解耦代码,提高代码的可维护性和复用性。通过分析和实践提供的源码,你可以更深入地理解代理模式的工作...

    java 动态代理模式 适配器模式

    Java动态代理模式与适配器模式是两种在软件设计中常用的设计模式,它们都有各自的优点和应用场景。在Java中,动态代理模式主要依赖于Java的反射API和InvocationHandler接口,而适配器模式则用于解决不同接口之间的...

    java静态代理、动态代理、装饰设计模式

    Java提供了两种实现代理的主要方式:静态代理和动态代理。 **静态代理** 静态代理是最基础的形式,它需要程序员手动创建一个代理类,该类实现了与目标类相同的接口。代理类持有目标类的引用,并在调用目标类方法...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂

    在Java实现中,有静态代理和动态代理两种方式。静态代理是由开发者显式创建代理类,而动态代理则利用Java的动态代理API在运行时动态生成代理类。 工厂模式是一种创建型设计模式,它提供了一种创建对象的统一接口,...

    java26种设计模式

    - 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 -享元模式(Flyweight):用于减少创建对象的数量,以节省内存。 3. **行为型设计模式**: - 责任链模式(Chain of Responsibility):...

    Java设计模式-代理模式

    代理模式在Java中有两种常见的实现方式:静态代理和动态代理。静态代理是通过程序员显式创建代理类来实现的,而动态代理则利用Java的反射API在运行时动态创建代理对象。 1. **静态代理**:在静态代理中,我们需要为...

    代理模式java代码 Proxy(1)

    在Java中实现代理模式,通常有两种方式:静态代理和动态代理。 首先,我们来看静态代理。静态代理是通过创建一个代理类来实现对目标对象的代理,这个代理类和目标类具有相同的接口,代理类在调用目标对象方法时可以...

Global site tag (gtag.js) - Google Analytics