程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 一個類的簡單SPRING

一個類的簡單SPRING

編輯:關於JAVA

你是否常編一些小工具,做一些小東西?

在你擴展維護的時候,是不是覺得實例傳遞越來越復雜?

你經常改變想法,但小東西不停重構開始耽誤你越來越多的時間?

你想到了用spring,但又不想對於一個簡單的小東西,引入一個相對小重的框架,讓你的小程序加載時都需要卡一下?

哈,試一試用下simpleFactory,是否可以解決你的煩惱,只有一個類哦,copy一下,就可以幫助你實現依賴注入;

simpleFactory是我在做小實驗時,為了解決上面的問題,自己寫的編碼小工具,至少自己用起來很哈皮

SF代碼:

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

用法示例
有類Bean1

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

執行 TestSF

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

輸出:

  1. hello kitty
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved