試圖自己寫一個IoC容器
花了點時間摸了一個IoC容器
出來,沒實現元件掃描和變數的註解注入,就單純實現了使用xml進行的配置
。
applicationContext.xml
配置了一下,將UserDao注入到UserService當中
。
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="userDao" class="indi.zhuyst.dao.UserDao"/>
<bean id="userService" class="indi.zhuyst.service.UserService" >
<property name="userDao" ref="userDao"/>
</bean>
</beans>
ApplicationContext
首先定義好XML的位置以及一個存放Bean的Map
private static final String XML_PATH = "/applicationContext.xml";
private Map<String,Bean> beans = new HashMap<>();
public ApplicationContext (){
this.init();
}
之後順序就很明確了
- 讀取XML
- 初始化所有Bean
- 設定Bean中的屬性
/**
* 讀取XML到{@link #beans}中
* @see #XML_PATH
*/
private void readXml(){
InputStream inputStream = this.getClass().getResourceAsStream(XML_PATH);
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
ApplicationContextHandler handler = new ApplicationContextHandler();
parser.parse(inputStream,handler);
initBean(handler.getBeans());
} catch (ParserConfigurationException | SAXException | IOException e) {
throw new RuntimeException("XML解析錯誤");
}
}
/**
* 通過反射,初始化所有的Bean
* @param beanList Bean列表
*/
private void initBean(List<Bean> beanList){
try {
for(Bean bean : beanList){
Object object = Class.forName(bean.getClassPath()).newInstance();
bean.setObject(object);
beans.put(bean.getId(),bean);
System.out.println("初始化 —— " + bean.getClassPath());
}
} catch (ClassNotFoundException e) {
throw new RuntimeException("沒有找到類:" + e.getMessage());
} catch (IllegalAccessException | InstantiationException e) {
throw new RuntimeException("類初始化失敗");
}
}
/**
* 核心:通過setter設定Bean中需要的類
*/
private void setBeanProperties(){
for(Map.Entry<String,Bean> entry : beans.entrySet()){
Bean bean = entry.getValue();
List<Property> properties = bean.getProperties();
if(properties != null){
for(Property property : properties){
String ref = property.getRef();
if(beans.containsKey(ref)){
Object object = beans.get(ref).getObject();
setter(bean.getObject(),property.getName(),object);
System.out.println("向 " + bean.getClassPath() + " 設定 " + property.getName());
}
else {
throw new RuntimeException("無法找到" + property.getRef());
}
}
}
}
}
一個簡單的Ioc容器就完成了!
相關推薦
試圖自己寫一個IoC容器
花了點時間摸了一個IoC容器出來,沒實現元件掃描和變數的註解注入,就單純實現了使用xml進行的配置。 applicationContext.xml 配置了一下,將UserDao注入到UserService當中。 <?xml version="
自己動手寫一個ioc容器
控制反轉(Inversion of Control,縮寫為IoC),是面向物件程式設計中的一種設計原則,可以用來減低計算機程式碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查詢”(Depe
自己寫一個簡單的Spring IOC容器
為了能更好的理解SpirngIOC是如何工作的,在查閱網上的資料後,自己寫了一個非常簡單的SpringIOC容器,使用setter方法將值注入。 本例子需要用到jdom的包:http://pan.baidu.com/s/1hsmgsfi 以下是包結構 A和B介面的定義就不
spring ioc原理 spring ioc原理(看完後大家可以自己寫一個spring)
原 spring ioc原理(看完後大家可以自己寫一個spring) 2009年08月02日 20:33:00 超級谷歌 閱讀數:332663
[自己造輪子] 動手寫一個 Tomcat 容器
一、前言 IT 行業變化多端,流行的技術層出不窮, 而萬變不離其宗,學習其設計思想,才是最為重要。 Tomcat,基於 HTTP 協議,根據請求連結,返回相應的資源。 二、程式碼 程式碼參考了網上,做了一定的修改,使之符合 Maven 的專案規範 1、Tom
spring ioc原理(看完後大家可以自己寫一個spring)
最近,買了本Spring入門書:spring In Action 。大致瀏覽了下感覺還不錯。就是入門了點。Manning的書還是不錯的,我雖然不像哪些只看Manning書的人那樣專注於Manning,但懷著崇敬的心情和激情通覽了一遍。又一次接受了IOC 、DI、AOP等S
我們能自己寫一個容器類,然後使用 for-each 迴圈碼?
今天繼續分享一道Java經典面試題: 直接上題: 我們能自己寫一個容器類,然後使用 for-each 迴圈嗎? 可以,你可以寫一個自己的容器類。如果你想使用 Java 中增強
spring ioc原理(看完後大家可以自己寫一個spring)(摘)
摘自http://blog.csdn.net/it_man/archive/2009/08/02/4402245.aspx 最近,買了本Spring入門書:spring In Action 。大致瀏覽了下感覺還不錯。就是入門了點。Manning的書還是不錯的,我雖然不像哪些
自己寫一個文字過長顯示省略號的函數
bsp aaa poi var cti 顯示 adf 函數 字符 function points(strin,num){ //strin表示目標字符,num表示在第幾個字符用省略號顯示 var Str = "",len = strin.length; if(len
oracle 10G 沒有 PIVOT 函數怎麽辦,自己寫一個不久有了
name 行轉列 動態sql self. subst ger esc 10g 必須 眾所周知,靜態SQL的輸出結構必須也是靜態的。對於經典的行轉列問題,如果行數不定導致輸出的列數不定,標準的答案就是使用動態SQL, 到11G裏面則有XML結果的PIVOT。 但是 orac
自己寫一個破解zip加密文件的腳本
匹配 zipfile 有一個 file ++ gre 解壓 官方 trac 前言:因為要參加一個作品賽,而且要寫一個PPT來介紹一下自己的作品,自己寫的PPT醜的一批,所以就想到網上找一些模板。開啟度娘模式,搜索PPT模板,找到百度雲分享,開心,下載,下載之後懵X了,TMD
自己寫一個jquery
模擬 bubuko elements ret TE nts select IT tex 通過閱讀jquery原代碼, 我們可以模擬寫一個簡單的jquery 比如常用的 jQuery("div").css("color","red");jQuery("#span1").c
自己寫一個C#數據結構:用List<T>實現一個簡單的Stack
count 實現簡單 ole exceptio tac on() rem linq -- 在C#中利用List<T>實現一個簡單的Stack 需要實現的功能:壓棧、彈棧、查看棧頂元素、查看元素個數、查看Socket是否為空,判斷元素是否在Socket中、清空So
用Java自己寫一個反轉字串的方法
關於反轉字串的方法,Java中的StringBuffer類中有現成的方法,自己寫一個是為了提高自己的程式設計能力。 挺簡單的,主要是用了String類的構造方法,Java的自動拆裝箱機制,剩下的就是基本的迴圈了,供朋友們參考
java基礎學習總結(二十一):自己寫一個java.lang.reflect.Proxy代理的實現
動態代理裡面用到了一個類就是java.lang.reflect.Proxy,這個類是根據代理內容為傳入的介面生成代理用的。本文就自己寫一個Proxy類出來,功能和java.lang.reflect.Proxy一樣,傳入介面、代理內容,生成代理。  
Python中自己寫一個計時器,計算一個過程所需秒數
import time import sys import numpy as np i = np.arange(1, 5000) def k_timer(bool_start_end, start_time): if bool_start_end: return tim
STM32開發筆記55:STM32F4+DP83848乙太網通訊指南系列(九):自己寫一個ARP協議
本章為系列指南的第九章,終結篇,本章主要來分析一下完整的ARP協議,並在STM32F4中實現一個精簡的ARP協議響應流程。 ARP協議的本質是使區域網內的其他主機能夠知道我在哪兒,比如在區域網上有人衝著所有人喊了一句「IP為XXXX的傢伙,你在哪兒」,我一聽,XXXX不是我的IP嗎,我得回答他啊
java——自己寫一個生成隨機數的方法
在java中,主要有三種獲得隨機數的方法: 1、Math.random();這個方法生成的是0~1之間的一個double; 2、java.util的Random類,建立該類的物件來產生隨機數(int、float、double、long) 3、System類中的currentTimeMilli
自己寫一個websocket
import socket, base64, hashlib sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
dart 自己寫一個檔案編碼器
// import 'dart:convert'; import 'dart:io'; main() async { var src = File('./lib/convert/source.txt'); var outpu