Spring框架的概述和入門


Spring框架的概述和入門


什么是Spring框架

1. Spring框架的概述
    * Spring是一個開源框架
    * Spring是于2003 年興起的一個輕量級的Java開發(fā)框架深夯,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。
    * 它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的龄砰∮胙辏框架的主要優(yōu)勢之一就是其分層架構(gòu),分層架構(gòu)允許使用者選擇使用哪一個組件,同時為 J2EE 應(yīng)用程序開發(fā)提供集成的框架栅螟。
    * Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而篱竭,Spring的用途不僅限于服務(wù)器端的開發(fā)力图。從簡單性、可測試性和松耦合的角度而言掺逼,任何Java應(yīng)用都可以   從Spring中受益吃媒。
    * Spring的核心是控制反轉(zhuǎn)(IoC)和面向切面(AOP)。簡單來說吕喘,Spring是一個分層的JavaSE/EEfull-stack(一站式) 輕量級開源框架赘那。
    
    * EE開發(fā)分成三層結(jié)構(gòu)
        * WEB層      -- Spring MVC
        * 業(yè)務(wù)層   -- Bean管理:(IOC)
        * 持久層   -- Spring的JDBC模板.ORM模板用于整合其他的持久層框架

Spring框架的特點

1. 為什么要學(xué)習(xí)Spring的框架
    * 方便解耦,簡化開發(fā)
        * Spring就是一個大工廠氯质,可以將所有對象創(chuàng)建和依賴關(guān)系維護募舟,交給Spring管理
    * AOP編程的支持
        * Spring提供面向切面編程,可以方便的實現(xiàn)對程序進行權(quán)限攔截闻察、運行監(jiān)控等功能
    * 聲明式事務(wù)的支持
        * 只需要通過配置就可以完成對事務(wù)的管理拱礁,而無需手動編程
    * 方便程序的測試
        * Spring對Junit4支持琢锋,可以通過注解方便的測試Spring程序
    * 方便集成各種優(yōu)秀框架
        * Spring不排斥各種優(yōu)秀的開源框架,其內(nèi)部提供了對各種優(yōu)秀框架(如:Struts2觅彰、Hibernate吩蔑、MyBatis、Quartz等)的直接支持
    * 降低JavaEE API的使用難度
        * Spring 對JavaEE開發(fā)中非常難用的一些API(JDBC填抬、JavaMail烛芬、遠程調(diào)用等),都提供了封裝飒责,使這些API應(yīng)用難度大大降低

2. Spring框架的版本
    * Spring3.x和Spring4.x的版本

Spring框架的IOC核心功能快速入門

1. 什么是IOC的功能赘娄?
    * IoC       -- Inverse of Control,控制反轉(zhuǎn)宏蛉,將對象的創(chuàng)建權(quán)反轉(zhuǎn)給SpringG簿省!
    * 使用IOC可以解決的程序耦合性高的問題J安ⅰ揍堰!
Paste_Image.png
2. 步驟一:下載Spring框架的開發(fā)包
    * 官網(wǎng):http://spring.io/
    * 下載地址:http://repo.springsource.org/libs-release-local/org/springframework/spring解壓:(Spring目錄結(jié)構(gòu):)
        * docs      -- API和開發(fā)規(guī)范
        * libs      -- jar包和源碼
        * schema    -- 約束

3. 步驟二:創(chuàng)建JavaWEB項目,引入Spring的開發(fā)包
    * 引入Spring框架IOC核心功能需要的具體的jar包
        * Spring框架的IOC的功能嗅义,那么根據(jù)Spring框架的體系結(jié)構(gòu)圖能看到屏歹,只需要引入如下的jar包
            * Beans
            * Core
            * Context
            * Expression Language
        
        * Spring框架也需要引入日志相關(guān)的jar包
            * 在spring-framework-3.0.2.RELEASE-dependencies/org.apache.commons/com.springsource.org.apache.commons.logging/1.1.1
                * com.springsource.org.apache.commons.logging-1.1.1.jar
            
            * 還需要引入log4j的jar包 spring-framework-3.0.2.RELEASE-dependencies\org.apache.log4j\com.springsource.org.apache.log4j\1.2.15
                * com.springsource.org.apache.log4j-1.2.15.jar

4. 步驟三:創(chuàng)建對應(yīng)的包結(jié)構(gòu),編寫Java的類之碗,要注意:以后使用Spring框架做開發(fā)蝙眶,都需要來編寫接口與實現(xiàn)類!幽纷!
    * com.itcast.demo1
        * UserService           -- 接口
        * UserServiceImpl       -- 具體的實現(xiàn)類

5. 步驟四:想把UserServiceImpl實現(xiàn)類的創(chuàng)建交給Spring框架來管理,需要創(chuàng)建Spring框架的配置文件,完成配置
    * 在src目錄下創(chuàng)建applicationContext.xml的配置文件,名稱是可以任意的,但是一般都會使用默認(rèn)名稱@掳恕!
    
    * 引入spring的約束奖恰,需要先找到具體的約束頭信息?错负!
        * spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\xsd-config.html
        * 具體的約束如下:      
            <beans xmlns="http://www.springframework.org/schema/beans"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="
                    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
            </beans>
    
    * 完成UserService的配置
        <!-- Spring的快速入門 -->
        <bean id="userService" class="com.itcast.demo1.UserServiceImpl"/>

6. 步驟五:編寫測試程序粥诫,采用Spring框架的工廠方式來獲取到UserService接口的具體實現(xiàn)類!!
    public void demo2(){
        // 使用Spring的工廠:
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 通過工廠獲得類:
        UserService userService = (UserService) applicationContext.getBean("userService");
        userService.sayHello();
    }

入門總結(jié)之Spring框架中的工廠

1. ApplicationContext接口
    * 使用ApplicationContext工廠的接口首懈,使用該接口可以獲取到具體的Bean對象
    * 該接口下有兩個具體的實現(xiàn)類
        * ClassPathXmlApplicationContext            -- 加載類路徑下的Spring配置文件
        * FileSystemXmlApplicationContext           -- 加載本地磁盤下的Spring配置文件

2. BeanFactory工廠(是Spring框架早期的創(chuàng)建Bean對象的工廠接口)
    * 使用BeanFactory接口也可以獲取到Bean對象
        public void run(){
            BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
            UserService us = (UserService) factory.getBean("us");
            us.sayHello();
        }
    
    * BeanFactory和ApplicationContext的區(qū)別
        * BeanFactory               -- BeanFactory采取延遲加載,第一次getBean時才會初始化Bean
        * ApplicationContext        -- 在加載applicationContext.xml時候就會創(chuàng)建具體的Bean對象的實例炊甲,還提供了一些其他的功能
            * 事件傳遞
            * Bean自動裝配
            * 各種不同應(yīng)用層的Context實現(xiàn)

入門總結(jié)之配置Spring框架編寫XML的提示

1. 步驟一:先復(fù)制菱父, http://www.springframework.org/schema/beans/spring-beans.xsd    
2. 步驟二:搜索XML Catalog,點擊Add按鈕
3. 步驟三:先選擇Location的schema的約束地址
    * E:\class\2016\JavaEE28\day35_Spring框架第一天\資料\spring-framework-4.2.4.RELEASE-schema\beans\spring-beans-4.2.xsd
4. 步驟四:注意:Key type要選擇:Schema location
5. 步驟五:Key把http://www.springframework.org/schema/beans/spring-beans.xsd復(fù)制上

Spring框架的Bean管理的配置文件方式


Spring框架中<bean>標(biāo)簽的配置

1. id屬性和name屬性的區(qū)別
    * id        -- Bean起個名字,在約束中采用ID的約束,唯一
        * 取值要求:必須以字母開始,可以使用字母、數(shù)字、連字符什乙、下劃線、句話弃舒、冒號  id:不能出現(xiàn)特殊字符
    
    * name      -- Bean起個名字,沒有采用ID的約束(了解)
        * 取值要求:name:出現(xiàn)特殊字符.如果<bean>沒有id的話 , name可以當(dāng)做id使用
        * Spring框架在整合Struts1的框架的時候馍忽,Struts1的框架的訪問路徑是以/開頭的棒坏,例如:/bookAction

2. class屬性          -- Bean對象的全路徑
3. scope屬性          -- scope屬性代表Bean的作用范圍
    * singleton         -- 單例(默認(rèn)值)
    * prototype         -- 多例,在Spring框架整合Struts2框架的時候遭笋,Action類也需要交給Spring做管理坝冕,配置把Action類配置成多例!瓦呼!
    * request           -- 應(yīng)用在Web項目中,每次HTTP請求都會創(chuàng)建一個新的Bean
    * session           -- 應(yīng)用在Web項目中,同一個HTTP Session 共享一個Bean
    * globalsession     -- 應(yīng)用在Web項目中,多服務(wù)器間的session

