1. 程式人生 > >試圖自己寫一個IoC容器

試圖自己寫一個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(); }

之後順序就很明確了

  1. 讀取XML
  2. 初始化所有Bean
  3. 設定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