Skip to content

Commit

Permalink
重构代码
Browse files Browse the repository at this point in the history
  • Loading branch information
黄志磊 committed Jan 12, 2016
1 parent d48c76f commit b720cf4
Show file tree
Hide file tree
Showing 15 changed files with 467 additions and 204 deletions.
Expand Up @@ -3,13 +3,17 @@
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;


import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;


import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;


public class ServiceContainer { public class ServiceContainer {
Expand All @@ -36,52 +40,115 @@ public static <T> T getInstance(Class<T> clazz) {


SPI spi = clazz.getAnnotation(SPI.class); SPI spi = clazz.getAnnotation(SPI.class);
String instanceName = spi.value(); String instanceName = spi.value();

if(StringUtils.isBlank(instanceName)){ if (StringUtils.isBlank(instanceName)) {
instanceName = toLowerCaseFirstOne(clazz.getName()); instanceName = toLowerCaseFirstOne(clazz.getName());
} }

return getInstance(clazz, instanceName); return getInstance(clazz, instanceName);


} }


@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T> T getInstance(Class<T> clazz, String key) { public static <T> List<T> getInstances(Class<T> clazz){
ConcurrentMap<String, Object> objMap = objectsCachedMap.get(clazz); ConcurrentMap<String, Object> objMap = objectsCachedMap.get(clazz);
if (objMap == null) { if (objMap == null) {
objMap = Maps.newConcurrentMap(); objMap = Maps.newConcurrentMap();
objectsCachedMap.put(clazz, objMap); objectsCachedMap.put(clazz, objMap);
} }
objMap = objectsCachedMap.get(clazz); objMap = objectsCachedMap.get(clazz);
if(!objMap.isEmpty()){
return Lists.newArrayList((List<T>)objMap.values());
}

Map<String, Class<?>> clazzMap = getClazzMap(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 newObj = val.newInstance();
objMap.putIfAbsent(key, newObj);
}

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

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

}

@SuppressWarnings("unchecked")
public static <T> T getInstance(Class<T> clazz, String key) {
ConcurrentMap<String, Object> objMap = objectsCachedMap.get(clazz);
if (objMap == null) {
objMap = Maps.newConcurrentMap();
synchronized (clazz) {
objMap = objectsCachedMap.get(clazz);
if(objMap==null){
objectsCachedMap.put(clazz, objMap);
}
}
}
objMap = objectsCachedMap.get(clazz);


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


if (obj != null) { if (obj != null) {
return obj; return obj;
} }


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

Object newObj = realClazz.newInstance();
Object preObj = objMap.putIfAbsent(key, newObj);
return null == preObj ? (T) newObj : (T) preObj;
} catch (Exception e) {
log.warn("[ getInstance ] error:" + clazz + "," + key, e);
}
} }
} }

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


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

}

private static <T> Map<String, Class<?>> getClazzMap(Class<T> clazz) {
Map<String, Class<?>> clazzMap = clazzCacheMap.get(clazz);
if (clazzMap == null) {
loadFile(clazz);
}
clazzMap = clazzCacheMap.get(clazz);
return clazzMap;
} }


private static void loadFile(Class<?> type) { private static void loadFile(Class<?> type) {
Expand Down Expand Up @@ -140,13 +207,12 @@ private static void loadFile(Class<?> type) {
} }
clazzCacheMap.put(type, map); clazzCacheMap.put(type, map);
} }


public static String toLowerCaseFirstOne(String s) public static String toLowerCaseFirstOne(String s) {
{ if (Character.isLowerCase(s.charAt(0)))
if(Character.isLowerCase(s.charAt(0))) return s;
return s; else
else return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();
return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString(); }
}


} }
@@ -0,0 +1,11 @@
package com.shinemo.mpush.tools.spi.test;

import com.shinemo.mpush.tools.spi.SPI;


@SPI("test1")
public interface TestService {

public String sayHi(String name);

}
@@ -0,0 +1,19 @@
package com.shinemo.mpush.tools.spi.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestServiceImpl implements TestService {

private static final Logger log = LoggerFactory.getLogger(TestServiceImpl.class);

public TestServiceImpl() {
log.warn("init");
}

@Override
public String sayHi(String name) {
return "TestServiceImpl1 hi,"+name;
}

}
@@ -0,0 +1,20 @@
package com.shinemo.mpush.tools.spi.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class TestServiceImpl2 implements TestService {

private static final Logger log = LoggerFactory.getLogger(TestServiceImpl.class);

public TestServiceImpl2() {
log.warn("init");
}

@Override
public String sayHi(String name) {
return "TestServiceImpl2 hi,"+name;
}

}

This file was deleted.

@@ -0,0 +1,37 @@
package com.shinemo.mpush.tools.zk;

import java.util.List;

import org.apache.curator.framework.CuratorFramework;

import com.shinemo.mpush.tools.spi.SPI;


@SPI("zkRegister")
public interface ZkRegister {

public void init();

public void close();

public void remove(String key);

public void registerEphemeralSequential(String key);

public void registerEphemeralSequential(String key, String value);

public void registerEphemeral(String key, String value);

public void update(String key, String value);

public void registerPersist(String key, String value);

public boolean isExisted(String key);

public List<String> getChildrenKeys(String key);

public String get(String key);

public CuratorFramework getClient();

}

0 comments on commit b720cf4

Please sign in to comment.