带有null参数的@Bean方法

时间:2016-07-05 11:04:13

标签: java spring

在我的用例中,有时我会有bean div,有时候没有,有什么可以。问题是当我想创建使用这个类的bean时(但不总是;它会接受MyNullable)。

在下面的代码中如果我不提供类null的bean我会有错误(没有查找依赖项)。我可以用MyNullable中的required = false链接以某种方式注释此参数吗?

@Autowired

2 个答案:

答案 0 :(得分: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,则可以创建一个具有MyNullable作为可选依赖项的工厂bean:

@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;
    }
}

答案 1 :(得分:1)

您可以尝试在配置类中使用字段,而不是注入工厂方法

@Autowired(required=false)
MyNullable canBeNull;