javascript
框架:简单实现Spring的IOC容器
學習過Spring的同學都知道,Spring框架的核心就是IoC和AOP。Spring可以理解為一個工廠,負責對象的創建和對象間關系的維護。IoC即控制反轉,簡單點說就是原來的對象是在要使用之前通過在代碼里通過new 的方式創建出來的,而IOC的思想則是由spring容器來統一創建(配置文件中注冊bean對象),在程序要使用到該對象的時候,自動注入。(spring默認在web容器啟動的時候就創建了單例的對象)其最大的作用是減少了代碼之間的耦合度。(將對象的創建和使用解耦合)
下面是我自己寫的一個Spring框架,只是簡單的模擬和實現了Spring的IoC容器功能。
思路如下:
1.? 解析xml配置文件
2.? 根據配置的生成相應的對象
3.? 將對象存入IOC容器
步驟如下:
1)???????創建bean類和對應的Service類
2)???????配置xml解析文件(Spring的配置文件:application.xml.)
3)???????最后也是實現Ioc最為核心的部分ClassPathXMLApplicationContext。這個類采用Jdom對application.xml文檔進行解析。
大致思路是:通過讀取配置文件中定義的全路徑類名,利用java反射技術創建該類的實例。首先定義HashMap這樣的一重數據結構用于存儲創建的實例。Key值就是配置文件的<bean>標簽“id”,value值就是對應的實例。然后該類需要提供?
public Object getBean(String name)方法返回實例對象。
?
創建一個java/web工程:MyIoC . ?目錄結構如下:
?
?
下面對上面所創建的類逐一介紹。
首先創建一個Student類和StudentService類如下:
[java]?view plain?copy
1.? package?cn.shu.pojo;??
2.? public?class?Student?{??
3.? ??
4.? ??????private?String?name;??
5.? ??????private?String?add;??
6.? ????????
7.? ??????public?void?selfIntroDuction(){??
8.? ????????????System.out.println("我的姓名是?"?+?name?+?"?我來自?"?+?add);??
9.? ?????????
10. ???????}??
11. ????????
12. ??????public?String?getName()?{??
13. ????????????return?name;??
14. ????????}??
15. ??
16. ????????public?void?setName(String?name)?{??
17. ????????????this.name?=?name;??
18. ????????}??
19. ??
20. ????????public?String?getAdd()?{??
21. ????????????return?add;??
22. ????????}??
23. ??
24. ????????public?void?setAdd(String?add)?{??
25. ????????????this.add?=?add;??
26. ????????}??
27. ????????
28. }??
[java]?view plain?copy
1.? package?cn.shu.service;??
2.? import?cn.shu.pojo.Student;??
3.? ??
4.? public?class?StudentService?{??
5.? ??private??Student?student;??
6.? ??
7.? public?Student?getStudent()?{??
8.? ????return?student;??
9.? }??
10. ??
11. public?void?setStudent(Student?student)?{??
12. ????this.student?=?student;??
13. }??????
14.}
接著編寫Spring的配置文件:application.xml.
[html]?view plain?copy
1.? <?xml?version="1.0"?encoding="UTF-8"?>??
2.? ??
3.? <beans>??
4.? ????<bean?id="Student"?class="cn.shu.pojo.Student">??
5.? ????????<property?name="name"?value="Hover"/>??
6.? ????????<property?name="add"?value="China"/>??
7.? ????</bean>??
8.? ??
9.? ????<bean?id="StudentService"?class="cn.shu.service.StudentService">??
10. ????????<property?ref="Student"/>??
11. ????</bean>??
12. </beans>??
? ??最后也是實現Ioc最為核心的部分ClassPathXMLApplicationContext。這個類采用Jdom對application.xml文檔進行解析。大致思路是:通過讀取配置文件中定義的全路徑類名,利用java反射技術創建該類的實例。首先定義HashMap這樣的一種數據結構用于存儲創建的實例。Key值就是配置文件的<bean>標簽“id”,value值就是對應的實例。然后該類需要提供?
public Object getBean(String name)方法返回實例對象。具體代碼如下:
[java]?view plain?copy
1.? package?cn.shu.IocFactory.impl;??
2.? ??
3.? import?org.jdom.input.SAXBuilder;??
4.? import?org.jdom.Document;??
5.? import?org.jdom.JDOMException;??
6.? import?org.jdom.Element;??
7.? import?org.jdom.xpath.XPath;??
8.? ??
9.? import?java.io.File;??
10. import?java.io.IOException;??
11. import?java.net.URL;??
12. import?java.net.URISyntaxException;??
13. import?java.util.*;??
14. import?java.lang.reflect.Field;??
15. import?java.lang.reflect.Method;??
16. import?java.lang.reflect.InvocationTargetException;??
17. ??
18. import?cn.shu.IocFactory.ApplicationContext;??
19. ??
20. public?class?ClassPathXMLApplicationContext?implements?ApplicationContext{??
21. ??????
22. ??????
23. ????????private?File?file;??
24. ????????private?Map?map?=?new?HashMap();??
25. ??
26. ????????public?ClassPathXMLApplicationContext(String?config_file)?{??
27. ????????????URL?url?=?this.getClass().getClassLoader().getResource(config_file);??
28. ??
29. ????????????try?{??
30. ????????????????file?=?new?File(url.toURI());??
31. ????????????????XMLParsing();??
32. ????????????}?catch?(Exception?e)?{??
33. ????????????????//?TODO?Auto-generated?catch?block??
34. ????????????????e.printStackTrace();??
35. ????????????}??
36. ??????????????
37. ????????}??
38. ??
39. ????????????private?void?XMLParsing()?throws?Exception?{???????
40. ????????????SAXBuilder?builder?=?new?SAXBuilder();??
41. ????????????Document?doc?=?builder.build(file);??
42. ????????????XPath?xpath?=?XPath.newInstance("//bean");??
43. ????????????List?beans?=?xpath.selectNodes(doc);??
44. ????????????Iterator?i?=?beans.iterator();??
45. ????????????while?(i.hasNext())?{??//循環獲取bean里所有配置的類
46. ????????????????Element?bean?=?(Element)?i.next();??//讀取bean配置文件
47. ????????????????String?id?=?bean.getAttributeValue("id");??//讀取文件路徑
48. ????????????????String?cls?=?bean.getAttributeValue("class");??
49. ????????????????Object?obj?=?Class.forName(cls).newInstance();??//反射創建對象
50. ????????????????Method[]?method?=?obj.getClass().getDeclaredMethods();//獲取方法
51. ????????????????List<Element>?list?=?bean.getChildren("property");?//獲取方法?
52. ????????????????for?(Element?el?:?list)?{??
53. ????????????????????for?(int?n?=?0;?n?<?method.length;?n++)?{??
54. ????????????????????????String?name?=?method[n].getName();??
55. ????????????????????????String?temp?=?null;??
56. ????????????????????????if?(name.startsWith("set"))?{??
57. ????????????????????????????temp?=?name.substring(3,?name.length()).toLowerCase();??
58. ????????????????????????????if?(el.getAttribute("name")?!=?null)?{??
59. ????????????????????????????????if?(temp.equals(el.getAttribute("name").getValue()))?{??
60. ????????????????????????????????????method[n].invoke(obj,?el.getAttribute("value").getValue());??
61. ????????????????????????????????}??
62. ????????????????????????????}?else?{??
63. ????????????????????????????????method[n].invoke(obj,map.get(el.getAttribute("ref").getValue()));??
64. ????????????????????????????}??
65. ????????????????????????}??
66. ????????????????????}??
67. ????????????????}??
68. ????????????????map.put(id,?obj);?//用HashMap存儲實例。id為key,如studentService。
69. ????????????}??
70. ????????}??
71. ??
72. ????????public?Object?getBean(String?name)?{??
73. ????????????return?map.get(name);??//取值,如取studentService。
74. ????????}??
75. ??
76. }??
? 編寫測試類:
[java]?view plain?copy
1.? package?cn.shu.test;??
2.? ??
3.? import?cn.shu.IocFactory.ApplicationContext;??
4.? import?cn.shu.IocFactory.impl.ClassPathXMLApplicationContext;??
5.? import?cn.shu.service.StudentService;??
6.? ??
7.? public?class?Test?{??
8.? ????public?static?void?main(String[]?args)?{??
9.? ? ? ? ? ? ? ApplicationContext?context?=?new?ClassPathXMLApplicationContext("applicationContext.xml");??
10. ????????????StudentService??stuServ?=?(StudentService)?context.getBean("StudentService");??
11. ????????????stuServ.getStudent().selfIntroDuction();??
12. ????}??
13. ??????
14. }??
測試結果如下:
總結
以上是生活随笔為你收集整理的框架:简单实现Spring的IOC容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 框架:DAO,Service,Contr
- 下一篇: 框架:Spring的自动装配