spring快速上手

1.Spring概述

Spring是一個(gè)開源框架,它能夠降低開發(fā)企業(yè)應(yīng)用程序的復(fù)雜性,可以使用Spring替代EJB開發(fā)企業(yè)級(jí)應(yīng)用,而不用擔(dān)心工作量太大、開發(fā)進(jìn)度難以控制和復(fù)雜的測(cè)試過程等問題。Spring簡化了企業(yè)級(jí)應(yīng)用的開發(fā),降低了開發(fā)成本,能夠整合各種流行框架。它以IoC(控制反轉(zhuǎn))和AOP(面向切面編程)兩種先進(jìn)的技術(shù)為基礎(chǔ),完美的簡化了企業(yè)級(jí)開發(fā)的復(fù)雜度。

1.1初識(shí)Spring

Spring框架主要由七大模塊組成,他提供了企業(yè)級(jí)開發(fā)需要的所有功能,而且每個(gè)模塊都可以單獨(dú)使用,也可以和其他莫款組合使用,靈活且方便的部署可以使開發(fā)的程序更加簡潔。

Spring核心模塊
  1. 核心模塊:Spring Core模塊是Spring的核心容器,他實(shí)現(xiàn)了IoC模式,提供了Spring框架的基礎(chǔ)功能,在模塊中包含最重要的BeanFactory類是Spring的核心類,負(fù)責(zé)對(duì)JavaBean的配置和管理。他采用了Factory模式實(shí)現(xiàn)了IoC容器,即依賴注入
    2.Context模塊:Spring Context模塊繼承BeanFactory(或者說是Spring核心)類,并且添加了事件處理、國際化、資源裝載、透明裝載以及數(shù)據(jù)校驗(yàn)等功能。他還提供了框架式的Bean的訪問方式和很多企業(yè)級(jí)的功能,如JNDI訪問、支持EJB、遠(yuǎn)程調(diào)用、集成模板框架、E-mail和定時(shí)任務(wù)調(diào)度等。
    3.AOP模塊:Spring集成了所有的AOP功能。通過事務(wù)管理可以使任意Spring管理的對(duì)象AOP化。Spring提供了用標(biāo)準(zhǔn)Java語言編寫的AOP框架,他的大部分內(nèi)容都是根據(jù)AOP聯(lián)盟的API開發(fā)的,他使應(yīng)用程序拋開EJB的復(fù)雜性,但擁有傳統(tǒng)EJB的關(guān)鍵功能。
    4.DAO模塊:提供JDBC的抽象層,簡化了數(shù)據(jù)庫廠商的異常錯(cuò)誤,大幅度減少代碼的編寫,并且提供了對(duì)聲明式事務(wù)和編程式事務(wù)的支持。
    5.ORM模塊:提供對(duì)現(xiàn)有ORM框架的支持,各種流行的ORM框架已經(jīng)做的非常成熟了,所以沒有必要開發(fā)新的ORM工具,但是他對(duì)Hibernate提供了完美的整合功能,同時(shí)也支持其他的ORM工具。
    6.WEB模塊:建立在Spring Context基礎(chǔ)之上,他還提供了Servlet監(jiān)聽器的Context和Web應(yīng)用的上下文,對(duì)現(xiàn)有的Web框架提供集成。
    7.MVC模塊:建立在Spring的核心功能之上,這使得他能擁有Spring框架的所有特性,能夠適應(yīng)多種視圖,模塊技術(shù)、國際化和驗(yàn)證服務(wù),實(shí)現(xiàn)控制邏輯和業(yè)務(wù)邏輯清晰的分離。

2.準(zhǔn)備

在開始進(jìn)行開發(fā)之前,我們首先需要獲得Spring工具包、commons-logging包。并且我們可以簡單的查看一下他們的官方文檔。之后,我們就能正常的開展下一步了。

3.第一個(gè)Spring實(shí)例

筆者在介紹的過程中,先給出一個(gè)完整的spring簡單實(shí)例,可以大體上的了解一些Spring的開發(fā)過程,然后,我們?cè)龠M(jìn)行介紹里面的原理。
步驟:

  • 首先,我們?cè)趀clipse中建立一個(gè)JavaProject,并創(chuàng)建SpringDemo工程
  • 其次,在SpringDemo工程的src目錄下創(chuàng)建com.bean包,在該包下分別創(chuàng)建Person.java、ChineseImpl.java和AmercianImpl.java 3個(gè)文件,編輯代碼如下:
    代碼清單1:person.java
package com.bean;
public interface Person {
    public void speak();
}

代碼清單2:ChineseImpl.java

package com.bean;
public class ChineseImpl implements Person {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public void speak() {
        // TODO Auto-generated method stub
        System.out.println("我是中國人,我的名字是" + this.name + ",                   我今年" + this.age + "歲!");
    }
}

代碼清單3:AmercianImpl.java

package com.bean;

public class AmercianImpl implements Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void speak() {
        // TODO Auto-generated method stub
        System.out.println("我是美國人,我的名字是" + this.name + ",我今年" + this.age + "歲!");
    }

}

上面的代碼中,我們定義了一個(gè)person接口,通過該接口規(guī)定了Person的規(guī)范,并且進(jìn)行了兩個(gè)實(shí)例,在我們進(jìn)行代碼的編寫的過程中,我們可以使用接口與實(shí)現(xiàn)的分離,這樣可以大大的增大代碼的重用性以及復(fù)用性。
那么,問題來了?在Spring中顯然應(yīng)該讓Spring容器來負(fù)責(zé)調(diào)用這兩個(gè)類的Setter方法以設(shè)置實(shí)例中屬性的值。這在Spring中是如何實(shí)現(xiàn)的呢?根據(jù)我們?cè)趯W(xué)習(xí)Struts2以及Hibernate中的知識(shí)我們可以想到應(yīng)該使用XML配置文件來實(shí)現(xiàn)。下面我們?cè)赟pring中使用配置文件applicationContext.xml來告知容器應(yīng)該如何對(duì)AmericanImpl和ChineseImpl進(jìn)行配置

  • 在src目錄下創(chuàng)建applicationContext.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

    <!-- 配置chinese實(shí)例,其實(shí)現(xiàn)類com.bean.ChineseImpl -->
    <bean id="chinese" class="com.bean.ChineseImpl">
        <!-- 將值“小明”注入給name屬性 -->
        <property name="name">
            <value>小明</value>
        </property>
        <!-- 將值10注入給age屬性 -->
        <property name="age">
            <value>10</value>
        </property>
    </bean>
    
    <bean id="amercian" class="com.bean.AmercianImpl">
        <!-- 將值"Tom”注入給name屬性 -->
        <property name="name">
            <value>Tom</value>
        </property>
        <!-- 將值15注入給age屬性 -->
        <property name="age">
            <value>15</value>
        </property>
    </bean>
</beans>

上面的XML文件在Spring容器中聲明了一個(gè)ChineseImpl實(shí)例chinese和一個(gè)AmercianImpl實(shí)例amercian并為其中的set方法進(jìn)行賦值。

  • Test類
    在src目錄下創(chuàng)建com.spring包,在該包下創(chuàng)建Test.java文件。
package com.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.bean.Person;

public class Test {
    public static void main(String[] args) {
        /*創(chuàng)建spring容器*/
        //當(dāng)然這里還有beanFactory接口,也能實(shí)現(xiàn)這種功能,ApplicationContext增加了更多的企業(yè)級(jí)應(yīng)用
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        /*獲取ChineseImpl實(shí)例的引用*/
        Person person = (Person) context.getBean("chinese");
        //調(diào)用ChineseImpl實(shí)例的speak()方法
        person.speak();
        person = (Person) context.getBean("amercian");
        person.speak();
    }
}

程序中。我們需要注意的是spring容器的創(chuàng)建,這樣就能將applicationContext.xml文件加載進(jìn)容器中,并且進(jìn)行實(shí)例化,以及調(diào)用set方法進(jìn)行賦值,這樣就能為其中實(shí)現(xiàn)一個(gè)最基本的Spring操作應(yīng)用了。
**
ChineseImpl和AmericanImpl類的實(shí)例并不是main()方法來創(chuàng)建的,而是通過將applicationContext.xml文件加載后,交付給Spring框架,當(dāng)執(zhí)行g(shù)etBean()方法時(shí),就可以得到要?jiǎng)?chuàng)建實(shí)例的引用,因此,調(diào)用者并沒有創(chuàng)建實(shí)例,而是通過Spring框架將創(chuàng)建好的實(shí)例注入調(diào)用者中,這實(shí)際上就是Spring的核心控制:依賴注入(DI),而Spring強(qiáng)大的地方就在于他可以使用依賴注入將一個(gè)Bean注入到另一個(gè)Bean中。
**

4. Spring的IoC容器

Spring的IoC容器是一個(gè)提供IoC支持的輕量級(jí)容器,IoC容器為管理對(duì)象之間的依賴關(guān)系提供了基礎(chǔ)功能。Spring為我們提供兩種容器:BeanFactory和ApplicationContext。
BeanFactory在Spring中的作用至關(guān)重要,他實(shí)際上是一個(gè)用于配置和管理Java類的內(nèi)部接口。顧名思義,BeanFactory就是一個(gè)管理Bean的工廠,它負(fù)責(zé)初始化各種Bean并調(diào)用他們的生命周期方法。
當(dāng)然,在進(jìn)行XML文件的配置的時(shí)候,我們也可以選擇使用annotation(注解)來進(jìn)行編寫里面的配置關(guān)系,而且感覺上比使用XML文件來的更加的直接方便。

5.Spring框架的優(yōu)勢(shì)

  • Spring框架能夠有效的組織中間層對(duì)象,Spring框架能夠有效的將現(xiàn)有的框架如Struts和Hibernate框架組織起來。
  • Spring框架實(shí)現(xiàn)了真正意義上的面向接口編程,可實(shí)現(xiàn)組件之間的高度解耦,而面向接口編程是一種良好的編程習(xí)慣。
  • Spring所秉承的設(shè)計(jì)思想就是讓使用Spring創(chuàng)建的那些應(yīng)用都盡可能少地依賴于它的APIs。在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對(duì)象都不依賴于Spring。
  • 使用Spring構(gòu)建的應(yīng)用程序易于進(jìn)行單元測(cè)試
  • Spring提高了代碼的可重用性,它盡可能避免在程序中使用硬解碼。Spring可以將應(yīng)用程序中的某些代碼抽象出來,然后在其他程序中使用這些代碼。
  • Spring為數(shù)據(jù)存取提供了一個(gè)一致的框架,簡化了底層數(shù)據(jù)庫的訪問方式。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容