4. Bean對象的創(chuàng)建和銷毀的兩個屬性配置(了解)
    * 說明:Spring初始化bean或銷毀bean時喂窟,有時需要作一些處理工作,因此spring可以在創(chuàng)建和拆卸bean的時候調(diào)用bean的兩個生命周期方法
    * init-method       -- 當(dāng)bean被載入到容器的時候調(diào)用init-method屬性指定的方法
    * destroy-method    -- 當(dāng)bean從容器中刪除的時候調(diào)用destroy-method屬性指定的方法
        * 想查看destroy-method的效果央串,有如下條件
            * scope= singleton有效
            * web容器中會自動調(diào)用磨澡,但是main函數(shù)或測試用例需要手動調(diào)用(需要使用ClassPathXmlApplicationContext的close()方法)

依賴注入(DI)

1. IOC和DI的概念
    * IOC       -- Inverse of Control,控制反轉(zhuǎn)质和,將對象的創(chuàng)建權(quán)反轉(zhuǎn)給SpringN壬恪!
    * DI        -- Dependency Injection饲宿,依賴注入厦酬,在Spring框架負(fù)責(zé)創(chuàng)建Bean對象時,動態(tài)的將依賴對象注入到Bean組件中L毕搿仗阅!

2.  DI(依賴注入)
    * 例如:如果UserServiceImpl的實現(xiàn)類中有一個屬性,那么使用Spring框架的IOC功能時国夜,可以通過依賴注入把該屬性的值傳入進來<踉搿!
    * 具體的配置如下
        <bean id="us" class="com.itheima.demo1.UserServiceImpl">
            <property name="uname" value="小風(fēng)"/>
        </bean>

Spring框架的屬性注入

1. 對于類成員變量车吹,常用的注入方式有兩種
    * 構(gòu)造函數(shù)注入
    * 屬性setter方法注入

2. 在Spring框架中提供了前兩種的屬性注入的方式
    1. 構(gòu)造方法的注入方式筹裕,兩步
        * 編寫Java的類,提供構(gòu)造方法
            public class Car {
                private String name;
                private double money;
                public Car(String name, double money) {
                    this.name = name;
                    this.money = money;
                }
                @Override
                public String toString() {
                    return "Car [name=" + name + ", money=" + money + "]";
                }
            }
        
        * 編寫配置文件
            <bean id="car" class="com.itheima.demo4.Car">
                <constructor-arg name="name" value="大奔"/>
                <constructor-arg name="money" value="100"/>
            </bean>
    
    2. 屬性的setter方法的注入方式
        * 編寫Java的類礼搁,提供屬性和對應(yīng)的set方法即可
        * 編寫配置文件
    
    3. 如果Java類的屬性是另一個Java的類饶碘,那么需要怎么來注入值呢?
        * <property name="name" rel="具體的Bean的ID或者name的值"/>
        * 例如:
            <bean id="person" class="com.itheima.demo4.Person">
                <property name="pname" value="美美"/>
                <property name="car2" ref="car2"/>
            </bean>

Spring的2.5版本中提供了一種:p名稱空間的注入(了解)

1. 步驟一:需要先引入 p 名稱空間
    * 在schema的名稱空間中加入該行:xmlns:p="http://www.springframework.org/schema/p"

2. 步驟二:使用p名稱空間的語法
    * p:屬性名 = ""
    * p:屬性名-ref = ""

3. 步驟三:測試
    * <bean id="person" class="com.itheima.demo4.Person" p:pname="老王" p:car2-ref="car2"/>

Spring的3.0提供了一種:SpEL注入方式(了解)

1. SpEL:Spring Expression Language是Spring的表達式語言馒吴,有一些自己的語法
2. 語法
    * #{SpEL}

3. 例如如下的代碼
    <!-- SpEL的方式 -->
    <bean id="person" class="com.itheima.demo4.Person">
        <property name="pname" value="#{'小風(fēng)'}"/>
        <property name="car2" value="#{car2}"/>
    </bean>

4. 還支持調(diào)用類中的屬性或者方法
    * 定義類和方法扎运,例如
        public class CarInfo {
            public String getCarname(){
                return "奇瑞QQ";
            }
        }

數(shù)組,集合(List,Set,Map)饮戳,Properties等的注入

1. 如果是數(shù)組或者List集合豪治,注入配置文件的方式是一樣的
    <bean id="collectionBean" class="com.itheima.demo5.CollectionBean">
        <property name="arrs">
            <list>
                <value>美美</value>
                <value>小風(fēng)</value>
            </list>
        </property>
    </bean>

2. 如果是Set集合,注入的配置文件方式如下:
    <property name="sets">
        <set>
            <value>哈哈</value>
            <value>呵呵</value>
        </set>
    </property>

3. 如果是Map集合扯罐,注入的配置方式如下:
    <property name="map">
        <map>
            <entry key="老王2" value="38"/>
            <entry key="鳳姐" value="38"/>
            <entry key="如花" value="29"/>
        </map>
    </property>

4. 如果是properties屬性文件的方式负拟,注入的配置如下:
    <property name="pro">
        <props>
            <prop key="uname">root</prop>
            <prop key="pass">123</prop>
        </props>
    </property>

Spring框架的配置文件分開管理(了解)

1. 例如:在src的目錄下又多創(chuàng)建了一個配置文件,現(xiàn)在是兩個核心的配置文件歹河,那么加載這兩個配置文件的方式有兩種掩浙!
    * 主配置文件中包含其他的配置文件:
        <import resource="applicationContext2.xml"/>
    
    * 工廠創(chuàng)建的時候直接加載多個配置文件:
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                    "applicationContext.xml","applicationContext2.xml");

Spring框架整合WEB


Spring框架整合WEB(不是最終的方案)

1. 創(chuàng)建JavaWEB項目花吟,引入Spring的開發(fā)包。編寫具體的類和方法厨姚。
    * 環(huán)境搭建好后衅澈,啟動服務(wù)器來測試項目,發(fā)送每訪問一次都會加載一次配置文件谬墙,這樣效率會非常非常慢=癫肌!

2. 解決上面的問題
    * 將工廠創(chuàng)建好了以后放入到ServletContext域中.使用工廠的時候,從ServletContext中獲得.
        * ServletContextListener:用來監(jiān)聽ServletContext對象的創(chuàng)建和銷毀的監(jiān)聽器.
        * 當(dāng)ServletContext對象創(chuàng)建的時候:創(chuàng)建工廠 , 將工廠存入到ServletContext

3. Spring整合Web項目
    * 引入spring-web-4.2.4.RELEASE.jar包
    * 配置監(jiān)聽器
         <!-- 配置Spring的核心監(jiān)聽器: -->
         <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
         </listener>
         <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
         </context-param>

4. 修改servlet的代碼
    * 從ServletContext中獲得工廠
    * 具體代碼如下
        ServletContext servletContext = ServletActionContext.getServletContext();
        // 需要使用WEB的工廠的方式
        WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        CustomerService cs = (CustomerService) context.getBean("customerService");
        cs.save();  

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拭抬,一起剝皮案震驚了整個濱河市部默,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌造虎,老刑警劉巖傅蹂,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異算凿,居然都是意外死亡贬派,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門澎媒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搞乏,“玉大人,你說我怎么就攤上這事戒努∏攵兀” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵储玫,是天一觀的道長侍筛。 經(jīng)常有香客問我,道長撒穷,這世上最難降的妖魔是什么匣椰? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮端礼,結(jié)果婚禮上禽笑,老公的妹妹穿的比我還像新娘。我一直安慰自己蛤奥,他們只是感情好佳镜,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凡桥,像睡著了一般蟀伸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天啊掏,我揣著相機與錄音蠢络,去河邊找鬼。 笑死迟蜜,一個胖子當(dāng)著我的面吹牛谢肾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播小泉,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冕杠!你這毒婦竟也來了微姊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤分预,失蹤者是張志新(化名)和其女友劉穎兢交,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笼痹,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡配喳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了凳干。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晴裹。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖救赐,靈堂內(nèi)的尸體忽然破棺而出涧团,到底是詐尸還是另有隱情,我是刑警寧澤经磅,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布泌绣,位于F島的核電站,受9級特大地震影響预厌,放射性物質(zhì)發(fā)生泄漏阿迈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一轧叽、第九天 我趴在偏房一處隱蔽的房頂上張望苗沧。 院中可真熱鬧,春花似錦炭晒、人聲如沸崎页。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽飒焦。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牺荠,已是汗流浹背翁巍。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留休雌,地道東北人灶壶。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像杈曲,于是被迫代替她去往敵國和親驰凛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容