2016-07-05 155 views
0

在我的用例中,有時候我有bean MyNullable,有時候沒有,什麼是OK。問題是當我想創建使用這個類的bean時(但不是總是;它會接受null)。@Bean方法使用null參數

如果我不會提供類MyNullable的bean我將有錯誤(沒有發現依賴)。我可以用required = false鏈接在@Autowired中註釋這個參數嗎?

@Bean 
@Scope(SCOPE_PROTOTYPE) 
public SynchronousRpcProxy myBean(MyObj1 notNull1, MyObj2 notNull2, MyNullable canBeNull) { 
    assert notNull1 != null; 
    assert notNull2 != null; 
    // assert canBeNull!= null; // this is not true because canBeNull can be null 
    return new SmthFromExternalLib(notNull1, notNull2, canBeNull); // do staff 
} 

回答

2

如果您使用的是Java 8,你可以使用Optional此:

@Bean 
@Scope(SCOPE_PROTOTYPE) 
public SynchronousRpcProxy myBean(MyObj1 notNull1, MyObj2 notNull2, 
            Optional<MyNullable> canBeNull) { 
    return new SmthFromExternalLib(notNull1, notNull2, canBeNull.orElse(null)); 
} 

當你做到這一點並沒有MyNullable bean時,Optional將是空的,這樣canBeNull.orElse(null)回報null

如果你沒有使用Java 8中,您可以創建一個工廠bean有MyNullable作爲一個可選的依賴:

@Component 
public class SynchronousRpcProxyFactory 
       implements FactoryBean<SynchronousRpcProxy> { 

    @Autowired 
    private MyObj1 notNull1; 

    @Autowired 
    private MyObj1 notNull2; 

    @Autowired(required = false) 
    private MyNullable canBeNull; 

    @Override 
    public SynchronousRpcProxy getObject() throws Exception { 
     return new SynchronousRpcProxy(notNull1, notNull2, canBeNull); 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return SynchronousRpcProxy.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return false; 
    } 
} 
+0

沒有,Java 7在船上。 – MAGx2

+0

@ MAGx2如果您不使用Java 8,請參閱編輯。 – Jesper

+0

不應該是'''isSingleton''是假的?在我的示例範圍是原型。 – MAGx2

1

您可以嘗試使用領域中配置類,而不是注入到工廠方法

@Autowired(required=false) 
MyNullable canBeNull;