2016-03-18 33 views
0

我必須在我的應用程序中做出設計決定。以下是該場景。設計:如何從程序中驅動一組類似的類動態設置

我有一套服務類,分佈在我的應用程序中的不同Maven模塊。

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

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

我目前有8個這樣的服務類,以後可能會增加更多。

所有這些服務類的開始必須在驅動程序中調用。 服務的數量可能會隨時間而變化,而且當它的時候,我想避免更新驅動程序。

我想過讓服務來實現一個接口。但是在運行時,服務列表需要可用於驅動程序來啓動它們。

驅動程序是在應用程序啓動並預計啓動服務時執行的第一個驅動程序。

請建議如何去做這件事。

+0

「我曾想過讓服務在運行時實施interface.But,服務的列表需要可爲駕駛者啓動它們 。」 - 你能澄清的接口是如何未能做你想做的事? – ChiefTwoPencils

+0

接口只會確保我可以多態啓動服務。我還需要一個解決方案來獲取將實現此接口的所有服務的列表。 –

回答

0

讓他們全部實現一個包含start()方法的通用接口。

在獲得完全限定的類名並通過反射創建新實例(Class.newInstance())後加載它們Class.forName(),這將要求它們都沒有參數構造函數。彈簧已經做了類和實例管理部分,所以你應該調查它,只留下你只需要擔心的通用接口。

+0

好的。假設我將所有類註冊到Spring應用程序上下文中。使用這個上下文,我將能夠僅獲得實現了公共接口的類的對象嗎? –

+0

您指向spring類和實例管理部分的指針幫助了我的解決方案。 –

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