歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Spring之初體驗

Spring之初體驗

Spring是一個輕量級的Java Web開發框架,以IoC(Inverse of Control 控制反轉)和AOP(Aspect Oriented Programming 面向切面編程)為內核,使用基本的JavaBean來完成以前只能有EJB完成的工作(現在這句話好像就是廢話,以後我們會慢慢來說明)。

在實際開發當中,通常服務器端采用三層體系架構,分別為表示層(web)、業務邏輯層(service)、持久層(DAO)。Spring對每一層都提供了技術支持,在表示層提供了與Structs2框架的整合,在業務邏輯層可以管理事物,記錄日志等,在持久層可以整合Hibernate、JDBCTemplate等技術,從設計上來看,給予了Java程序員很多自由,為商業開發提供了良好的解決方案。

Spring框架的優點

Spring具有簡單、可測試和松耦合的特點,從這個角度出發,Spring不僅可以用於服務器端開發,而且可以應用於任何Java應用的開發中。其優點總結如下:

方便解耦、簡化開發:Spring就是一個工廠,可以將所有對象創建和依賴關系維護交給Spring管理;

AOP編程的支持:Spring提供面向切面編程,可以方便的實現對程序進行權限管理、運行監控等功能;

聲明式事物的支持:只需要通過配置就可以完成對事物的管理,無需手動編程;

方便程序的測試:Spring對JUnit4支持,可以通過注解方便地測試Spring程序;

方便集成各種優秀框架:Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(Struts2、Hibernate、MyBatis、Quartz等)的直接支持;

降低JavaEE API的使用難度:Spring對JavaEE開發中難以使用的一些API(JDBC、JavaMail、遠程調用)都提供了封裝,使API應用難度降低。

Spring體系結構

Spring框架采用分層架構,其體系結構圖如下,我們著重介紹一下Core Container、Data Access/Intergration、Web、AOP(Aspect Oriented Programming)部分。

•Core Container(核心容器)

Spring的核心容器是建立在其他模塊的基礎上的,由Beans模塊、Core核心模塊、Context上下文模塊和Expression Language表達式語言模塊組成。

Beans模塊:提供BeanFactory,是工廠模式的經典實現,Spring將管理對象成為Bean;

Core核心模塊:Spring的核心類庫,提供了Spring框架的基本組成部分,包括IoC和DI功能;

Context上下文模塊:建立在Core和Beans基礎上,訪問定義和配置任何對象的媒介,ApplicationContext接口就是上下文模塊的焦點;

Expression Language模塊:運行時查詢和操作對象圖的強大表達式語言。
•Data Access/Intergration(數據訪問/集成)

JDBC模塊:提供一個JDBC(Java Data Base Connectivity)的抽象層,大幅度減少了在開發過程中對數據庫操作的代碼;

ORM模塊:提供對常用ORM框架的管理和輔助支持,Spring本身不對ORM進行實現,僅是對常見ORM框架的封裝;

OXM模塊:提供了一個支持對象/XML映射實現對JAXB、Castor使用XMLBeans、JiBX和XStream的抽象層

Transactions事物模塊:支持編程和聲明式事務管理實現特殊接口類,並且對所有的POJO都適用。
•Web模塊

Spring的Web層包括web、Servlet、Struts和Portlet組件,具體介紹如下:

Web 模塊提供了基本的面向 web 的集成特性,如多個文件上傳的功能和使用 servlet 監聽器的IOC容器初始化以及面向 web 應用程序的上下文;

Servlet模塊:包括Spring模型-視圖-控制器(MVC)實現web應用程序;

Struts模塊:包含支持類內的Spring應用程序,集成經典的Struts web層;

Portlet模塊:提供了在portlet環境中使用MVC實現,類似Web-Servlet模塊的功能。

第一個Spring程序
•當然啦,首先是下載Spring框架包,本文中使用的是4.3.4的版本,下載地址為:http://repo.spring.io/release/org/springframework/spring/4.3.4.RELEASE/,選擇spring-framework-4.3.4.RELEASE-dist.zip下載。


•然後在Eclipse中創建web項目,並將Spring所需要的jar包復制到項目的lib目錄中,並且對包構建路徑,jar包為Spring的4個基礎包:

spring-core-4.3.4.RELEASE.jar:包含Spring框架基本的核心工具類,Spring其他組件都要用到這個包中的類;

spring-beans-4.3.4.RELEASE.jar:包含訪問配置文件、創建和管理bean以及進行IoC或者DI操作相關的類;

spring-context-4.3.4.RELEASE.jar:Spring提供在IoC功能上的擴展服務,此外還提供企業級的服務,如郵件服務、任務調度、JNDI定位、緩存以及各種視圖層框架的封裝等;

spring-expression-4.3.4.RELEASE.jar:定義了spring的表達式語言。

其中還有一個記錄日志的jar文件:文件下載路徑為:http://commons.apache.org/proper/commons-logging/download_logging.cgi

項目的目錄結構如下:

整個項目包的導入工作已經完成,隨後是創建UserDao接口和UserDaoImpl實現類:


public interface UserDao {
    public void sayHello();
}


public class UserDaoImpl implements UserDao{

    @Override
    public void sayHello() {
        // TODO Auto-generated method stub
        System.out.println("spring: hello user dao");
    }

}

  然後在src目錄下創建applicationContext.xml文件:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
      "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
      <!-- 將指定對象配置給spring,讓spring創建其實例 -->
      <bean id="userDao" class="com.ioc.UserDaoImpl"></bean>
