2012-08-29 49 views
1

我有一大堆聲明一些spring bean文件的項目。我想寫一個「庫」,提供一個實用工具,它需要一些bean名稱並在對象周圍增加一些行爲(例如:調用計數,監視,記錄等)。使用Spring添加行爲

這樣做的一個顯而易見的方法是在項目的spring xml文件中添加一些AspectJ註釋,但我希望「實用程序」搜索一些bean並向它們添加行爲(這樣項目本身不知道該實用程序)。

該實用程序將在spring xml文件中的某處進行聲明,因此它可以訪問ApplicationContext,因爲它可以實現ApplicationContextAware接口但是我非常熱衷於探索如何以編程方式修改app context中另一個bean的行爲。例如,找到一個id爲「OrderService」的bean,創建一個包含所有方法的監視/調用計數等的bean,並在「OrderService」的應用程序上下文中替換該Bean。

我知道這樣做有缺點但我所追求的是「是否有可能做到這一點?如果是的話,怎麼樣?」

回答

2

如果您不想使用AOP,則可以使用BeanPostProcessor來實現此目的。 Spring文檔states

BeanPostProcessor接口定義回調方法,你可以 實現提供自己的(或覆蓋容器的默認值) 實例化邏輯,依賴解析邏輯,等等。如果你想在Spring容器 完成bean的實例化,配置和其他初始化之後實現一些定製邏輯,你可以插入一個或多個BeanPostProcessor實現。

因此,您可以創建並註冊一個BeanPostProcessor並實現postProcessAfterInitialization(Object bean, String beanName)方法來修改您想要自定義的方法。這是一個example

(但是我仍然建議你使用AOP來做這件事,因爲這是它的經典用例,而且它更容易和更具說明性,對於bean() pointcut,你甚至可以建議名稱與特定模式匹配的bean。)

+0

我幾乎要寫我自己的BeanPostProcessor,但在你提到的博客中描述的「BeanNameAutoProxyCreator」正是我所追求的! –

1

您可以創建自己的BeanPostProcessor。你只需要在applicationContext.xml中聲明它,它將在bean初始化期間爲每個bean調用(事實上,在之前或之後)。在每次調用中,您都會看到實際的對象及其名稱。在那裏,您可以根據其名稱或類型來包裝該對象。