1. 程式人生 > >手寫spring框架,實現簡單的ioc功能

手寫spring框架,實現簡單的ioc功能

 最近重新鞏固了基礎, 把spring框架重新學習了一遍。

現在用自己的理解將spring框架寫一遍。這次先簡單實現,以後會慢慢拓展,暫時定的計劃是spirngmvc和mybatis的整合。

整體思路是使用dom4j解析xml檔案,然後反射注入到Person類中。簡單明瞭,不做過多解釋。

畢竟菜鳥一個,現在肯定漏洞百出,希望大佬們能多多指教,我會盡力完善,也請多多評論一下。刷點存在感~,嘿嘿

前提是有時間的情況下。

首先是目錄結構


然後是程式碼部分

ApplicationContext.java

package spring.achieve;

public interface ApplicationContext {
	
	Object getBean(String beanId);

}

ClassPathXmlApplicationContext.java

package spring.achieve;

import static org.hamcrest.CoreMatchers.nullValue;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ClassPathXmlApplicationContext implements ApplicationContext {

	private String fileName;

	public ClassPathXmlApplicationContext(String fileName) {
		this.fileName = fileName;

	}

	@Override
	public Object getBean(String beanId) {
		//使用dom4j讀取xml檔案
		//單一,慢慢擴充套件,多個bean的時候,並且只有value,現在只有屬性注入,並且異常沒有解決
		SAXReader reader = new SAXReader();
		Document document = null;
		Object object = nullValue();
		String currentPath = this.getClass().getResource("").getPath();
	/*	問題1 如何讀取到的resources下檔案
	 * String currentPath1 = this.getClass().getResource("/").getPath();
	 * currentPath1 返回/E:/java/CX/test/target/test-classes/
	 * currentPath返回 /E:/java/CX/test/target/classes/spring/achieve/  
	 * 而resources下的檔案是E:\java\CX\test\target\classes
	   */
		try {
			document = reader.read(new File(currentPath+fileName));
			System.out.println(currentPath+fileName);
            Element root =document.getRootElement();
            Iterator iterable = root.elementIterator();
            while(iterable.hasNext()){
            	Element element = (Element) iterable.next();
            	Iterator proiterable = element.elementIterator();//selectsinglenode不好使,這樣很麻煩
            	while(proiterable.hasNext()){
            		Element proelement = (Element) proiterable.next();
            		String propertyName = proelement.attributeValue("name");
            		String propertyValue = proelement.attributeValue("value");
            		String url = element.attributeValue("class");
            		String setMethod = "set"+propertyName.substring(0,1).toUpperCase()+propertyName.substring(1);
            		System.out.println(setMethod);
                	try {
    					object = Class.forName(url).newInstance();
    					Method[] methods  =object.getClass().getMethods();
    					for(Method method:methods){
    						if (setMethod.equals(method.getName())) {
    							System.out.println(method.getName());
    							try {
									method.invoke(object, propertyValue);
								} catch (IllegalArgumentException e) {
									e.printStackTrace();
								} catch (InvocationTargetException e) {
									e.printStackTrace();
								}
							}
    						
    					}
    					
    					
    				} catch (InstantiationException e) {
    					e.printStackTrace();
    				} catch (IllegalAccessException e) {
    					e.printStackTrace();
    				} catch (ClassNotFoundException e) {
    					e.printStackTrace();
    				}
            	}
            	
            	
            
            	
            }
            
           
			
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		
	
		
		
		

		return null;
	}

}
Person
package spring.achieve;

public class Person {
	String userName;



	public void setUserName(String userName) {
		System.out.println(userName);
		this.userName = userName;
	}
	

}

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>

	<bean id="hostess" class="spring.achieve.Person">
	<property name ="userName" value = "admin">
	
	</property>

	</bean>
	
</beans>

TestMySpring

package test;

import org.junit.Test;

import spring.achieve.ApplicationContext;
import spring.achieve.ClassPathXmlApplicationContext;
import spring.achieve.Person;

public class TestMySpring {
	@Test
	public void testGetBean(){
		ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
		Person person = (Person)context.getBean("pro");
		
	}

}

pom.xml差點忘記貼出來了

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>MySpring</groupId>
	<artifactId>test</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>


	<dependencies>
		 <dependency>
			<groupId>dom4j</groupId>
			<artifactId>dom4j</artifactId>
			<version>1.6.1</version>
		</dependency> 
			<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1.3-b06</version>
		</dependency>


	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>


</project>

相關推薦

spring框架實現簡單ioc功能

 最近重新鞏固了基礎, 把spring框架重新學習了一遍。現在用自己的理解將spring框架寫一遍。這次先簡單實現,以後會慢慢拓展,暫時定的計劃是spirngmvc和mybatis的整合。整體思路是使用dom4j解析xml檔案,然後反射注入到Person類中。簡單明瞭,不做過

用Maven整合SpringMVC+Spring+Hibernate 框架實現簡單的插入資料庫資料功能

一、搭建開始前的準備 1、我用的MyEclipse2014版,大家也可以用IDEA。 2、下載Tomcat(免安裝解壓包)、MySQL(zip包下載地址 免安裝解壓包,好處就是雙擊啟動,最後我會把bat的啟動發給大家)、用的Navicat for MySQL的MySQL的圖

用Maven整合SpringMVC+Spring+Hibernate 框架實現簡單的插入資料庫資料功能(二)

前一篇寫的有些多,大家先看前一篇,傳送門 具體的資源已將上傳到資源了。 上文我們直接搭建前的準備和資源配置都寫好了,下面進入具體程式碼編寫。承接上文的小3 3、我習慣建立介面,這樣對整個專案感覺更合理。 (1.)建立IBaseService(業務邏輯層,有的習慣寫成Ba

SpringMVC框架用註解實現springmvc過程

開發十年,就只剩下這套架構體系了! >>>   

我是這樣Spring麻雀雖小五臟俱全

很多 精華 red 自己 執行 dispatch xml文件 pom.xml 描述 人見人愛的Spring已然不僅僅只是一個框架了。如今,Spring已然成為了一個生態。但深入了解Spring的卻寥寥無幾。這裏,我帶大家一起來看看,我是如何手寫Spring的。我將結合對Sp

我是這樣Spring麻雀雖小五臟俱全

人見人愛的Spring已然不僅僅只是一個框架了。如今,Spring已然成為了一個生態。但深入瞭解Spring的卻寥寥無幾。這裡,我帶大家一起來看看,我是如何手寫Spring的。我將結合對Spring十多年的研究經驗,用不到400行程式碼來描述SpringIOC、DI、MVC的精華設計思想,並

JFinal框架學習------整合bootstrap前端框架實現簡單的增刪改查功能

   Bootstrap,來自 Twitter,是目前最受歡迎的前端框架。Bootstrap 是基於 HTML、CSS、JAVASCRIPT 的,它簡潔靈活,使得 Web 開發更加快捷。 一、JFinal整合bootstrap   1.下載bootstra

攜程系統架構師帶你spring mvc解讀spring核心原始碼!

講師簡介: James老師 系統架構師、專案經理 十餘年Java經驗,曾就職於攜程、人人網等一線網際網路公司,專注於java領域,精通軟體架構設計,對於高併發、高效能服務有深刻的見解, 在服務化基礎架構和微服務技術有大量的建設和設計經驗。   課程內容: 1.為什麼讀Spr

Spring框架學習筆記

public class DispatcherServlet extends HttpServlet { private Properties contextConfig = new Properties(); private List<String> classN

MyEclipse搭建SSM框架實現簡單的登入註冊

  Spring+SpringMVC+MyBatis+MySql 前言     最近要開發一款自己的app,之前學過ssm框架,所以就採用ssm來開發,但是由於好久沒用,已經忘得差不多,所以發帖方便自己總結搭建框架過程的問題,也方便初學者借鑑,後面會陸續更新。。。

jwt驗證實現java和node無縫切換

前言 前端時間和我朋友寫了一個簡易使用者管理後臺,功能其實很簡單,涉及到的技術棧有:vue+elementUI,java+spring MVC以及node+egg,資料庫用的mysql,簡單方便。 一開始是我是隻負責前端,但是前端開發的的速度太快,老是沒事,加上他小子並沒有接觸過實戰的專案,又怕他出亂子,所以

重學 Java 設計模式:實戰中介者模式「按照Mybatis原理ORM框架給JDBC方式操作資料庫增加中介者場景」

![](https://img-blog.csdnimg.cn/20200627092858193.jpg) 作者:小傅哥 部落格:[https://bugstack.cn](https://bugstack.cn) - `原創系列專題文章` >沉澱、分享、成長,讓自己和他人都能有所收穫!

自定義Oracle 函式傳入引數實現簡單功能

create or replace function get_Sub_Item_data(vfieldname  in varchar2,                                                vtablename  in varch

mybatis框架-增加快取&事務功能

前言 在學習mybatis原始碼之餘,自己完成了一個簡單的ORM框架。已完成基本SQL的執行和物件關係對映。本週在此基礎上,又加入了快取和事務功能。所有程式碼都沒有copy,如果也對此感興趣,請賞個Star。 專案地址:simple-ibatis 初版博文地址:部落格園博文 增加程式碼詳解 快取 com.si

從零開始 spring ioc 框架深入學習 spring 原始碼

IoC Ioc 是一款 spring ioc 核心功能簡化實現版本,便於學習和理解原理。 創作目的 使用 spring 很長時間,對於 spring 使用非常頻繁,實際上對於原始碼一直沒有靜下心來學習過。 但是 spring 原始碼存在一個問題,那就是過於抽象,導致學習起來成本上升。 所以本專案由漸入深,只實

阿裏微服務專家Spring Boot 實現一個簡單的自動配置模塊

微服務 簡單的 AR AI tps ble 免費 VM 知識體系 為了更好的理解 Spring Boot 的 自動配置和工作原理,我們自己來實現一個簡單的自動配置模塊。 假設,現在項目需要一個功能,需要自動記錄項目發布者的相關信息,我們如何通過 Spring Boot 的

Spring MVC框架(包含Java註解的實現

主要從以下幾點入手 : 一、瞭解SpringMVC執行流程及九大元件 二、梳理自己的SpringMVC的設計思路 三、實現自己的SpringMVC框架瞭解SpringMVC執行流程及九大元件執行流程:1.使用者傳送請求->DispatcherServlet;使用者向服務

Spring IoC容器之自定義註解實現

由於我在CSDN編輯器上寫這篇文章的時候,在貼上圖片上來的時候總是出現了卡頓,所以就另外寫了一個word文件裡面了,具體的實現過程請下載,裡面有文件、原始碼、資料庫sql檔案 連結:https://pan.baidu.com/s/1La2FIhlVKSt7JLh393V8I

spring ioc框架

user.xml <?xml version="1.0" encoding="UTF-8"?> <beans>     <bean id="user1" class="com.huishao.entity.UserEntity">   

Spring學習之——Spring原始碼V2.0(實現IOC、DI、MVC、AOP)

前言 在上一篇《Spring學習之——手寫Spring原始碼(V1.0)》中,我實現了一個Mini版本的Spring框架,在這幾天,博主又看了不少關於Spring原始碼解析的視訊,受益匪淺,也對Spring的各元件有了自己的理解和認識,於是乎,在空閒時間把之前手寫Spring的程式碼重