簡體   English   中英

如何自檢Spring bean的作用域?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM