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.InputStreamReader;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentMap;

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

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

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

SPI spi = clazz.getAnnotation(SPI.class);
String instanceName = spi.value();
if(StringUtils.isBlank(instanceName)){

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

return getInstance(clazz, instanceName);

}

@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);
if (objMap == null) {
objMap = Maps.newConcurrentMap();
objectsCachedMap.put(clazz, objMap);
}
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);

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

Map<String, Class<?>> clazzMap = clazzCacheMap.get(clazz);
if (clazzMap == null) {
loadFile(clazz);
}
clazzMap = clazzCacheMap.get(clazz);
Map<String, Class<?>> clazzMap = getClazzMap(clazz);
if (clazzMap == null) {
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);
if (realClazz != null) {
try {
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);
if (realClazz != null) { // 防止一个实例对象被初始化多次
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;
} 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) {
Expand Down Expand Up @@ -140,13 +207,12 @@ private static void loadFile(Class<?> type) {
}
clazzCacheMap.put(type, map);
}

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

public static String toLowerCaseFirstOne(String s) {
if (Character.isLowerCase(s.charAt(0)))
return s;
else
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.