在學習完Spring框架之後, 我們知道了 Spring容器, IOC, AOP, 事務管理, SpringMVC 這些Spring的核心內容, 也知道了它們底層實現的基本原理, 比如Spring容器就是個Map映射, IOC底層就是反射機制, AOP底層是動態代理, SpringMVC不就是對Servlet進行了下封裝嘛! 哈哈, 當然這些只是些皮毛, Spring除此之外還有更加複雜的設計, 但我們完全可以拋棄那些複雜的設計, 通過這些底層原理自己來寫個Spring框架. 寫完之後, 相信我們會對Spring框架有個更加深刻的理解.
前置知識
在自己動手寫Spring框架之前, 我們得先了解下Spring框架的核心知識點, 如下:
代碼下載
在開始動手寫博客之前, 我已經完成了自己的Spring框架, 並給它取名爲 handwritten-mvc-framwork, GitHub地址爲:
https://github.com/tyshawnlee/handwritten-mvc.git
大家可以 clone 到自己的IDE中, 然後跟着下面的博客我們一起學習.
項目導入後結構如下:
其中, handwritten-mvc-framwork 爲自己實現的Spring框架, handwritten-mvc-example 爲該框架的實例.
開始
(1) 建立框架
我們首先創建一個Maven項目, 取名爲 handwritten-mvc-framwork, 我們儘可能少的使用第三方依賴, 精簡後的依賴如下:
<dependencies>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- JSP -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!-- JSP標準標籤庫 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.33</version>
<scope>runtime</scope>
</dependency>
<!--數據庫連接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.0.1</version>
</dependency>
<!--JDBC工具類庫-->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.6</version>
</dependency>
<!-- 日誌框架 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
<!-- 動態代理依賴 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
<!-- 通用工具包 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<!--集合工具包-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
<!--JSON依賴-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
</dependencies>
(2) 實現Spring容器和IOC
(3) 實現Spring MVC
(4) 實現Spring AOP和事務管理