如何在Spring中使用注释自动装配第三方类?

时间:2016-03-15 11:51:25

标签: spring spring-boot autowired

Spring Boot I上的大多数示例都集中在构建简单的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()

现在,第三方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;
  }

}

我可以从Application类启动Main

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配置相比有什么优势;以及一种易于跨越不同项目的模式。

1 个答案:

答案 0 :(得分:12)

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

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

这将在Spring应用程序中将此ServiceFactory实例公开为Bean,您只需自动装配即可。

如果您愿意,您也可以创建ServiceA和ServiceB作为Beans,然后在创建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();
    }
}