2010-12-27 7 views
41

にプログラム豆を追加し、私は自分のWebアプリケーションにプログラム的にBeanを追加しようとしています。私は@Componentアノテーションで作成したSpring Beanを持っており、ApplicationContextAwareインターフェイスを実装しています。があるため、プラグインアーキテクチャの春のWebアプリケーションコンテキスト

マイオーバーライド機能は、次のようになります。

@Override 
public void setApplicationContext(ApplicationContext applicationContext) 
     throws BeansException { 

    // this fails 
    this.applicationContext = (GenericWebApplicationContext) applicationContext; 
} 

基本的に、私はsetApplicationContextに与えられたのApplicationContextオブジェクトにBeanを追加する方法を見つけ出すことはできません。誰かが私がこれについてどうやって間違った方法をしているか教えてもらえますか?

[OK]を、これは私が解決策としてになってしまったものです:春3.0で

@Override 
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry bdr) 
     throws BeansException { 
    BeanDefinition definition = new RootBeanDefinition(
      <My Class>.class); 

    bdr.registerBeanDefinition("<my id>", definition); 
} 

答えて

34

あなたのBeanがBeanDefinitionRegistryPostProcessorを実装作り、BeanDefinitionRegistryを経由して新しい豆を追加することができます。

以前のバージョンのSpringでは、BeanFactoryPostProcessorで同じことをすることができます(ただし、BeanFactoryBeanDefinitionRegistryにキャストする必要がありますが失敗する可能性があります)。

+7

ありがとう:ここでは簡単なコードです。私は一番難しい部分は何を探すべきかを知っていると思います。 – user146714

+1

[のJavaDoc](http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/beans/factory/config/BeanPostProcessor.htmlどおりという気をつけてください。 ): 'BeanFactoryPostProcessorは、Bean定義と対話して変更することができますが、Beanのインスタンスは変更しません。そうすると、Beanのインスタンス化が早すぎてコンテナに違反し、意図しない副作用を引き起こす可能性があります。 Beanインスタンスの相互作用が必要な場合は、代わりにBeanPostProcessorを実装することを検討してください。 ' – dgiffone

+0

'BeanDefinitionRegistryPostProcessor'をどうすればいいですか?このクラスを書いたとします。次は何?どのようにそれをアクティブにするには? – Dims

2

チェックアウトregisterXXX(..)JavaDocのメソッド。あなたはそれがタイプGenericWebApplicationContextである必要がないのはなぜtutorial here

8

て行きますか?
おそらく、どのようなApplicationContextタイプでも動作すると思います。

通常あなたが(あなたのsetterメソッドに加えて)initメソッドを使用します。

@PostConstruct 
public void init(){ 
    AutowireCapableBeanFactory bf = this.applicationContext 
     .getAutowireCapableBeanFactory(); 
    // wire stuff here 
} 

をそして、あなたは

AutowireCapableBeanFactory.autowire(Class, int mode, boolean dependencyInject)

または

AutowireCapableBeanFactory.initializeBean(Object existingbean, String beanName)のいずれかを使用して豆を配線します

28

ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); 
beanFactory.registerSingleton(bean.getClass().getCanonicalName(), bean); 
関連する問題