7

コンパイル時にクラスパスで定義される場合と定義されない場合があるクラスのSpringWebコンテキスト(任意のスコープ)に新しいBeanを追加できる必要があります。

たとえば、このクラスのいくつかを動的に作成してから、このクラスにシングルトンまたはセッションBeanを登録できます。

BeanFactoryPostProcessorについて少し読みましたが、Webコンテキストで機能するかどうかはわかりません。正しく理解していれば、実際にBeanインスタンスをロードする前にのみ機能し、その後は機能しません。それとも間違っていますか?

AnnotationConfigWebApplicationContextでこれを行う方法に関する情報を見つけることができませんでした。少なくとも私のテストでは、動的に作成したすべてのBeanが他のインスタンスに注入されていません。たとえそれらがあったとしても、シングルトンを登録するメソッドしか表示されません。 Beansですが、他のスコープではありません:

ctx.getBeanFactory().registerSingleton("dummy", dummy);

PD

私はこの質問を見つけました:SpringでのBeanの動的作成ですが、このようにBean、Bean定義、またはBean定義ビルダーをWebコンテキストに追加しようとすると、Beanがロードされません:

AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.setServletContext(servletContext);
ctx.refresh();
//
log.trace("Registering first test bean");
Test test = new Test();
test.setDummy("x1");
ctx.getBeanFactory().registerSingleton("myTestBean1", test);        

log.trace("Registering second test bean");
BeanDefinition testDef = new RootBeanDefinition(Test.class);        
testDef.setScope(BeanDefinition.SCOPE_SINGLETON);        
ctx.getBeanFactory().registerSingleton("myTestBean2", testDef);

Test dummy1 = (Test)ctx.getBean("myTestBean1");
Object dummy2 = ctx.getBean("myTestBean2");

log.trace("beans: 1: {}; 2: {}", dummy1, dummy2); //<--this works, but...
ctx.refresh();

ctx.register(MyConfig.class); //configuring other beans

... MyConfig.class内で構成された、または@Componentで注釈が付けられた別のBeanからこれを行う場合(別の動的コンポーネントである場合もあります):

@Autowire Test myTestBean1;
//Or this:
Object a = this.ctx.getBean("myTestBean1"); //Or myTestBean2

NoSuchBeanDefinitionExceptionをスローします

私を助けてください!!私はたくさん見回していて、有用な情報を見つけられませんでした、または多分私は持っていますが、私はそのような短い時間でウェブで見つけたものすべてをテストすることはできません、そして春のドキュメントは通常の場合とxml構成に非常に良いようですプログラムで構成するのではなく、私がやろうとしているこのクレイジーなことのために。

4

1 に答える 1

3

あなたが求めていることは達成できません、ごめんなさい。自動配線は、Bean が最初に作成されるときに発生します。あなたの場合、ファクトリに追加する前に Bean を配線することを期待していますが、これはもちろん機能しません。Spring はタイムトラベルを行いません。

あなたが求めているのは工場のパターンです。Spring では、FactoryBean. ここでもっと読む:

于 2012-09-06T07:27:20.357 に答える