小编典典

如何在Spring中自动为带有注释的第三方课程接线?

spring-boot

我发现有关Spring Boot的大多数示例都集中在构建简单的Web应用程序上。也就是说,您可以完全控制Web应用程序。

另一方面,我在寻找如何构建非Web应用程序的示例方面运气不佳,该应用程序的大部分依赖于第三方代码。

考虑下面的我的com.mypackage.Application课。

package com.mypackage;

import com.3rdparty.factory.ServiceFactory;

public class Application {

  private final ServiceFactory sf;

  public Application(ServiceFactory sf) {
    this.sf = sf;
  }

  public void doSomeWork() {
    ServiceA sa = sf.getServiceA();
    [...]
}

Application类只实例化DefaultManager,并调用run()

现在,第3方ServiceFactory类具有其他依赖项:

package com.3rdparty.factory;

import com.3rdparty.service.ServiceA;
import com.3rdparty.service.ServiceA;

public class ServiceFactory {

  private final ServiceA sa;
  private final ServiceB sb;

  public ServiceFactory(ServiceA sa, ServiceB sb) {
    this.sa = sa;
    this.sb = sb;
  }

  public ServiceA getServiceA() {
    return sa;
  }

  public ServiceB getServiceB() {
    return sb;
  }

}

我可以ApplicationMain课程开始:

import com.mypackage.Application;

public class Main {

  public static void main(String[] args) { 
    ApplicationContext context = new ClassPathXmlApplicationContext("path/to/applicationContext.xml");
    Application app = (Application) context.getBean("app");
    app.doSomeWork();
  }

问题
:我如何注入ServiceAServiceB注入ServiceFactory。这是第三方课程,我无法控制,也无法修改。因此,我无法添加任何注释。

我可以很容易地将其与XML配置一起使用,但是考虑到注释似乎是当今的“最佳实践”方式,所以我想知道如何使它与注释一起使用。

如果这样做的注释方式涉及大量代码,那么我想知道与XML配置相比,这给我带来了什么好处,我认为这很容易理解;以及易于在不同项目中使用的模式。


阅读 307

收藏
2020-05-30

共1个答案

小编典典

您需要定义一个将Bean @Configuration构建SomeFactory为Bean的类:

@Configuration
class SomeFactoryConfiguration {
    @Bean
    public ServiceFactory serviceFactory() {
        return new ServiceFactory(/* create/get ServiceA and ServiceB somehow */):
    }
}

这将在您的Spring应用程序中将此ServiceFactory实例公开为Bean,您可以简单地自动装配。

如果愿意,也可以将ServiceA和ServiceB创建为Bean,然后在创建ServiceFactory时引用它们:

@Configuration
class SomeFactoryConfiguration {
    @Bean
    public ServiceFactory serviceFactory() {
        return new ServiceFactory(serviceA(), serviceB()):
    }
    @Bean
    public ServiceA serviceA() {
        return new ServiceA();
    }
    @Bean
    public ServiceB serviceB() {
        return new ServiceB();
    }
}
2020-05-30