我有一堆项目声明了一些spring bean文件。我想写一个“库”,它提供一个实用程序,它接受一些bean名称并在对象周围添加一些行为(例如:调用计数,监视,记录等)
这样做的一个显而易见的方法是在项目的spring xml文件中添加一些AspectJ注释,但我希望“实用程序”能够搜索一些bean并为它们添加行为(这样项目本身就不是意识到这个效用)。
该实用程序将在某个地方的spring xml文件中声明,因此它可以访问ApplicationContext,因为它可以实现ApplicationContextAware接口但是我热衷于探索如何以编程方式修改app环境中另一个bean的行为。例如,找到一个id为“OrderService”的bean,在所有方法周围创建一个带有一些监视/调用计数等的aspected bean,并在应用程序上下文中替换“OrderService”
我知道这种方法有缺点,但我所追求的是“它是否有可能做到这一点?如果是的话怎么样?”
答案 0 :(得分:2)
如果您不想使用AOP,可以使用BeanPostProcessor来实现此目的。 Spring文档states:
BeanPostProcessor接口定义了您可以使用的回调方法 实现提供自己的(或覆盖容器的默认值) 实例化逻辑,依赖性解析逻辑等。如果你 想在Spring容器之后实现一些自定义逻辑 完成实例化,配置和初始化 bean,你可以插入一个或多个BeanPostProcessor实现。
因此,您可以创建并注册BeanPostProcessor并实现postProcessAfterInitialization(Object bean, String beanName)
方法来修改要自定义的方法。这是一个example。
(但我仍然建议您使用AOP执行此操作,因为这是它的经典用例,它更容易,更具声明性。使用bean() pointcut,您甚至可以建议名称与某个匹配的bean图案。)
答案 1 :(得分:1)
您可以创建自己的BeanPostProcessor。你只需要在applicationContext.xml
中声明它,并在bean的初始化期间为每个bean调用它(事实上,就在之前或之后)。在每次调用中,您都会获得实际对象及其名称。在那里,您可以根据其名称或类型包装该对象。