Skip to content

Commit

Permalink
add spi test end。明天开始集成spi
Browse files Browse the repository at this point in the history
  • Loading branch information
黄志磊 committed Jan 13, 2016
1 parent ddc91fd commit ee76710
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 55 deletions.
Expand Up @@ -64,41 +64,15 @@ public static <T> List<T> getInstances(Class<T> clazz){
} }
objMap = objectsCachedMap.get(clazz); objMap = objectsCachedMap.get(clazz);
if(!objMap.isEmpty()){ if(!objMap.isEmpty()){
return Lists.newArrayList((List<T>)objMap.values()); return Lists.newArrayList((Collection<T>)objMap.values());
} }


Map<String, Class<?>> clazzMap = getClazzMap(clazz); initClazzInstances(clazz);
if (clazzMap == null) {
log.warn("[ getInstance ] getInstances is null:" + clazz);
throw new IllegalStateException("Failed getInstance class(interface: " + clazz);
}
if (!clazzMap.isEmpty()) { //防止一个实例对象被初始化多次
synchronized (clazz) {
try {
if(!objMap.isEmpty()){
return Lists.newArrayList((List<T>)objMap.values());
}
Iterator<Entry<String, Class<?>>> iter = clazzMap.entrySet().iterator();
while (iter.hasNext()) {
Entry<String, Class<?>> entry = iter.next();
String key = entry.getKey();
Class<?> val = entry.getValue();

Object oldObj = objMap.get(key);
if(oldObj==null){
Object newObj = val.newInstance();
objMap.putIfAbsent(key, newObj);
}

}

return Lists.newArrayList((Collection<T>)objMap.values());
} catch (Exception e) {
log.warn("[ getInstance ] error:" + clazz, e);
}
}
}


objMap = objectsCachedMap.get(clazz);
if(!objMap.isEmpty()){
return Lists.newArrayList((Collection<T>)objMap.values());
}
throw new IllegalStateException("Failed getInstance class(interface: " + clazz); throw new IllegalStateException("Failed getInstance class(interface: " + clazz);


} }
Expand All @@ -122,32 +96,48 @@ public static <T> T getInstance(Class<T> clazz, String key) {
if (obj != null) { if (obj != null) {
return obj; return obj;
} }

//初始化所有
initClazzInstances(clazz);

obj = (T) objMap.get(key);


Map<String, Class<?>> clazzMap = getClazzMap(clazz); if (obj != null) {
if (clazzMap == null) { return obj;
log.warn("[ getInstance ] clazzMap is null:" + clazz + "," + key);
throw new IllegalStateException("Failed getInstance class(interface: " + clazz + ", key: " + key + ")");
} }
Class<?> realClazz = clazzMap.get(key);
if (realClazz != null) { // 防止一个实例对象被初始化多次 throw new IllegalStateException("Failed getInstance class(interface: " + clazz + ", key: " + key + ")");
synchronized (realClazz) {
try {
obj = (T) objMap.get(key);
if (obj != null) {
return obj;// 已经初始化完毕
}


Object newObj = realClazz.newInstance(); }
Object preObj = objMap.putIfAbsent(key, newObj);
return null == preObj ? (T) newObj : (T) preObj; private static <T> void initClazzInstances(Class<T> clazz){
} catch (Exception e) {
log.warn("[ getInstance ] error:" + clazz + "," + key, e); Map<String, Class<?>> clazzMap = getClazzMap(clazz);
ConcurrentMap<String, Object> objMap = objectsCachedMap.get(clazz);
if(objMap.isEmpty()){
synchronized (clazz) {
objMap = objectsCachedMap.get(clazz);
if(objMap.isEmpty()){
Iterator<Entry<String, Class<?>>> iter = clazzMap.entrySet().iterator();
while (iter.hasNext()) {
Entry<String, Class<?>> entry = iter.next();
String entryKey = entry.getKey();
Class<?> val = entry.getValue();
Object oldObj = objMap.get(entryKey);
if(oldObj==null){
Object newObj;
try {
newObj = val.newInstance();
objMap.putIfAbsent(entryKey, newObj);
} catch (Exception e) {
}
}
}
objectsCachedMap.put(clazz, objMap);
} }
} }
} }


throw new IllegalStateException("Failed getInstance class(interface: " + clazz + ", key: " + key + ")");

} }


private static <T> Map<String, Class<?>> getClazzMap(Class<T> clazz) { private static <T> Map<String, Class<?>> getClazzMap(Class<T> clazz) {
Expand Down
14 changes: 11 additions & 3 deletions mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/SpiTest.java
Expand Up @@ -16,21 +16,22 @@ public class SpiTest {


private static Executor pool = Executors.newCachedThreadPool(); private static Executor pool = Executors.newCachedThreadPool();


@Ignore
@Test @Test
public void baseTest(){ public void baseTest(){
TestService testService = ServiceContainer.getInstance(TestService.class); TestService testService = ServiceContainer.getInstance(TestService.class);
System.out.println(testService.sayHi(" huang")); System.out.println(testService.sayHi(" huang"));

ServiceContainer.getInstance(TestService.class,"test2");
} }



@Ignore
@Test @Test
public void listTest(){ public void listTest(){


List<TestService> listRet = ServiceContainer.getInstances(TestService.class); List<TestService> listRet = ServiceContainer.getInstances(TestService.class);


for(TestService test:listRet){ for(TestService test:listRet){
System.out.println(ToStringBuilder.reflectionToString(test)); System.out.println(ToStringBuilder.reflectionToString(test.sayHi(" huang list")));
} }


} }
Expand Down Expand Up @@ -60,6 +61,13 @@ private static final class ListWorker implements Runnable{


@Override @Override
public void run() { public void run() {

List<TestService> listRet = ServiceContainer.getInstances(TestService.class);

for(TestService test:listRet){
System.out.println(test.sayHi(" huang list")+","+Thread.currentThread().getId()+","+ToStringBuilder.reflectionToString(test));
}

} }


} }
Expand Down

0 comments on commit ee76710

Please sign in to comment.