有没有办法让@Resource可选?这意味着如果我没有@Resource请求的bean类型,我将不会获得Exception,但它将被设置为null。
答案 0 :(得分:6)
答案 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。