繁体   English   中英

如何处理库要求的Spring bean?

[英]How to handle Spring beans required by library?

我通过将一些共享组件(Web服务客户端)移到库中来使用Spring重构应用程序。 这些组件无法单独工作,因此仍需要使用该库的应用程序中的一些bean。 最佳做法是什么?

我已经创建了一个@Configuration类,因此应用程序只需要@Import即可使用该库,但是应用程序还需要提供一个Jackson ObjectMapper和一个包含如何联系Web服务的Settings对象。 我将ObjectMapper和Settings Bean自动连接到库中使用的各种Bean中。 该应用程序通过将客户端注入其代码并对其进行调用来使用该库。

这可行,但我不确定这是正确的样式。 在开发该库时,在IntelliJ IDEA中,它抱怨该库注入的bean不存在,带有红色下划线,这是事实,它们不存在。 但是通常,当我看到所有无法解决的文件都变成红色时,这表明我可能没有以正确的方式进行操作。

该库需要与使用Spring 3和5的应用程序一起使用。当库不适合定义其自己的对象时(因为该应用程序已经具有Jackson了),该库请求ObjectMapper之类的正确方法是什么?豆像设置对象?

您的问题有点笼统,但希望我能向您提示正确的方向。

这些组件无法单独工作,因此仍需要使用该库的应用程序中的一些bean。 最佳做法是什么?

  • 第一:此组件应使用接口而不是某些具体的bean。
  • 第二:如果您有一个可重用的库,那么这种典型的配置需要一些配置,但这不能成为库本身的一部分,因为它取决于使用该库的应用程序
  • 第三:由于第二(也是第一):您的库不应基于任何形式的自动接线,而是您的库应基于显式(或默认)配置。

这样就解决了问题。 在应用程序中使用接口和库的显式配置。 以及将所需配置的良好文档添加到您的lib中。

利用@Kayaman和@Ralph的启发,我认为将Spring公开为直接在应用程序上下文中使用的库的一部分是不合适的。 我现在意识到这也是不合适的,因为该库可以定义不想公开的重复的“私有” bean。 我想得太多了。 如果我想使用Spring,我发现我可以这样做:

public class Factory {
    public static Client createClient(ObjectMapper mapper, Settings settings) {
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        beanFactory.registerSingleton("mapper", mapper);
        beanFactory.registerSingleton("settings", settings);
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(beanFactory);
        ctx.registerBean(ClientConfiguration.class);
        ctx.refresh();
        return ctx.getBean(Client.class);
    }
}

本质上,可以将Spring用作实现细节。 由于我所做的配置仅公开了一个bean,因此作为工厂方法很有意义。 在应用程序中,我将创建一个像这样的方法:

@Bean public Client makeClient(ObjectMapper mapper, Settings settings) {
    return Factory.createClient(mapper, settings);
}

当然,Bean方法将从应用程序上下文中注入ObjectMapper和Settings,或者可以是ObjectMapper / Settings的内联构造函数。

相反,我决定是因为客户端的bean够少,而且没有一个是懒惰的,所以我只是完全删除了Spring批注,并以几乎与spring上下文所需的代码一样多的方式手动构建了对象图。 现在,该库的好处是,在假定的非Spring应用程序中,运行时完全不需要Spring。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM