2011-03-03 93 views
2

我在任何地方都会一直在阅读,当您要求在bean中注入依赖关系时,您会为该资源的实例注入代理。我相信我知道代理是什么,它是一个知道如何将消息转发到另一个实例的实例。还有人说,这种模式允许容器为这个托管的bean提供服务。JAVA EE代理模式

我不太明白这一点。为什么代理必需?这是如何实施的?是否有每个bean的代理对象?或者我有很多代理转发到一个实例?或者可能都不是?

此外,从GoF的书籍设计模式中,我已经读到,你必须提供一个充当占位符的代理类。但是我从来没有在Java EE中这样做,应用程序服务器在运行时创建代理类吗?

回答

4

代理模式背后的基本假设是,你不应该从“用户”的角度来关心它。代理伪装成声明的类型,并且应该以相同的方式运行。附加值来自代理在转发或返回到目标实例的调用之前或之后执行的操作。这是如何交易和安全在容器中执行。

至于添加的问题:是的,应用程序服务器在必要时创建这些代理类。

+1

Martin。我在想你的答案和在运行时创建代理类的可能实现。我想出了这个如何工作的想法。假设我有一个测试课。应用程序服务器所做的是使用Java反射api,它扩展了测试类,并遍历每个操作覆盖它们,例如在调用超类方法之前和之后添加begin()和end()事务调用,然后返回一个对这个孩子班,这是正确的吗? – arg20 2011-03-03 19:16:13

+1

是的,这基本上是发生了什么事情。当然,有不同的技术方法来实现代理。如果你想自己使用这种技术,一个非常简单但功能强大的方法是使用标准库中的DynamicProxy类。其他方法是字节码增强和面向方面的编程(在大多数情况下依靠字节码增强)。 – 2011-03-03 21:06:30