[英]How to self-check the Spring bean scope?
我的項目提供了許多(一個 nuuuuumbeeeeer)基類,開發人員可以根據需要擴展這些基類,並且必須在 XML 配置中聲明為 Spring bean。
我已經知道annotation config是從基類繼承的,但是我們主要使用XML
@SpringAnnotation
public abstract class Parent{}
//Will apply any @SpringAnnotation
public class Child{}
我想做的是在基類中進行自檢。 如果開發人員忘記將 bean 的范圍設置為文檔值(例如,對於當前示例,“請求”),我希望繼承的 bean 拋出異常,提醒開發人員更改范圍。
例如
public void afterPropertiesSet()
{
if (!thisBean.getScope().equals("request"))
throw new BeansException("Sorry but this bean works only when it is a request bean");
}
我已經看到 Spring 沒有定義任何類型的BeanDefinitionAware
,它可能會將 bean 自己的定義(以及作用域和很多東西)注入 bean 本身。
任何的想法? 我可能很快就會提出一個自制的解決方案。
您可以定義一個實現BeanFactoryPostProcessor
接口的 bean。
正如BeanFactoryPostProcessor Spring doc 中所報告的那樣,當所有 bean 定義都已加載但尚未實例化任何 bean 時,將調用實現BeanFactoryPostProcessor
bean。 通過這種方式,您將能夠讀取所有 bean 定義並檢查 bean 是否已正確配置。
這是一個例子:
public class CustomBeanFactory implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
for (String beanName : beanFactory.getBeanDefinitionNames()) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
// Analyze the bean definition
}
}
}
最后但並非最不重要的一點,請記住BeanFactoryPostProcessor
可以與 bean 定義交互並修改 bean 定義,但絕不能與 bean 實例交互。 這樣做可能會導致 bean 過早實例化、違反容器並導致意外的副作用。 如果需要 bean 實例交互,請考慮實現BeanPostProcessor
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.