11

@Resource をオプションにする方法はありますか? これは、@Resource によって要求されたタイプの Bean がない場合、例外は取得されず、null に設定されるだけであることを意味します。

4

3 に答える 3

1

これを実現するには、カスタム ファクトリ Bean を使用できるはずです。

public class OptionalFactoryBean<T> implements BeanFactoryAware, FactoryBean<T> {

    private String beanName;

    public void setBeanName(String beanName) {
         this.beanName = beanName;
    }

    @Override
    public T getObject() throws Exception {
        T result;
        try {
            result = beanFactory.getBean(beanName);
        } catch (NoSuchBeanDefinitionException ex) {
            result = null;
        }
        return result;
    }

    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }

    private Class<?> objectType = Object.class;

    public void setObjectType(Class<?> objectType) {
        this.objectType = objectType != null? objectType : Object.class;
    }

    @Override
    public Class<?> getObjectType() {
        return objectType;
    }

    @Override
    public boolean isSingleton() {
         return true;
    }    
}

オプションの Bean の Spring 構成は次のようになります。

<bean id="myBean" class="mypackage.OptionalFactoryBean" scope="singleton">
    <property name="beanName" value="myRealBean"/>
    <property name="objectType" value="mypackage.MyRealBean"/>
</bean>

nullそして、あなたは注射されるでしょう。次に、次のように定義できます。

<bean id="myRealBean" class="mypackage.MyRealBean" ...>
    <!-- .... -->
</bean>

特定の Bean を注入したい場合。

于 2013-05-15T08:41:32.083 に答える