JAVA EE代理模式

3

我在各处都看到这样的说法:当您要求将依赖项注入bean时,会注入一个代理以引用该资源的实例。我认为我知道代理是什么,它是一个知道如何将消息转发到另一个实例的实例。还指出,正是这种模式使容器能够向这些受管bean提供服务。

我不太理解这一点。为什么需要代理?这是如何实现的?每个bean都有一个代理对象吗?还是我有许多代理对象转发到一个实例?或者可能两者都不是?

此外,从GoF的设计模式书中,我了解到您必须提供一个充当占位符的代理类。但是在Java EE中我从未这样做过,应用服务器是否会在运行时创建代理类?

1个回答

5
代理模式的基本假设是,从"用户"的角度来看,你不需要关心它。代理作为声明类型的替身,并且应该表现出相同的行为。增加的价值来自于代理在转发或返回调用到目标实例之前或之后所执行的操作。这就是例如容器中如何实现事务和安全性的方式。
至于额外的问题:是的,当必要时应用服务器会创建这些代理类。

1
马丁,我在思考你的回答以及在运行时创建代理类的可能实现方式。我想到了一个想法,它是如何工作的。假设我有一个测试类。应用服务器使用Java反射API扩展测试类,并迭代每个操作,覆盖它们并添加例如:在调用超类方法之前和之后添加begin()和end()事务调用,然后返回对这个子类的引用,这样正确吗? - arg20
1
是的,这基本上就是正在发生的事情。当然,有不同的技术方法来实现代理。一个非常简单但强大的方法是使用标准库中的DynamicProxy类,如果你想自己尝试这种技术的话。其他方法包括字节码增强和面向方面的编程(在大多数情况下依赖于字节码增强)。 - Martin Klinke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接