Java 如何处理库所需的SpringBean?

Java 如何处理库所需的SpringBean?,java,spring,Java,Spring,我正在使用Spring重构应用程序,方法是将一些共享组件(webservice客户端)移动到库中。组件无法独立工作,因此仍然需要使用库的应用程序提供一些bean。这方面的最佳做法是什么 我创建了一个@Configuration类,因此应用程序只需@Import它就可以使用库,但应用程序还需要提供一个Jackson ObjectMapper和一个包含如何联系Web服务的设置对象。我将ObjectMapper和设置bean自动连接到库中使用的各种bean中。应用程序通过将客户端注入其代码并调用它来使

我正在使用Spring重构应用程序,方法是将一些共享组件(webservice客户端)移动到库中。组件无法独立工作,因此仍然需要使用库的应用程序提供一些bean。这方面的最佳做法是什么

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

这行得通,但我不确定是不是合适的款式。在IntelliJ IDEA中,当我开发库时,它抱怨库注入的bean不存在红色下划线,这是真的,它们不存在。但通常情况下,当我看到无法解析的文件上到处都是红色时,这就告诉我,可能我没有正确地处理这些文件

该库需要与使用Spring3和Spring5的应用程序一起使用。当库不适合定义自己的对象映射器(因为应用程序已经有了Jackson)和设置对象等“专有”bean时,库询问诸如ObjectMapper之类的内容的正确方式是什么?

您的问题有点宽泛,但希望我能给您一个正确方向的提示

组件无法独立工作,因此仍然需要使用库的应用程序提供一些bean。这方面的最佳做法是什么

  • 第一:这个组件应该使用一个接口,而不是一些具体的bean
  • 第二:如果您有一个可重用的库,那么这个典型的库需要一些配置,这些配置不能成为库本身的一部分,因为它取决于使用该库的应用程序
  • 第三:因为第二(和第一):您的库不应该基于任何形式的自动布线,而应该基于显式(或默认)配置
这就解决了问题。在应用程序中使用接口和库的显式配置。此外,还可以向您的库中添加所需配置的良好文档。

您的问题有点广泛,但希望我能给您一个正确方向的提示

组件无法独立工作,因此仍然需要使用库的应用程序提供一些bean。这方面的最佳做法是什么

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

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

利用@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和设置,或者可以是ObjectMapper/Settings的内联构造函数


相反,我决定的是,由于客户机的bean不够多,而且没有一个是懒惰的,所以我只是完全删除了Spring注释,只是手工构建了对象图,所用的代码几乎与Spring上下文所用的代码一样多。现在,在假定的非Spring应用程序中,库在运行时完全不需要Spring,这是它的优点。

根据@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和设置,或者可以是ObjectMapper/Settings的内联构造函数


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

如果库依赖于应用程序,那么您的依赖关系就错了。您需要重新设计,以便库在初始化时需要任何外部依赖项。然后它将更像传统的配置和初始化,而不是依赖注入。。。祝你好运(我的意思是?-一切都可以通过干净的代码实现)@Kayaman,是的,看起来确实如此。但是什么客户端库不需要一些配置呢?我以前没有在库中使用过Spring,但它会