2013-05-15 28 views
7

有一些方法,使@Resource可选?这意味着,如果我没有通过@Resource要求类型的豆,我不会例外,但它只是设置为null。你如何让@Resource是可选的?

+0

看到这里http://stackoverflow.com/questions/3957430/optional-spring-bean-references.It可能对您有所帮助 – PSR

+0

OK看起来是不可能的。必须使用@Autowired(必需= false)。不是我想要的究竟,但它会做 – MrProper

回答

2

确定看起来是不可能的。必须使用@Autowired(必需= false)。不是我确切想要的,但它会做。

+0

它使资源可选的,所以它是你想做的事,即使你不知道这个:) –

+1

自动装配Autowired和资源是两个不同的东西,尝试注入与自动装配Autowired - 这将只对咖啡豆,但没有资源 –

+0

@DanubianSailor - '@ Autowired'是一个Spring注解,而'@ Resource'是一种常见的Java注释。如果你不使用Spring,那么'@ Autowired'甚至不是一个选项。 –

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。

相关问题