8

私はSpringコンテキストファイルの次の構造を持っています(->「インクルード」を表します):

A1.xml -> B.xml & C.xml
A2.xml -> B.xml

C.xmlBean を定義しますc

B.xmlbに依存する Bean を定義しますc

ccontext に何も定義されていないため、明らかにこれは A2 では失敗しますA2

次のようなものを指定するにはどうすればよいですか:cコンテキストに注入する場合は、bそれ以外の場合は注入するだけnullですか?

Spring ELについて調べてみましたが、

<property name="b" ref="#{ @c?:null}" />

!?NoSuchBeanDefinitionExceptionの値と思われる名前を教えてくれました。b.toString()

ところで、私はこれが地獄のように厄介であり、できるだけ早くクリーンアップする必要があることをすでに知っています.

4

2 に答える 2

22

SpEL 式の #root オブジェクトは BeanExpressionContext であり、getObject()そのコンテキストでメソッドを呼び出すことができます。Bean が宣言されていない場合は null を返します...

<property name="bar" value="#{getObject('bar')}" />

注: valuenotを使用するrefのは、Bean 定義ではなく Bean を返すためです。

ここからのコードは次のとおりですgetObject()

public Object getObject(String key) {
    if (this.beanFactory.containsBean(key)) {
        return this.beanFactory.getBean(key);
    }
    else if (this.scope != null){
        return this.scope.resolveContextualObject(key);
    }
    else {
        return null;
    }
}
于 2012-10-26T17:37:05.297 に答える
9

私はあなたのXMLをクリーンアップすることに非常に同意します:-)

アノテーションベースのインジェクションを使用している場合は、このトリックを試すことができます

@Autowired( required=false )

これがあなたの状況でうまくいくかどうかはわかりませんが、試してみる価値はあります。

于 2012-10-26T09:59:18.720 に答える