1

我有一堆项目声明了一些 spring bean 文件。我想编写一个“库”,它提供一个实用程序,该实用程序采用一些 bean 名称并在对象“周围”添加一些行为(例如:呼叫计数、监控、日志记录等)

一种明显的方法是在项目的 spring xml 文件中添加一些 AspectJ 注释,但我希望“实用程序”搜索一些 bean 并向它们添加行为(这样项目本身不知道效用)。

该实用程序将在 spring xml 文件中的某个地方声明,因此它可以访问 ApplicationContext,因为它可以实现 ApplicationContextAware 接口,但是我热衷于探索如何以编程方式在应用程序上下文中修改另一个 bean 的行为。例如,找到一个 id 为“OrderService”的 bean,围绕所有方法创建一个带有一些监视/调用计数等的切面 bean,并在应用程序上下文中替换该 bean 为“OrderService”

我知道这种方法有缺点,但我追求的是“有可能做到这一点吗?如果可以,怎么做?”

4

2 回答 2

2

如果您不想使用 AOP,可以使用BeanPostProcessor来实现。Spring 文档指出

BeanPostProcessor 接口定义了回调方法,您可以实现这些方法以提供您自己的(或覆盖容器的默认)实例化逻辑、依赖关系解析逻辑等。如果你想在 Spring 容器完成实例化、配置和初始化 bean 之后实现一些自定义逻辑,你可以插入一个或多个 BeanPostProcessor 实现。

因此,您可以创建并注册一个 BeanPostProcessor 并实现该postProcessAfterInitialization(Object bean, String beanName)方法来修改您要自定义的方法。这是一个例子

(但我仍然建议您使用 AOP 执行此操作,因为这是它的经典用例,并且更容易且更具声明性。使用bean() 切入点,您甚至可以建议名称与特定模式匹配的 bean。)

于 2012-08-29T14:15:29.663 回答
1

您可以创建自己的BeanPostProcessor。您只需在其中声明两个它,applicationContext.xml它将在 bean 初始化期间为每个 bean 调用(实际上,就在之前或之后)。在每次调用中,您都会得到一个实际对象及其名称。例如,您可以在那里根据对象的名称或类型包装该对象。

于 2012-08-29T14:15:29.433 回答