2016-03-18 2 views
0

Я должен принять дизайнерское решение в своем приложении. Ниже приводится сценарий.Дизайн: как управлять динамическим набором подобных классов из программы

У меня есть набор классов обслуживания, которые распространяются по разным модулям maven в моем приложении.

public class ServiceA 
{ 
    public void startA() 
    { 
     .... 
    } 
} 

public class ServiceB 
{ 
    public void startB() 
    { 
     .... 
    } 
} 

В настоящее время у меня есть 8 таких классов обслуживания. Больше можно добавить в будущем.

Все начальные сервисные классы должны быть вызваны в программу драйвера. Количество услуг может отличаться в зависимости от времени. И когда это произойдет, я хочу избежать обновления программы драйвера.

Я думал о предоставлении услуг для реализации интерфейса. Но во время выполнения список драйверов должен быть доступен для запуска драйвером.

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

Просьба сообщить, как это сделать.

+0

«Я думал о том, чтобы услуги для реализации interface.But во время выполнения, перечень услуг должен быть доступен для водителя, чтобы начать их .» - вы можете уточнить, как интерфейс не в состоянии делай что хочешь? – ChiefTwoPencils

+0

Интерфейс только гарантирует, что я получу услуги полиморфно.Мне также нужно решение для получения списка всех служб, которые бы реализовали этот интерфейс. –

ответ

0

Пусть все они реализуют общий интерфейс, который включает в себя метод start().

Загрузите их Class.forName() после получения полных имен классов и создания новых экземпляров с помощью отражения (Class.newInstance()), что потребует, чтобы все они имели конструктор no-arg.

Spring уже выполняет часть управления классом и экземпляром, поэтому вам следует, вероятно, исследовать его, оставив вам только общий интерфейс, о котором нужно беспокоиться.

+0

Хорошо. Скажем, я регистрирую все классы в контексте приложения Spring. Используя этот контекст, смогу ли я получить объекты только классов, которые реализовали общий интерфейс? –

+0

Ваш указатель на весенний класс и часть управления экземплярами помогли. Поправляя мое решение. –

1

Вы можете повернуть его и заставить все службы регистрироваться перед водителем.

Все они могут быть фасолью с введенным водителем.

Если вы не хотите, чтобы службы знали о драйвере, вы можете представить себе среднего человека для них, который имеет зависимость от службы и драйвера, или вы можете это сделать через класс @Configuration.

Обновление:

Вы можете использовать класс ServiceLoader, чтобы найти ваши услуги взглянуть на эту tutorial.

А вот это библиотека, которая делает его несколько проще в использовании: ServicePluginLoader

+0

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

+0

Не могли бы вы уточнить вопрос, чтобы указать это? – Glenner003

0

Создание класса конфигурации для обнаружения и регистрации только те классы, которые реализуют интерфейс IsService.

@Configuration 
@ComponentScan(basePackages = {"com.subex.roc"} , 
       useDefaultFilters = false , 
       includeFilters = {@Filter(type = FilterType.ASSIGNABLE_TYPE,value = IsService.class)}) 
public class ServiceRegisterConfig 
{ 
} 

Извлечение зарегистрированных классов и вызов start() полиморфно.

public void initServerServices() 
{ 
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); 
    context.register(ServiceRegisterConfig.class); 
    context.refresh(); 

    for (String beanDfn : context.getBeanDefinitionNames()) 
    { 
     if (context.getBean(beanDfn) instanceof IsService) { 
     IsService service = (IsService) context.getBean(beanDfn); 
     service.start(); 
    } 
} 
} 
Смежные вопросы