一个类的简单SPRING
创始人
2024-07-24 01:20:41
0

你是否常编一些小工具,做一些小东西?

在你扩展维护的时候,是不是觉得实例传递越来越复杂?

你经常改变想法,但小东西不停重构开始耽误你越来越多的时间?

你想到了用spring,但又不想对于一个简单的小东西,引入一个相对小重的框架,让你的小程序加载时都需要卡一下?

哈,试一试用下simpleFactory,是否可以解决你的烦恼,只有一个类哦,copy一下,就可以帮助你实现依赖注入;

simpleFactory是我在做小实验时,为了解决上面的问题,自己写的编码小工具,至少自己用起来很哈皮

SF代码:

  1. package com.honeysuckle.webx.context;     
  2.     
  3. import java.lang.reflect.Constructor;     
  4. import java.lang.reflect.Method;     
  5. import java.util.HashMap;     
  6. import java.util.LinkedList;     
  7. import java.util.Map;     
  8. import java.util.Queue;     
  9.     
  10. /**    
  11.  * 类SF.java的实现描述:SimpleBeanFactory no one simpler than this one    
  12.  *     
  13.  * @author yanghang 2010-9-16 下午04:43:05    
  14.  */    
  15. public class SF {     
  16.     
  17.     private final Map, Object> context = new HashMap, Object>();     
  18.     
  19.     /**    
  20.      * 向容器中放入某个实例    
  21.      * @param clazz 该实例的类型,可以是接口    
  22.      * @param object 该实例    
  23.      */    
  24.     public void put(Class clazz, Object object) {     
  25.         this.context.put(clazz, object);     
  26.     }     
  27.     
  28.     /**    
  29.      * 获取某个实例(单例) 
        
  30.      * 如果容器中不存在,会尝试初使化: 
        
  31.      * 1.调用构造函数,args为可能的构造函数的参数 
        
  32.      * 2.会对该实例的set方法进行注入 
        
  33.      * 3.最后会调用init()方法 
             
  34.      */    
  35.     public Object get(Class clazz, Object... args) {     
  36.         Object object = this.context.get(clazz);     
  37.         if (object == null) {     
  38.             try {     
  39.                 object = this.instanceClazz(clazz, args);     
  40.                 this.instanceSetMethod(object);     
  41.                 this.instanceInitMethod(object);     
  42.                 this.put(clazz, object);     
  43.             } catch (Exception e) {     
  44.                 return null;     
  45.             }     
  46.         }     
  47.         return object;     
  48.     }     
  49.     
  50.     //获取某个实例的多例,每次都会重新产生该实例     
  51.     public Object getMulti(Class clazz, Object... args) {     
  52.         Object object;     
  53.         try {     
  54.             object = this.instanceClazz(clazz, args);     
  55.             this.instanceSetMethod(object);     
  56.             this.instanceInitMethod(object);     
  57.         } catch (Exception e) {     
  58.             return null;     
  59.         }     
  60.         return object;     
  61.     }     
  62.     
  63.     //初使化该类,调用构造方法     
  64.     private Object instanceClazz(Class clazz, Object[] args) throws Exception {     
  65.         Object object = null;     
  66.         Class[] clazzes = new Class[args.length];     
  67.         for (int i = 0; i < args.length; i++) {     
  68.             clazzes[i] = args[i].getClass();     
  69.         }     
  70.         Constructor[] cons = clazz.getConstructors();     
  71.         for (Constructor con : cons) {     
  72.             if (con.getParameterTypes().length != args.length) continue;     
  73.             object = con.newInstance(args);     
  74.         }     
  75.         return object;     
  76.     }     
  77.     
  78.     //根据set方法,进行注入     
  79.     private void instanceSetMethod(Object object) {     
  80.         Method[] methods = object.getClass().getDeclaredMethods();     
  81.         Queue queue = new LinkedList();     
  82.         for (Method method : methods) {     
  83.             queue.add(method);     
  84.         }     
  85.         for (int i = queue.size(); queue.size() > 0; i = queue.size()) {     
  86.             Method method = queue.poll();     
  87.             if (method.getName().indexOf("set") != 0) continue;     
  88.             Class[] clazzes = method.getParameterTypes();     
  89.             if (clazzes.length != 1) continue;     
  90.             Class pclazz = clazzes[0];     
  91.             try {     
  92.                 Object pObject = this.get(pclazz);     
  93.                 method.invoke(object, new Object[] { pObject });     
  94.             } catch (Exception e) {     
  95.                 continue;     
  96.             }     
  97.             if (i == queue.size()) break;     
  98.         }     
  99.     }     
  100.     
  101.     // 初使化该类,调用init方法     
  102.     private void instanceInitMethod(Object object) {     
  103.         try {     
  104.             Method method = object.getClass().getMethod("init", new Class[] {});     
  105.             method.invoke(object, new Object[] {});     
  106.         } catch (Exception e) {     
  107.             return;     
  108.         }     
  109.     }     
  110. }   

用法示例
有类Bean1
 

  1.     
  2. public class Bean1 {     
  3.     
  4.     private String hello;     
  5.     
  6.     public void init() {     
  7.         this.hello = "hello kitty";     
  8.     }     
  9.     
  10.     public void show() {     
  11.         System.out.println(this.hello);     
  12.     }     
  13. }    

执行 TestSF
 

  1. public class TestSF {     
  2.     
  3.     private Bean1 bean;     
  4.     
  5.     public void setBean(Bean1 bean) {     
  6.         this.bean = bean;     
  7.     }     
  8.     
  9.     public void test() {     
  10.         this.bean.show();     
  11.     }     
  12.     
  13.     public static void main(String[] args) {     
  14.         SF sf = new SF();     
  15.         TestSF test = (TestSF) sf.get(TestSF.class);     
  16.         test.test();     
  17.     }     
  18. }   

输出:
 

  1. hello kitty   

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
规避非法攻击 用好路由器远程管... 单位在市区不同位置设立了科技服务点,每一个服务点的员工都通过宽带路由器进行共享上网,和单位网络保持联...
范例解读VB.NET获取环境变... VB.NET编程语言的使用范围非常广泛,可以帮助开发人员处理各种程序中的需求,而且还能对移动设备进行...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...