2017-09-27 1 views
1

私のプロジェクトでは、開発者が快適に使える基本クラスを数多く提供しており、Spring BeanとしてXML構成に宣言する必要があります。Spring Beanのスコープを自己チェックする方法は?

私は注釈設定は、基本クラスから継承されることを既に認識していますが、私たちは主に私が何をしたいXML

@SpringAnnotation 
public abstract class Parent{} 

//Will apply any @SpringAnnotation 
public class Child{} 

を使用するには、基本クラスでのセルフチェックです。開発者がBeanのスコープをドキュメント化された値に設定することを忘れた場合(たとえば、現在の例では「request」)、継承したBeanは、開発者にスコープを変更するように通知する例外をスローするようにします。

など。

public void afterPropertiesSet() 
{ 
    if (!thisBean.getScope().equals("request")) 
     throw new BeansException("Sorry but this bean works only when it is a request bean"); 
} 

私は春は、Bean自体に(スコープと多くのものと一緒に)Beanの独自の定義を注入かもしれないBeanDefinitionAwareのいずれかの種類を定義していないことを見てきました。

すぐに自力で解決策が出るかもしれません。

答えて

1

BeanFactoryPostProcessorインターフェイスを実装するBeanを定義できます。

BeanFactoryPostProcessor Spring docで報告されているように、すべてのBean定義がロードされているにもかかわらず、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インスタンスの対話が必要な場合は、代わりにBeanPostProcessorを実装することを検討してください。

+0

これはクールです。私は基本クラスを拡張するクラスのBeanを分析することができました。私は自分の 'BeanDefinitionAware'を(BeanPostProcessorを介して)実装することも考えていました。実際、多くの方法があるように見えます –

関連する問題