你如何让@Resource可选?

时间:2013-05-15 08:29:38

标签: java spring java-ee

有没有办法让@Resource可选?这意味着如果我没有@Resource请求的bean类型,我将不会获得Exception,但它将被设置为null。

3 个答案:

答案 0 :(得分:6)

好吧看起来不可能。不得不使用@Autowired(必需= false)。不是我想要的,但它会做。

答案 1 :(得分:1)

您可以在资源类型上使用@Value和默认值(#{null})。

@Value("some-data.txt:#{null}") Resource resource

如果文件some-data.txt不存在,则属性未设置为null,而是资源不存在的资源。您可以呼叫resource.exists()而不是resource != null

public ResourceExample(@Value("some-data.txt:#{null}") Resource resource) {
    if (resource.exists()) {
        something(resource.getFile());
    }
}

答案 2 :(得分:0)

您应该能够使用自定义工厂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。