這是原始JDK spi的代碼
ServiceLoaderserviceLoader=ServiceLoader.load(Command.class);?
?for(Command command:serviceLoader){?
?command.execute();
?}?
dubbo在原來的基礎上設計了以下功能
1.原始JDK spi不支持緩存;dubbo設計了緩存對象:spi的key與value 緩存在 cachedInstances對象里面,它是一個ConcurrentMap
2.原始JDK spi不支持默認值,dubbo設計默認值:@SPI("dubbo") 代表默認的spi對象,例如Protocol的@SPI("dubbo")就是 DubboProtocol, 通過 ExtensionLoader.getExtensionLoader(Protocol.class).getDefaultExtension()那默認對象
3.jdk要用for循環(huán)判斷對象,dubbo設計getExtension靈活方便,動態(tài)獲取spi對象, 例如 ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(spi的key)來提取對象
4.原始JDK spi不支持 AOP功能,dubbo設計增加了AOP功能,在cachedWrapperClasses,在原始spi類,包裝了XxxxFilterWrapper XxxxListenerWrapper5.原始JDK spi不支持 IOC功能,dubbo設計增加了IOC,通過構造函數注入,代碼為:wrapperClass.getConstructor(type).newInstance(instance),