組件化開發過程當中,隨着組件愈來愈多,組件的以前的交互就會變得很是的複雜,此時組件間通訊變得尤爲的重要,ServicePool就是爲組件化而生,用最簡單的方式進行組件間通訊。使用依賴注入,按需靈活注入組件。同時支持組件熱插拔,達到組件即插即用的效果。可配置組件生命週期,作到組件按需建立和及時回收,充分利用懶加載的思想,有效解決組件初始化耗時致使的app啓動速度問題。點擊進入 項目地址java
ServicePool包含有 Activity路由, 組件路由等等最經常使用的組件化能力。除此以外,組件化開發過程當中有沒有遇到過想使用某個已有的類,好比一個工具類的時候,發現這個工具類在當前類的上層,沒法直接依賴和引用,而修改這個工具類的層級又會牽一髮而動全身的問題? 有沒有想要一個差別響應的能力,在不一樣的組件中或者環境下,有着不一樣的響應方式?有沒有想要一個自適應場景的能力,自動適應當前環境(好比Java仍是Android環境,好比Debug環境仍是Release環境等等),從而使用最合適的功能。又有沒有想過如何讓組件作到像USB接口同樣插上就能直接使用,拔掉也不影響主體功能的即插即用的效果。等等...。 下面就來具體介紹一下這個組件化神器——ServicePool!git
如上圖所示:github
/**
* 服務池pool中
*
* IA.java
*/
public interface IA {
void aName();
}
/**
* 服務池pool
*
* IB.java
*/
public interface IB {
void bName();
}
複製代碼
/**
* 組件A
*
* AService.java
*/
@Service
public class AService implements IA {
@Override
public String aName() {
return "A Service";
}
}
複製代碼
/**
* 組件B
*
* BService.java
*/
@Service
public class BService implements IB {
@Override
public String bName() {
return "B Service";
}
}
複製代碼
組件A中執行:
IB b = ServicePool.getService(IB.class);
System.out.println("I'm A Service, I can get " + b.bName());
輸出:
I'm A Service, I can get B Service 組件B中執行: IA a = ServicePool.getService(IA.class); System.out.println("I'm B Service, I can get " + a.aName()); 輸出: I'm B Service, I can get A Service 複製代碼
/**
* 服務池pool中
*
* IPathService.java
*/
public interface IPathService {
String pathServiceName();
}
複製代碼
/**
* 組件A中
*
* PathService
*/
@Service(path = "pathService")
public class PathService implements IPathService {
@Override
public String pathServiceName() {
return "Path Service";
}
}
複製代碼
組件B中執行:
IPathService pathService = ServicePool.getService(IPathService.class);
System.out.println(pathService.pathServiceName());
輸出:
Path Service
複製代碼
若是IA有多個實現,如上圖所示,ServicePool會比較每一個實現優先級,來決定最終返回IA的哪一個實現緩存
/**
* 服務池pool中
*
* IPriorityService.java
*/
public interface IPriorityService {
int getPriority();
}
複製代碼
/**
* 組件A中
*
* PriorityService1.java
* PriorityService2.java
*/
@Service(priority = 1)
public class PriorityService1 implements IPriorityService {
@Override
public int getPriority() {
return 1;
}
}
@Service(priority = 1)
public class PriorityService2 implements IPriorityService {
@Override
public int getPriority() {
return 2;
}
}
複製代碼
組件B中執行:
IPriorityService priorityService = ServicePool.getService(IPriorityService.class);
System.out.println("priority is " + priorityService.getPriority());
priorityService = ServicePool.getService(PriorityService1.class);
System.out.println("priority is " + priorityService.getPriority());
priorityService = ServicePool.getService(PriorityService2.class);
System.out.println("priority is " + priorityService.getPriority());
輸出:
priority is 2
priority is 1
priority is 2
複製代碼
每一個由ServicePool建立的service對象都有各自生命週期,service對象的生命週期由ServicePool管理, 並由@Service註解配置生命週期類型。bash
組件A中
/**
*
* OnceService.java
*/
@Service(scope = IService.Scope.once)
public class OnceService implements LifecycleService {
}
/**
*
* TempService.java
*/
@Service(scope = IService.Scope.temp)
public class TempService implements LifecycleService {
}
/**
*
* GlobalService.java
*/
@Service(scope = IService.Scope.global)
public class GlobalService implements LifecycleService {
}
複製代碼
組件B中執行:
System.out.println(ServicePool.getService(OnceService.class) == ServicePool.getService(OnceService.class));
//System.out.println(ServicePool.getService(TempService.class) == ServicePool.getService(TempService.class));//不可靠
System.out.println(ServicePool.getService(GlobalService.class) == ServicePool.getService(GlobalService.class));
輸出:
false
true
複製代碼
未完待續....app
未完待續....ide
未完待續....工具
未完待續....組件化
快速接入ServicePoolui