1 /* $Id: InstanceManager.java 415 2011-07-28 23:07:08Z dobashi $
\r
2 * created: 2005/09/30
\r
4 package test.com.lavans.luz2.util2;
\r
6 import java.lang.reflect.Constructor;
\r
7 import java.util.HashMap;
\r
8 import java.util.Map;
\r
10 import javax.xml.xpath.XPathExpressionException;
\r
12 import org.apache.commons.logging.Log;
\r
13 import org.apache.commons.logging.LogFactory;
\r
14 import org.w3c.dom.Element;
\r
15 import org.w3c.dom.Node;
\r
16 import org.w3c.dom.NodeList;
\r
18 import com.lavans.luz2.util.Config;
\r
24 public class InstanceManager {
\r
26 private static Log logger = LogFactory.getLog(InstanceManager.class);
\r
28 private static Config config = Config.getInstance("luz.xml");
\r
29 private static String SERVICE_ROOT ="instance_manager";
\r
30 private static String BEAN = "bean";
\r
31 private static String ID = "id";
\r
32 private static String CLASS = "class";
\r
33 private static String SCOPE = "scope";
\r
36 private static Map<String, Bean> beanMap = new HashMap<String, Bean>();
\r
46 public static void init(){
\r
49 list = config.getNodeList(SERVICE_ROOT);
\r
50 } catch (XPathExpressionException e) {
\r
60 for(int i=0; i<list.getLength(); i++){
\r
61 Node node = list.item(i);
\r
62 // System.out.println(node.getNodeName());
\r
64 // if((node.getNodeType()==Node.TEXT_NODE) ||
\r
65 // (node.getNodeType()==Node.COMMENT_NODE) ){
\r
69 if(node.getNodeName().equals(BEAN)){
\r
70 Element ele = (Element)node;
\r
71 Bean bean = new Bean();
\r
72 bean.id = ele.getAttribute(ID);
\r
73 bean.className = ele.getAttribute(CLASS);
\r
74 bean.scope = ele.getAttribute(SCOPE);
\r
76 beanMap.put(bean.id, bean);
\r
78 logger.info("無効な設定項目["+ node.getNodeName() +"]");
\r
85 * 未指定なら引数で渡されたクラス名でインスタンス化する。
\r
91 public static <T> T getInstance(Class<T> clazz){
\r
92 return getInstance(clazz.getName(), clazz);
\r
94 public static <T> T getInstance(String id){
\r
95 return getInstance(id, null);
\r
97 public static <T> T getInstance(String id, Class<T> clazz){
\r
98 Bean bean = beanMap.get(id);
\r
99 // 指定されたIDで取れない場合のデフォルト
\r
100 if(bean==null && clazz!=null){
\r
101 // class型指定ありならfullクラス名
\r
102 bean = beanMap.get(clazz.getName());
\r
105 String pkgNname = clazz.getName().substring(0, clazz.getName().lastIndexOf('.'));
\r
106 // String className = pkgNname+".impl."+clazz.getSimpleName()+"Impl";
\r
107 String className = clazz.getName();
\r
110 bean.className = className;
\r
113 beanMap.put(id, bean);
\r
117 // prototypeなら毎回新規作成
\r
118 if(bean.scope.equals("prototype")){
\r
119 Class<?> newClazz = Class.forName(bean.className);
\r
120 Constructor<?> constructor = newClazz.getDeclaredConstructor(new Class[]{});
\r
121 //constructor.setAccessible(true); //コンストラクタのアクセス権設定(singleton対策)
\r
122 return (T)constructor.newInstance((Object[])null);
\r
125 if(bean.object==null){
\r
126 Class<?> newClazz = Class.forName(bean.className);
\r
127 Constructor<?> constructor = newClazz.getDeclaredConstructor(new Class[]{});
\r
128 constructor.setAccessible(true); //コンストラクタのアクセス権設定(singleton対策)
\r
129 bean.object = constructor.newInstance((Object[])null);
\r
131 return (T)bean.object;
\r
133 } catch (Exception e) {
\r
134 logger.error("初期化に失敗。cayen.xmlのinstance_manager設定を見直してください。", e);
\r
138 private static class Bean {
\r
141 String scope="singleton";
\r