JDK SPI
@startuml
note top of ServiceLoader
end note
class ServiceLoader implements Iterable{
- String PREFIX'META-INF/services/'
- Class service
- ClassLoader loader
- LinkedHashMap<String,S> providers
- LazyIterator lookupIterator
- ServiceLoader(Class<?> svc, ClassLoader cl)
+ <?> ServiceLoader<?> load(Class<?> service)
+ <?> ServiceLoader<?> load(Class<?> service,ClassLoader loader)
- Iterator<String> parse(Class<?> service, URL u)
- int parseLine(Class<?> service, URL u, BufferedReader r, int lc,List<String> names)
}
ServiceLoader +-- LazyIterator
note top of LazyIterator
核心方法: S next() && boolean hasNextService()
nextService() 中调用 providers.put(cn, p)
end note
class LazyIterator implements Iterable{
# Class<?> service
# ClassLoader loader
# Enumeration<URL> configs
# Iterator<String> pending
# String nextName
+ ? next()
- ? nextService()
+ boolean hasNext()
- boolean hasNextService()
}
interface Iterable{}
@enduml