2016-03-15 74 views
3

大多数关于Spring Boot的例子我发现重点关注构建简单的Web应用程序。也就是说,你完全掌控一切的网络应用程序。如何在Spring中使用注释自动装载第三方类?

另一方面,我没有找到有关如何构建非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; 
    } 

} 

我可以从Main类推出Application

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(); 
    } 

问题:我怎么注入ServiceAServiceBServiceFactory。这是第三方课程,我无法控制它,我无法修改它。因此,我无法添加任何注释。

我可以很容易地得到这个与XML配置工作,但考虑到注释似乎是这样做的“最佳做法”方式,我想知道如何才能使它与注释一起工作。

如果执行此操作的注释方式涉及大量代码,那么我想知道与XML配置相比,这给我带来的好处,我认为这很容易理解;以及在不同项目中轻松实现的模式。

回答

8

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

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

这将在Spring应用程序,你可以简单地自动装配公开此服务工厂实例作为一个Bean。

如果你愿意,你可以创建ServiceA和ServiceB豆类以及然后在您创建服务工厂的引用它们:

@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(); 
    } 
} 
相关问题