在工作和在线方面,我一直听到关于企业Java开发的术语“代理”。例如,metrics-spring使用以下短语:
该模块执行以下操作:
创建包含带注释方法的指标和代理bean @Timed,@ Metered,@ ExceptionMetered和@Counted [强调我的]
我不熟悉Java生态系统框架和库中的许多语言。我觉得我对what a bean is有很好的理解,但我还不清楚如何代理bean。
代理bean意味着什么?
答案 0 :(得分:11)
通常,你有像
这样的beanBean bean = new Bean(); // actually created by the context
有了这个,你可以做Bean
类声明为行为的任何事情(调用它的方法)。
例如,有时您可以跟踪方法调用所需的时间。
你可以做到
long start = .. // get start time
bean.invoke();
long end = .. // get end time
// end - start
但是为每个方法调用执行此操作很糟糕。因此,存在类似Aspect Oriented Programming的模式,体系结构和样式。
而不是上面的Bean
,你有
Bean bean = new TimingBean(new Bean()); // again done by the context
其中TimingBean
是代理类型,它扩展并实现Bean
扩展和实现的所有类型。对于所有意图和目的, 是Bean
,但在将每个调用委托给Bean
对象之前,它会添加一些额外的行为。在这种情况下,它会跟踪每个Bean
方法执行的时间。
Basic Spring使用JDK proxies和CGLIB proxies。以下是一些differences between them。
它将scheduling and asynchronous invocations用于它。它将它用于transactional support with databases。它将它用于caching。它甚至将它用于Java based container configuration。
答案 1 :(得分:1)
代理意味着您的客户端代码认为它正在与一个bean通信,但代理实际上正在进行侦听和响应。
自早期分布式客户端/服务器计算模型(如CORBA)以来,情况确实如此。客户端将与接口类型进行交互,就好像它存在于其内存空间中一样,但它们实际上正在与代理进行通信,该代理将处理将请求数据编组到请求中的所有混乱细节,通过网络与运行的远程对象进行通信服务器,并将响应解组回客户端。
Spring使用此模型进行远程处理。它也构成了面向方面编程模型的基础。您的代码认为它正在处理特定的接口; Spring可以在该实例之前,之后或周围编写建议,并代表您执行日志记录,事务管理等交叉操作。
答案 2 :(得分:0)
一些框架依赖于一种称为检测的机制,简而言之就是构建给定编译字节码的代理,在我们认为有用的一些地方添加一些代码。这将在它们之间实现多种任务,例如,向Spring bean添加一种分析,就像这个库所声称的那样。
Spring引擎返回它提供的每个托管bean的大量检测代理 - 这样,您可以使用Spring声明式事务处理。您可以在没有实际连接处理的情况下编写“天真”的daos,并且在没有实际事务处理的情况下使用daos的“天真”服务类 - 已检测的代理将包含带有连接实例化,提交,回滚的样板代码......
我希望这有任何帮助