</beans>

  最後是創建主類Client,實現對方法的調用:


public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //定義配置文件路徑
        String xmlPath = "applicationContext.xml";
        //初始化spring容器,加載配置文件
        ApplicationContext application = new ClassPathXmlApplicationContext(xmlPath);
        //通過容器獲取UserDao實例
        UserDao userDao = (UserDao) application.getBean("userDao");
        userDao.sayHello();
    }

}

  最後整個項目的目錄結構圖如下:

  運行該主函數就會在控制台中看到輸出信息:“spring: hello user dao”。如上即為一個spring簡單IoC的實例,實例不是有調用者來創建的,而是由Spring容器創建,Spring容器會控制程序之間的關系,而不是由程序代碼直接控制,這樣控制權由應用代碼轉移到了外部容器,控制權發生了反轉,也就是IoC的思想。

   接下來我們再來看一看DI(依賴注入),它與控制反轉的含義相同,只不過從不同的角度描述同一個概念。如果A類需要使用B類的對象才能實現某個功能,這時可以說A類對象依賴B類對象,而Spring容器在創建A類對象時,會自動將A類對象需要的B類對象注入到A類對象中,此過程就是依賴注入。Spring支持兩種依賴注入:setter方法注入、構造方法注入。

屬性setter注入:指IoC容器使用setter方法注入被依賴實例,通過調用無參構造器或無參static工廠方法實例化Bean後,調用該Bean的setter方法,即可實現基於setter的DI

構造方法注入:指IoC容器使用構造方法來注入被依賴的實例,基於構造器的DI通過調用帶參數的構造方法來實現,每個參數代表一個依賴。

  我們通過setter注入的方式來說明DI,首先創建UserDaoImpl的兩個依賴類BeforeAction和AfterAction,這兩個類集成自Action接口,然後在UserDaoImpl類中加入兩個私有的類對象,並實現兩個對象的setter方法。

  如下是BeforeAction和AfterAction的實現代碼:


public interface Action {
    public void doSomething();
}

public class BeforeAction implements Action{

    @Override
    public void doSomething() {
        // TODO Auto-generated method stub
        System.out.println("this is a method in BeforeAction");
    }

}

public class AfterAction implements Action{

    @Override
    public void doSomething() {
        // TODO Auto-generated method stub
        System.out.println("this is a method in AfterAction");
    }

}

  然後是UserDaoImpl代碼的改變:


public class UserDaoImpl implements UserDao{
    //UserDaoImpl依賴的兩個對象
    private BeforeAction beforeAction;
    private AfterAction afterAction;
    //實現依賴對象的setter方法
    public void setBeforeAction(BeforeAction beforeAction) {
        this.beforeAction = beforeAction;
    }
    public void setAfterAction(AfterAction afterAction) {
        this.afterAction = afterAction;
    }
    @Override
    public void sayHello() {
        // TODO Auto-generated method stub
        this.beforeAction.doSomething();
        System.out.println("spring: hello user dao");
        this.afterAction.doSomething();
    }

}

  最後是修改applicationContext.xml文件,實現UserDaoImpl對BeforeAction和AfterAction類的依賴注入。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
      "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
      <!-- 將指定對象配置給spring,讓spring創建其實例 -->
      <bean id="beforeAction" class="com.action.BeforeAction"/>
      <bean id="afterAction" class="com.action.AfterAction"/>
      <bean id="userDao" class="com.ioc.UserDaoImpl">
          <property name="beforeAction" ref="beforeAction"/>
          <property name="afterAction" ref="afterAction"/>
      </bean>
</beans>

  整個項目最新的目錄結構如下:

  其中Client中的代碼不變,從而通過setter的方法,實現了將兩個Action對象加入到UserDaoImpl中。

思來想去還是想介紹一下構造器方法的注入,只是簡單的說明一下吧,在setter依賴注入的實現的代碼基礎上,只對兩個文件進行修改(UserDaoImpl和applicationContext.xml)。其中在UserDaoImpl中添加一個構造方法,其中參數為BeforeAction和AfterAction對象,UserDaoImpl中增加的代碼如下:

    public UserDaoImpl(BeforeAction before, AfterAction after){
        this.beforeAction = before;
        this.afterAction = after;
    }

  applicationContext.xml文件內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
      "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
      <!-- 將指定對象配置給spring,讓spring創建其實例 -->
      <bean id="beforeAction" class="com.action.BeforeAction"/>
      <bean id="afterAction" class="com.action.AfterAction"/>
      <bean id="userDao" class="com.ioc.UserDaoImpl">
          <!-- 如下為setter方法的依賴注入 -->
          <!-- property name="beforeAction" ref="beforeAction"/ -->
          <!-- property name="afterAction" ref="afterAction"/ -->
          <!-- 如下是構造器方式的依賴注入 -->
          <constructor-arg index="0" ref="beforeAction" />
          <constructor-arg index="1" ref="afterAction" />
      </bean>
</beans>

  本篇文章主要講解了Spring的基本知識,首先介紹了Spring框架的優缺點,隨後介紹了框架體系結構,然後通過兩個Spring實例分別實現了Spring的IoC和DI,幫助讀者對Spring的控制反轉(IoC)和依賴注入(DI)有進一步的理解。

Copyright © Linux教程網 All Rights Reserved