2016-03-15 2 views
3

Большинство примеров в Spring Boot я нашел в центре внимания создание простых веб-приложений. То есть, веб-приложения, в которых вы полностью и полностью контролируете все.Как мне авторизовать сторонние классы с аннотациями весной?

С другой стороны, мне не повезло найти примеры того, как создавать не-веб-приложения, где большие части приложения зависят от стороннего кода.

Рассмотрите мой класс 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(); 
    } 

Вопрос: как я впрыснуть ServiceA и ServiceB в ServiceFactory. Это класс третьей стороны, я не контролирую его, и я не могу его изменить. Таким образом, я не могу добавлять аннотации.

Я могу легко заставить это работать с конфигурацией XML, но учитывая, что аннотации, похоже, являются «наилучшей практикой» в этом отношении, я хотел бы знать, как я могу заставить это работать с аннотациями.

Если способ аннотации этого требует большого количества кода, то я хотел бы знать, какие преимущества это дает мне по сравнению с конфигурацией XML, которую я считаю довольно легко понять; и шаблон, который легко получить в разных проектах.

ответ

8

Вы должны определить @Configuration класс, который строит SomeFactory как Bean:

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

Это подвергнет этот экземпляр ServiceFactory как Bean в вашем весеннем приложение, которое вы можете просто autowire.

Если вы хотите, вы можете создать ServiceA и ServiceB как фасоль, а затем ссылаться на них в своем создании 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(); 
    } 
}