前述
因為前幾日剛剛學完Spring的基礎,因此寫一篇博客整理一下相關的基礎知識。
什么是Spring?
Spring 是一個輕量級的 DI / IoC 和 AOP 容器的開源框架,幫助分離項目組件之間的依賴關系。,來源於 Rod Johnson 在其著作《Expert one on one J2EE design and development》中闡述的部分理念和原型衍生而來。
Spring:SE/EE開發的一站式框架。
一站式框架:有EE開發的每一層解決方案。
WEB層 :SpringMVC
Service層 :Spring的Bean管理,Spring聲明式事務
DAO層 :Spring的Jdbc模板,Spring的ORM模塊
Spring框架的優點
- 非侵入式設計:
非侵入式指應用程序代碼對框架的依賴最小化,即不需要用戶代碼引入框架代碼的信息,從類的編寫者角度來看,察覺不到框架的存在。
- 方便解耦、簡化開發:
通過Spring提供的IoC容器,我們可以將對象之間的依賴關系交由Spring進行控制,避免硬編碼所造成的過度程序耦合。有了Spring,用戶不必再為單實例模式類、屬性文件解析等這些很底層的需求編寫代碼,可以更專注於上層的應用。
- 支持AOP編程:
AOP(Aspect Oriented Programming)面向切面編程。Spring提供了對AOP的支持,它允許將一些通用任務,如安全、事務、日志等進行集中式處理,從而提高了程序的復用性。
- 支持聲明式事務處理:
只需要通過配置就可以完成對事務的管理,不需要手動編程。
- 方便程序的測試:
Spring對Junit4支持,可以通過注解方便的測試Spring程序。
- 方便集成各種優秀框架:
Spring可以降低各種框架的使用難度,Spring提供了對各種優秀框架(如Struts、Hibernate、Hessian、Quartz)等的直接支持。
- 降低Java EE API的使用難度:
Spring對很多難用的Java EE API(如JDBC、JavaMail、遠程調用等)提供了一個薄薄的封裝層,通過Spring的簡易封裝,這些Java EE API的使用難度大為降低。
Spring的框架結構
- Data Access/Integration層(數據訪問/集成)包含有JDBC、ORM、OXM、JMS和Transaction模塊。
- Web層包含了Web、Web-Servlet、WebSocket、Web-Porlet模塊。
- AOP模塊提供了一個符合AOP聯盟標准的面向切面編程的實現。
- Core Container(核心容器):包含有Beans、Core、Context和SpEL模塊。
- Test模塊支持使用JUnit和TestNG對Spring組件進行測試。
Spring的框架包
官方下載地址:https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring
選擇相應的版本下載就可以了,注意:jdk1.7只能和spring4.0以下的包搭配使用,而你要是用Spring4.0以上的包就要用jdk1.8.0乃至以上的版本。
說明
下面對照結構圖說一下每個jar包的作用
spring4中的jar包一共有20個
Core部分包含4個模塊
- spring-core:依賴注入IoC與DI的最基本實現
- spring-beans:Bean工廠與bean的裝配
- spring-context:spring的context上下文即IoC容器
- spring-expression:spring表達式語言
AOP部分包含4個模塊
- spring-aop:面向切面編程
- spring-aspects:集成AspectJ
- spring-instrument:提供一些類級的工具支持和ClassLoader級的實現,用於服務器
- spring-instrument-tomcat:針對tomcat的instrument實現
Data Access/Integration部分包含5個模塊
- spring-jdbc:jdbc的支持
- spring-tx:事務控制
- spring-orm:對象關系映射,集成orm框架
- spring-oxm:對象xml映射
- spring-jms:java消息服務
Web部分包含3個模塊
- spring-web:基礎web功能,如文件上傳
- spring-webmvc:mvc實現
- spring-webmvc-portlet:基於portlet的mvc實現
- spring-websocket:為web應用提供的高效通信工具
Test部分一個模塊
- spring-test:spring測試,提供junit與mock測試功能
剩下的包是
- spring-messaging:用於構建基於消息的應用程序
- spring-context-support:spring額外支持包,比如郵件服務、視圖解析等
除了Spring的包之外,在開發中還會用到一個依賴包,即
下載地址:http://commons.apache.org/proper/commons-logging/download_logging.cgi
我的第一個 Spring 程序
- 創建Web項目,引入核心jar包
- 創建pojo,描述一個User,有name和id
1 package spring_test1.pojo; 2 3 /** 4 * @author jyroy 5 * 6 */ 7 public class User { 8 private String name; 9 private int id; 10 11 public String getName() { 12 return name; 13 } 14 public void setName(String name) { 15 this.name = name; 16 } 17 public int getId() { 18 return id; 19 } 20 public void setId(int id) { 21 this.id = id; 22 } 23 @Override 24 public String toString() { 25 return "User [name=" + name + ", id=" + id + "]"; 26 } 27 }
- 編寫配置文件
編寫配置文件要做的就是將類交給Spring管理
在src目錄下新建Spring核心的配置文件applicationContext.xml
這個配置文件要怎么寫呢?
首先要寫的,就是XML配置文件的約束,那約束怎么寫呢?只要去 spring-framework-4.3.20.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html 目錄下找到相關的約束復制到xml中就可以了,剩下要做的就是對於類的配置了。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation=" 6 http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd"> 8 9 <!--Spring的入門的配置--> 10 <bean name="user" class="spring_test1.pojo.User"> 11 <property name="name" value="李東"/> 12 <property name="id" value="1007" /> 13 </bean> 14 15 </beans>
- 創建一個測試類
用到了ApplicationContext,它是一種常用的Spring核心容器。提供了完整的IOC服務支持,是管理Bean的工廠,主要負責初始化各種Bean,並調用Bran生命周期的方法,還包含對國際化、資源訪問、事件傳播等方面的支持。
創建ApplicationContext接口實例,通常有兩種方式:
- 通過 ClassPathXmlApplicationContext 創建,就是下面例子中用到的方式,new ClassPathXmlApplicationContext("applicationContext.xml") 是Spring會去類路徑中查找名為applicationContext.xml 的配置文件。
- 通過FileSystemXmlApplicationContext 創建,從指定的文件系統路徑(絕對路徑)中尋找指定的XMl配置文件。
1 package spring_test1.test; 2 3 import org.junit.Test; 4 import org.springframework.context.ApplicationContext; 5 import org.springframework.context.support.ClassPathXmlApplicationContext; 6 7 import spring_test1.pojo.User; 8 9 public class UserTest { 10 11 @Test 12 public void demo1() { 13 //創建Spring的工廠 14 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); 15 //通過容器獲取user對象 16 User user = (User) applicationContext.getBean("user"); 17 System.out.println(user); 18 } 19 }
- 結果
IOC和DI簡述
IOC (Inversion Of Control):控制反轉。這是一種設計思想,就是將原本在程序中手動創建對象的控制權,交由Spring框架來管理。
DI (Dependency Injection): 依賴注入。將對象依賴屬性(簡單值,集合,對象)通過配置設值給該對象。
說明:
上面的例子中,便應用了IOC和DI,這里詳細的說一下。
可以看到,我們並沒有進行 new 實例化,但是還是產生對象了,這就是利用了IOC容器,進行創建對象,其中 User user = (User) applicationContext.getBean("user"); 便是通過Spring容器獲取的實現類對象,而不是通過 new 關鍵字來創建user。
其中name和id的設置便是應用了依賴注入,通過set方法進行的基本數據類型的注入。
傳統方式與IOC方式對比
傳統方式
通過new關鍵字來實例化,創建對象。
Category c = new Category();
IOC方式
對象的生命周期由Spring來管理,而不需要通過顯式的new來實現。即控制權從本來在自己手里,現在交給了Spring。
Category c = Spring產生。
這篇都是Spring介紹和一點點基礎。關於細節的地方沒有展開。我慢慢來。