日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模拟spring - 简单实现spring IOC

發布時間:2025/6/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟spring - 简单实现spring IOC 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

IOC (Inverse of control) - 控制反轉,spring的IOC實現原理為利用Java的反射機制并充當工廠的角色完成對象的裝配和注入。

二、實現細節

附上一張類的結構圖,該例子需要導入jdom.jar和junit.jar



<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+CqLZINPDu6dCZWFuPC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">package com.zdp.model; // 用戶類 public class User { private String userName; private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }② UserService

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.zdp.service; import com.zdp.dao.UserDao; import com.zdp.model.User; public class UserService { ????private UserDao userDao; ????public void add(User user) { ????????userDao.save(user); ????} ????public UserDao getUserDao() { ????????return userDao; ????} ????public void setUserDao(UserDao userDao) { ????????this.userDao = userDao; ????} }
③ UserDao

?
1 2 3 4 5 6 7 8 9 10 11 package com.zdp.dao; import com.zdp.model.User; public class UserDao { ????? ????public void save(User user) { ????????System.out.println("user saved!"); ????} ????? }
④ Bean工廠接口

?
1 2 3 4 5 6 7 8 package com.zdp.spring; // Bean工廠接口 public interface BeanFactory { ????? ????public Object getBean(String id); ????? }
⑤ Bean工廠實現

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 package com.zdp.spring; import java.lang.reflect.Method; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; // Bean工廠實現類 public class ClassPathXmlApplicationContext implements BeanFactory { ????private Map<string, object=""> beans = new HashMap<string, object="">(); ????public ClassPathXmlApplicationContext() throws Exception { ????????SAXBuilder sb = new SAXBuilder(); ????????Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); // 構造文檔對象 ????????Element root = doc.getRootElement(); // 獲取根元素HD ????????List list = root.getChildren("bean"); // 取名字為bean的所有元素 ????????for (int i = 0; i < list.size(); i++) { ????????????Element element = (Element) list.get(i); ????????????String id = element.getAttributeValue("id"); ????????????String clazz = element.getAttributeValue("class"); ????????????Object beanObj = Class.forName(clazz).newInstance(); // 反射獲取對象 ????????????beans.put(id, beanObj); // 將對象存入Bean工廠 ????????????for (Element propertyElement : (List<element>) element.getChildren("property")) { ????????????????String name = propertyElement.getAttributeValue("name"); // name="userDao" ????????????????String bean = propertyElement.getAttributeValue("bean"); // bean="userDao" ????????????????Object injectObject = beans.get(bean); // 從Bean工廠中獲取UserDao ????????????????String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); // setUserDao ????????????????Method method = beanObj.getClass().getMethod(methodName, injectObject.getClass()); ????????????????method.invoke(beanObj, injectObject); // set注入UserDao對象 ????????????} ????????} ????} ????public Object getBean(String id) { ????????return beans.get(id); ????} } </element></string,></string,>

這里為核心代碼,當然在實際情況中,這一塊要復雜的多, 例如:可以一個bean引用另一個bean,還可以有多個配置文件、通過多種方式載入配置文件等等,不過原理還是采用Java的反射機制。

⑥ 配置文件

?
1 2 3 4 5 6 <beans> ????<bean id="userDao" class="com.zdp.dao.UserDao"> ????<bean id="userService" class="com.zdp.service.UserService"> ????????<property name="userDao" bean="userDao"> ????</property></bean> </bean></beans>
⑦ 單元測試

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package com.zdp.service; import org.junit.Test; import com.zdp.model.User; import com.zdp.spring.BeanFactory; import com.zdp.spring.ClassPathXmlApplicationContext; // 測試代碼 public class UserServiceTest { ????@Test ????public void testAdd() throws Exception { ????????BeanFactory applicationContext = new ClassPathXmlApplicationContext(); // 獲取上下文 ????????UserService service = (UserService) applicationContext.getBean("userService"); // Spring裝配Bean ????????User user = new User(); ????????user.setUserName("zhangsan"); ????????user.setPassword("123456"); ????????service.add(user); // 將user保存入庫 ????} }

三、小結

上文僅僅是簡單地模擬了spring的IOC的實現,雖然只是完成了spring中依賴注入的一小部分,但還是很好地展現了Java反射機制在spring中的應用,對于初學者理解IOC應該會有一點幫助。

總結

以上是生活随笔為你收集整理的模拟spring - 简单实现spring IOC的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男人影院在线观看 | 鲁丝av| 伊人天堂av| 国产精品日韩在线观看 | 一级一级黄色片 | 国产精品久久国产 | 在线观看理论片 | 久草免费在线色站 | 久久999| 中国av一区二区三区 | 亚洲成人第一页 | 九色精品视频 | 天天看天天爽 | 污污的视频在线观看 | 顶弄h校园1v1 | 亚洲AV成人无码电影在线观看 | 在线免费福利视频 | 亚洲天堂2016| 日韩一区视频在线 | 成人动作片 | 日韩av一区二区三区四区 | 国产成人综合自拍 | 欧美色图亚洲自拍 | 欧美日韩在线影院 | 视频在线一区二区三区 | 51啪影院 | 五月天狠狠干 | 成人在线视频播放 | 色资源在线 | 永久福利视频 | 亚洲三页 | 久久一区 | 久久成人18免费观看 | 久草新在线 | 亚洲 激情 小说 另类 欧美 | 国产成人无码精品久久久久 | 在线免费观看不卡av | 中文字幕色片 | 伊人91视频 | 欧美一级做a爰片免费视频 成人激情在线观看 | 中国特级毛片 | 一级视频在线免费观看 | 久久久久久久美女 | 精品国产一区二区在线观看 | 欧美极度另类 | 99久久亚洲精品日本无码 | 熟睡侵犯の奶水授乳在线 | 欧美视频免费看 | 精品自拍视频在线观看 | 亚洲欧美日韩另类在线 | 亚洲色图五月天 | 夜夜爽av福利精品导航 | caoprom97| 致命魔术电影高清在线观看 | 国产日韩一级片 | 午夜色图 | 国产精品色网 | 激情网页| 羞羞网站在线观看 | 国产亚洲精品久久久久久777 | 色五婷婷| 亚洲AV无码乱码国产精品牛牛 | 国产二区视频在线观看 | 人人澡人人添 | 91久久久国产精品 | 少妇精品| 黄色av网站在线免费观看 | 国产成年人视频 | 国产精品黄色av | 玩弄白嫩少妇xxxxx性 | 国产丰满麻豆 | 91精品久久久久久久久久 | 国产男女网站 | 蜜桃在线一区二区三区 | 色一色成人网 | 一区在线看 | 日韩免费福利视频 | 久福利| 午夜xxx| 日韩城人免费 | 欧美日韩亚洲国产 | 国产视频一区在线观看 | 97caoporn| 就要爱爱tv| 91精品久久人妻一区二区夜夜夜 | 亚洲精品亚洲人成人网 | 亚洲理论电影在线观看 | 91福利网 | 国产午夜精品久久久久久久久久 | 国产精选视频在线观看 | 中文字幕三级电影 | 激情五月婷婷小说 | 亚洲一区在线看 | 欧美日韩亚洲二区 | 久久久久高清 | 精品一区电影国产 | 亚洲一区二区三区激情 | 亚洲日本国产精品 | 欧美一区二区成人 |