【问题标题】:injecting spring bean in java 8 function在java 8函数中注入spring bean
【发布时间】:2014-10-14 06:41:22
【问题描述】:

这是一个我如何做的问题,也是一个我应该这样做的问题。

我有一个案例,我需要在 Lambda 函数中使用由 Spring 管理的实例。 简而言之,我希望DummyBranchMandrillBranch 对象和其他分支由 Spring 管理。

public class QOSStrategy {

  public static Function<DistributionMessage, List<Feedback>> executeQOS = (message)-> {
    QOSFilters qosFilters = new QOSFilters();
    List<Branch> providers = qosFilters.getProviderByQOs(message, 
    Arrays.asList(new DummyEmailBranch(), 
        new MandrillBranch(), 
        new EverbrideBranch(), 
        new JavaMailBranch(), 
        new DirectSMSBranch()));
  }
}

我看到的一个选项是从 Spring application-context 中获取它。但是有没有办法使用Annotations 来做到这一点。

谢谢 -帕舒

【问题讨论】:

    标签: spring dependency-injection annotations inversion-of-control java-8


    【解决方案1】:

    我创建了一个由 spring 管理的 QOSBean。结果是这样的-

    public class QOSStrategy {
    
    public static Function<DistributionMessage,CustomBean, List<Feedback>> executeQOS = (message, qosbean)-> {
    QOSFilters qosFilters = (QOSBean)qosbean.getQosFilters();
            List<Branch> providers = qosFilters.getProviderByQOs(message, qosbean.getAllProviders());
    }
    }
    
    
    
    public class QOSBean implements CustomBean {
    
    @Autowired
    private QOSFilters qosFilters;
    
    @Autowired
    private Branch dummyEmailProvider;
    @Autowired
    private Branch dummySMSProvider;
    @Autowired
    private Branch dummyVoiceProvider;
    @Autowired
    private Branch directSMSProvider;
    @Autowired
    private Branch everbridgeProvider;
    @Autowired
    private Branch mandrillProvider;
    @Autowired
    private Branch javaMailProvider;
    
    public QOSFilters getQosFilters() {
        return qosFilters;
    }
    
    public Branch getDummyEmailProvider() {
        return dummyEmailProvider;
    }
    
    public Branch getDummySMSProvider() {
        return dummySMSProvider;
    }
    
    public List<Branch> getAllProviders (){
        return Arrays.asList(dummyEmailProvider, dummySMSProvider, dummyVoiceProvider, directSMSProvider, everbridgeProvider, mandrillProvider, javaMailProvider);
    }
    

    }

    【讨论】:

      【解决方案2】:

      您可以自动装配实现相同接口的所有 bean 的集合。

      请参阅 Spring 文档here

      【讨论】:

      • 只是好奇。传递 Bean 集合而不是仅传递应用程序上下文并执行 appContext.getBean 是否有好处?我问的原因是我有一个 lamda 函数调用另一个 lambda 函数。
      • 这基本上是你的风格选择。我们发现使用 Mockito 的 Mock/InjectMocks 注释进行单元测试既有趣又容易。请参阅docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#21 代码看起来更干净恕我直言,虽然真的取决于你。
      猜你喜欢
      • 2013-01-25
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      相关资源
      最近更新 更多