01_Spring_快速入門

一. Spring概述

1.1 什么是Spring

Spring是一個開源框架,Spring是于2003 年興起的一個輕量級的Java 開發(fā)框架,由Rod Johnson創(chuàng)建。簡單來說,Spring是一個分層的JavaSE/EE (一棧式) 輕量級開源框架。

  • JEE分層
    • 表現(xiàn)層(頁面數(shù)據(jù)顯示、頁面跳轉(zhuǎn)調(diào)度)jsp/servlet
    • 業(yè)務(wù)層(業(yè)務(wù)處理和功能邏輯、事務(wù)控制)-service
    • 持久層(數(shù)據(jù)存取和封裝、和數(shù)據(jù)庫打交道)dao
  • 一站式

    Spring提供了JavaEE各層的解決方案:
        表現(xiàn)層:Spring MVC,持久層:JdbcTemplate、ORM框架整合,業(yè)務(wù)層:IoC、AOP、事務(wù)控制。
  • 輕量級:Spring的出現(xiàn)取代了EJB的臃腫、低效、繁瑣復(fù)雜、脫離現(xiàn)實。

1.2 Spring的核心

IoC(Inverse of Control 反轉(zhuǎn)控制): 將對象創(chuàng)建權(quán)利交給Spring工廠進行管理。

AOP(Aspect Oriented Programming 面向切面編程),基于動態(tài)代理的功能增強方式。

1.3 Spring的優(yōu)點

  • 方便解耦,簡化開發(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)用難度大大降低

關(guān)于框架的特性,我們也會俗稱Spring為開發(fā)架構(gòu)的粘合劑。

二. Spring框架的快速入門

2.1 搭建環(huán)境

  1. 下載開發(fā)包,導(dǎo)jar包
    
    下載網(wǎng)址:http://repo.spring.io/libs-release-local/org/springframework/spring/

    開發(fā)包目錄結(jié)構(gòu):
        docs : api文檔和開發(fā)規(guī)范
        libs : 開發(fā)需要的jar包(源碼)
        schema : 開發(fā)需要的約束schema
    -----------------------------------------------------------------------------

    1. 新建web項目
    2. Spring項目的核心容器最基本的jar包(4個):
        1. Beans  2. Core  3. Context  4.Expression Language
    3. Spring框架需要的日志包(2個,依賴庫中找)
        1. apache commons-logging(JCL)日志框架  
        2. log4j的日志實現(xiàn)
        3. log4j的配置文件 log4j.properties
    
    

2.2 業(yè)務(wù)代碼

模擬用戶保存。

img01.png

    傳統(tǒng)寫法 :

    UserServiceImpl : 
        // 模擬用戶注冊
        public void save() {
            // 傳統(tǒng)方式
            System.out.println("業(yè)務(wù)層........UserServiceImpl用戶注冊...");
            UserDAO dao = new UserDAOImpl();
            userDAO.save();
        }


    UserDAO : 
        //模擬用戶注冊
        public void save() {
            System.out.println("持久層.......UserDAOImpl用戶注冊...");
        }

    web層(這里是測試test):
        @Test
        public void test() {
            UserService service = new UserServiceImpl();
            service.save();
        }

    傳統(tǒng)的方式代碼過于耦合,上層代碼過于依賴下層代碼,如果業(yè)務(wù)有改動,要改變DAO的實現(xiàn)類時,需要改動代碼:
    UserDAO userDAO = new UserDaoImpl();因此需要采取方式進行解耦合。

    解決方案:采用IoC(Inverse of Control)控制反轉(zhuǎn)的思想進行解耦合.

    簡單的說就是引入工廠(第三者),將原來在程序中手動創(chuàng)建管理的依賴的UserDAO對象,交給工廠來創(chuàng)建管理。
    在Spring框架中,這個工廠就是Spring中的工廠,因此,也可以說,將創(chuàng)建管理UserDAO對象的控制權(quán)被反轉(zhuǎn)給了Spring框架了。

    -----------------------------------------------------------------------------

    概念:IoC中文翻譯為控制反轉(zhuǎn),指以前程序自己創(chuàng)建對象,現(xiàn)在將創(chuàng)建對象的控制權(quán)交給了第三方(Spring)了。

    IoC底層實現(xiàn):工廠(設(shè)計模式)+反射(機制) + 配置文件(xml)。

    IoC是一種思想,控制反轉(zhuǎn)的思想、解耦合的思想。
    Spring的IoC是該思想的一種實現(xiàn)。因此Spring容器也通常稱之為IoC容器。

img02.png

2.3 IoC控制反轉(zhuǎn)的實現(xiàn)

傳統(tǒng)是自己創(chuàng)建對象,現(xiàn)在將創(chuàng)建對象交給Spring容器,我們獲取就行了.

這種方式,即使更換實現(xiàn)類,也只需要修改配置文件中的實現(xiàn)類的路徑。

2.3.1 Spring的核心配置文件編寫applicationContext.xml

1. 習(xí)慣上: 在src建立applicationContext.xml (位置:src目錄或者 WEB-INF目錄)

2. 引入xml的頭部信息bean schema約束,可以參考規(guī)范文檔中的的xsd-config.html
    <?xml version="1.0" encoding="UTF-8"?>
    
    <!-- 導(dǎo)入Spring的DTD約束 -->
    <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">
            
        <bean id="userDAO" class="com.itdream.spring.dao.UserDAOImpl"/>
        <bean id="userService" class="com.itdream.spring.service.UserServiceImpl">
            <property name="userDAO" ref="userDAO"/>
        </bean>        
    </beans>

3.  配置實現(xiàn)類的映射bean
    <bean id="userDAO" class="com.itdream.spring.dao.UserDAOImpl"/>

2.3.2 通過Spring的工廠獲取Bean完成相關(guān)操作

  1. 讀取配置文件,獲取Spring的Bean工廠

  2. 通過Spring的Bean工廠獲取對象

     // Spring解耦合,使用配置文件:創(chuàng)建工廠+反射創(chuàng)建UserDAO對象
     // 加載配置文件,獲取工廠對象
     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
     // 實例化對象
     UserDAO dao = (UserDAO) applicationContext.getBean("userDAO");
     userDAO.save();
    

2.4 DI依賴注入的實現(xiàn)

DI:Dependency Injection 依賴注入,在Spring框架負責(zé)創(chuàng)建Bean對象時,動態(tài)的將依賴對象注入到Bean組件(簡單的說,可以將另外一個bean對象動態(tài)的注入到另外一個bean中。)

耦合代碼變成依賴注入代碼的方法:

img03.png

即:Spring創(chuàng)建了Service、DAO對象,在配置中將DAO傳入Servcie,那么Service對象就包含了DAO對象的引用。

在Service對象創(chuàng)建調(diào)用時,也會產(chǎn)生一個DAO對象,并通過Service內(nèi)提供的setter方法將該對象的引用注入進去。

applicationContext.xml核心配置文件:
    <!-- 配置userDAO的創(chuàng)建映射,Spring框架通過這個映射來new對象 -->
    <bean id="userDAO" class="com.itdream.spring.dao.UserDAOImpl"/>
    
    <!-- 配置userService的創(chuàng)建映射,Spring通過該映射創(chuàng)建Service對象 -->
    <bean id="userService" class="com.itdream.spring.service.UserServiceImpl">
        <!-- property:屬性注入
            name : setter方法的名字,例如setUserDAO-userDAO。
            //注入時,Spring會自動調(diào)用setter方法,將創(chuàng)建出來的對象放入到該方法中完成注入
            ref : 創(chuàng)建該對象的引用,寫入被Spring管理的bean的name屬性
         -->
        <property name="userDAO" ref="userDAO"/>
    </bean> 


Service層:
    聲明注入的對象,提供setter方法
        private UserDAO userDAO;
        
        //提供setter方法Spring方法進行動態(tài)注入userDAO
        public void setUserDAO(UserDAO userDAO) {
            this.userDAO = userDAO;
        }
        
        @Override
        // 模擬用戶注冊
        public void save() {
            //Spring框架創(chuàng)建了userDAO對象并注入進來,因此不會是空
            userDAO.save();
        }

web層:
    //加載配置,獲取Spring工廠(容器)
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    //獲取bean對象
    UserService userService = (UserService) applicationContext.getBean("userService");
    //調(diào)用業(yè)務(wù)邏輯
    userService.save();

img04.png

小結(jié):

IoC:是一個大的思想,將某件事情(對象創(chuàng)建權(quán)利等)的控制前交給第三方管理。
DI:還是IoC的思想,將對象依賴注入權(quán)利交給第三方管理。

2.5 Spring的工廠

ApplicationContext用來加載Spring框架的配置文件,來構(gòu)建Spring對象的工廠對象,它被稱為Spring框架的上下文,
也被稱為Spring的容器。

ApplicationContext是BeanFactory(Bean工廠,Bean就是一個java對象)的一個子接口。

為什么不直接使用頂層接口對象來操作呢?
因為ApplicationContext是對BeanFactory的擴展,它的功能更強。
    * 國際化處理
    * 事件傳遞
    * Bean的自動裝配
    * 不同應(yīng)用層的Context的實現(xiàn)

2.5.1 獲取Spring工廠的兩種方式

src:開發(fā)的時候,工程里的一個目錄,存放的文件,會在編譯發(fā)布后,放入classes下

img05.png
  • 如果applicationContext.xml 在 src下, ClassPathXmlApplication讀取
  • 如果applicationContext.xml 在WEB-INF下,F(xiàn)ileSystemXmlApplicationContext讀取

三. IoC容器裝配Bean_基于XML配置方式

3.1 實例化Bean的四種方式(了解)

  • 無參構(gòu)造/帶參構(gòu)造方式
  • 靜態(tài)工廠方式
  • 實例工廠方式
  • FactoryBean方式

    1. 無參構(gòu)造/帶參構(gòu)造方式:
    public class Bean1 {
        //無參構(gòu)造
        public Bean1() {
            System.out.println("Bean1被創(chuàng)建了............無參構(gòu)造");
        }
    }

    public class Bean2 {
    
        private Integer id;
        private String name;
        
        //提供帶參構(gòu)造
        public Bean2(Integer id, String name) {
            System.out.println("Bean2被創(chuàng)建了..........帶參構(gòu)造");
            this.id = id;
            this.name = name;
        }
    }


    配置文件applicationContext.xml:
        <!-- 無參構(gòu)造實例化Bean -->
        <bean id="bean1" class="com.itdream.spring.newBean.Bean1"/>
        
        <!-- 帶參構(gòu)造實例化Bean -->
        <bean id="bean2" class="com.itdream.spring.newBean.Bean2">
            <constructor-arg name="id" value="1"/>
            <constructor-arg name="name" value="唐嫣"/>
        </bean>
    
img06.png

2. 靜態(tài)工廠方式 : 通過靜態(tài)工廠的靜態(tài)方法創(chuàng)建bean對象

要被反轉(zhuǎn)控制的Bean類:
    public class Bean3 {
        public Bean3() {
                System.out.println("Bean3被創(chuàng)建了.....靜態(tài)工廠方式");
            }
        }
靜態(tài)工廠類提供靜態(tài)方法:
    public class StaticBean3Factory {
    
        public static Bean3 getBean3() {
            //在實例化時,可以進行其它操作,例如邏輯判斷等
            return new Bean3();
        }
    }   

配置文件:
    <!-- 靜態(tài)工廠方式實例化Bean -->
    <bean id="bean3" class="com.itdream.spring.newBean.StaticBean3Factory" factory-method="getBean3"/>

3. 實例化工廠方式:

要被反轉(zhuǎn)控制的Bean類:
    public class Bean4 {
        public Bean4() {
            System.out.println("Bean4被創(chuàng)建了.......實例化工廠方式");
        }
    }

實例化工廠類提供創(chuàng)建Bean的方法:
    public class Bean4Factory {
        // 實例化工廠方式創(chuàng)建Bean對象
        public Bean4 initBean() {
            // 可以在new Bean4之前進行很多的邏輯判斷
            // 例如判斷new哪一個對象
            return new Bean4();
        }
    }

配置文件:
    <!-- 實例化工廠方式實例化Bean -->
    <!-- 先實例化工廠,再通過實例化的工廠調(diào)用方法創(chuàng)建對象 -->
    <bean id="bean4Factory" class="com.itdream.spring.newBean.Bean4Factory"/>
    <bean id="bean4" factory-bean="bean4Factory" factory-method="initBean"/>

4. FactoryBean方式:
    實現(xiàn)接口,實現(xiàn)getObject方法,返回要創(chuàng)建的Bean類.Spring檢查到實現(xiàn)了FactoryBean接口時,會在實例化
    FactoryBean時自動調(diào)用getObject方法獲取Bean對象。

    public class FactoryBean5 implements FactoryBean<Bean5> {
    
        @Override
        public Bean5 getObject() throws Exception {
            return new Bean5();
        }


    <!-- FactoryBean方式實例化Bean -->
    <bean id="beanFactory5" class="com.itdream.spring.newBean.FactoryBean5"/>

小結(jié):
四種方式:
第一種最常用,第二、三、一些框架初始化的時候用的多、第四種spring底層用的多。


    <!-- 實例化Bean的四種方式 -->
    <!-- 無參構(gòu)造實例化Bean -->
    <bean id="bean1" class="com.itdream.spring.newBean.Bean1"/>
    
    <!-- 帶參構(gòu)造實例化Bean -->
    <bean id="bean2" class="com.itdream.spring.newBean.Bean2">
        <constructor-arg name="id" value="1"/>
        <constructor-arg name="name" value="唐嫣"/>
    </bean>
    
    <!-- 靜態(tài)工廠方式實例化Bean -->
    <bean id="bean3" class="com.itdream.spring.newBean.StaticBean3Factory" factory-method="getBean3"/>
    <!-- 實例化工廠方式實例化Bean -->
    <!-- 先實例化工廠,再通過實例化的工廠調(diào)用方法創(chuàng)建對象 -->
    <bean id="bean4Factory" class="com.itdream.spring.newBean.Bean4Factory"/>
    <bean id="bean4" factory-bean="bean4Factory" factory-method="initBean"/>
    
    <!-- FactoryBean方式實例化Bean -->
    <bean id="beanFactory5" class="com.itdream.spring.newBean.FactoryBean5"/>

    ---------------------------------------------------------------------------

    BeanFactory和FactoryBean的區(qū)別?
 
    BeanFactory(ApplicationContext):
        是一個工廠(其實是構(gòu)建了一個spring上下文的環(huán)境,容器),用來管理和獲取很多Bean對象.
    FactoryBean:
        是一個Bean生成工具,是用來獲取一種類型對象的Bean,它是構(gòu)造Bean實例的一種方式。

3.2 Bean的作用域

img07.png

項目開發(fā)中通常會使用:singleton 單例、 prototype多例 。

Singleton: 在一個spring容器中,對象只有一個實例。(默認值)

Prototype: 在一個spring容器中,存在多個實例,每次getBean 返回一個新的實例。

單例是默認值,如果需要單例對象,則不需要配置scope。
img08.png

3.3 在xml配置Bean的初始化和銷毀方法(了解)

  • 說明: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的效果,有如下條件
        1. 單例(singleton)的bean才可以手動銷毀。
        2. web容器中會自動調(diào)用,但是main函數(shù)或測試用例需要手動調(diào)用(需要使用ClassPathXmlApplicationContext的close()方法)


    public class LifeCycleBean {
        public LifeCycleBean() {
            System.out.println("實例化................");
        }
        
        public void init() {
            System.out.println("初始化...............");
        }
        
        public void destroy() {
            System.out.println("銷毀................");
        }
    }

    配置文件:
    <!-- 生命周期測試 -->
    <bean id="lifeCycle" class="com.itdream.spring.lifecycle.LifeCycleBean" init-method="init" destroy-method="destroy"/>
    

測試:

img09.png

3.4 Bean的屬性依賴注入

3.4.1 屬性依賴注入的三種方式

  • 構(gòu)造器參數(shù)注入
  • setter方法屬性注入
  • 接口注入(了解)

Spring 框架規(guī)范中通過配置文件配置的方式,只支持構(gòu)造器參數(shù)注入和setter方法屬性注入,不支持接口注入 !

3.4.2 構(gòu)造器參數(shù)注入constructor-arg

當(dāng)Spring初始化Car時,如果發(fā)現(xiàn)有constructor-arg標(biāo)簽,會自動調(diào)用帶參構(gòu)造,而不會使用無參構(gòu)造。

constructor-arg的屬性:

  • name : 根據(jù)屬性名稱定位屬性
  • index : 根據(jù)索引定位屬性
  • type : 根據(jù)屬性的類型定位屬性
  • ================================
  • value : 簡單值,數(shù)字,字符串,其他對象等等
  • ref : 復(fù)雜的對象(就是指bean),值:bean的引用名字

    Bean類:

    public class Car {
        private Integer id;
        private String name;
        private Double price;
    
        // 必須提供帶參構(gòu)造,用于屬性注入
        public Car(Integer id, String name, Double price) {
            super();
            this.id = id;
            this.name = name;
            this.price = price;
        }
    
        @Override
        public String toString() {
            return "Car [id=" + id + ", name=" + name + ", price=" + price + "]";
        }
    }


    配置文件applicationContext.xml:

    <!-- 帶參構(gòu)造屬性注入 -->
    <bean id="car" class="com.itdream.spring.di.Car">
        <constructor-arg index="0" value="1"/>
        <constructor-arg name="name" value="寶馬"/>
        <constructor-arg type="java.lang.Double" value="999999D"/>
    </bean> 

    測試:
    @Test
    public void test() {
        // 加載配置文件,獲取Spring工廠
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        //獲取Bean對象
        Car car = (Car) applicationContext.getBean("car");
        System.out.println(car);
    }

    結(jié)果:
        Car [id=1, name=寶馬, price=999999.0]

補充:

1. 定位屬性的標(biāo)簽,可以混用
    即:<constructor-arg index="0" name="name" type="java.lang.Double"/>

2. 自標(biāo)簽的屬性賦值問題,可以使用子標(biāo)簽的value,效果和value屬性一樣
    如:
    <constructor-arg name="name">
        <value>寶馬</value>
    </constructor-arg>

3.4.3.setter方法屬性注入 property【推薦】

使用的默認的構(gòu)造器(new Bean()),但必須提供屬性的setter方法。

Spring創(chuàng)建出Bean對象,再通過setter方法屬性注入值。

兩步:在類中加入setter方法,在配置文件中使用property

    
    Bean類:

    public class Person {
    
        private Integer pid;
        private String name;
        private Car car;
        
        //必須提供setter方法,用于屬性注入
        public void setPid(Integer pid) {
            this.pid = pid;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setCar(Car car) {
            this.car = car;
        }
    
        @Override
        public String toString() {
            return "Person [pid=" + pid + ", name=" + name + ", car=" + car + "]";
        }
    }

    配置文件applicationContext.xml:

        <!-- 帶參構(gòu)造屬性注入 -->
        <bean id="car" class="com.itdream.spring.di.Car">
            <constructor-arg index="0" value="1" />
            <constructor-arg name="name" value="寶馬" />
            <constructor-arg type="java.lang.Double" value="999999" />
        </bean>

        <!-- setter方法屬性注入 -->
        <bean id="person" class="com.itdream.spring.di.Person ">
            <property name="pid" value="1" />
            <property name="name" value="jack" />
            <property name="car" ref="car"/>
        </bean> 

    測試:

        @Test
        public void test() {
            // 加載配置文件,獲取Spring工廠
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
            
            //獲取Bean對象
            //將創(chuàng)建對象與屬性注入的權(quán)利交給Spring,我們直接從容器拿到這個對象就可以了(已經(jīng)包含了屬性的值)
            Person person = (Person) applicationContext.getBean("person");
            System.out.println(person);
        }

    結(jié)果:
        Person [pid=1, name=jack, car=Car [id=1, name=寶馬, price=999999.0]]

setter方法屬性注入的屬性:

property : 用于setter方式進行屬性注入的標(biāo)簽
name : 與Bean類中的setter方法對應(yīng).例如setCar --- name就是car.
value : 簡單值.
ref : 復(fù)雜值。要注入的Bean對象的id/name名字

3.4.4.p名稱空間的使用(了解)

什么是名稱空間? 
作用:Schema區(qū)分同名元素。(有點類似于java的包)

xmlns="http://www.springframework.org/schema/beans"
Xmlns沒有前綴是默認的名稱空間.

p名稱空間的作用是為了簡化setter方法屬性依賴注入配置的,它不是真正的名稱空間。

它的使用方法:
    p:<屬性名>="" 引入常量值
    p:<屬性名>-ref =""引入其他Bean對象


具體使用步驟:
    1. 引入p名稱空間
    <beans xmlns="http://www.springframework.org/schema/beans"

        //在這里引入p名稱空間(默認名稱空間后,在xmlns后添加:p , 將最后的beans改成p。)
       xmlns:p="http://www.springframework.org/schema/p"

       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">

    2. 將<property> 子元素 簡化為 元素的屬性 (以上面的person為例)
    <!-- P名稱空間簡化setter方法屬性注入 -->
    <bean id="person" class="com.itdream.spring.di.Person" p:pid="2" p:name="coco" p:car-ref="car"/>

    結(jié)果:
    Person [pid=2, name=coco, car=Car [id=1, name=寶馬, price=999999.0]]

    配置時不需要<property > 子元素,簡化了配置 .

3.4.5 spEL表達式的使用 –會使用

spEL(Spring Expression Language)是一種表達式語言,它是spring3.x版本的新特性。

作用:支持在運行時操作和查詢對象,其語法類似統(tǒng)一的EL語言,但是SpEL提供了額外的功能,功能更強大。

img11.png

語法: #{…} , 引用另一個Bean 、屬性、 方法

  • #{bean_id}引用Bean(具體對象)
  • #{bean_id.屬性}引用Bean的屬性
  • #{bean_id.方法(參數(shù))}引用Bean的方法

    例1:

    //修改了p:pid的值為#{2*3},修改p:name為#{car.name},car是創(chuàng)建car對象的id。
        car.name相當(dāng)于調(diào)用了它的getName()方法,因此Car的Bean類中必須提供getName方法。
    <bean id="person" class="com.itdream.spring.di.Person" p:pid="#{2*3}" p:name="#{car.name}" p:car-ref="car"/>

    測試結(jié)果:
    Person [pid=6, name=寶馬, car=Car [id=1, name=寶馬, price=999999.0]]    


    例2:
    //修改了p:pid的值為#{car.id},修改p:name為#{car.name},car是創(chuàng)建car對象的id。
        car.id相當(dāng)于調(diào)用了它的getId()方法,因此Car的Bean類中必須提供getId方法。
    <bean id="person" class="com.itdream.spring.di.Person" p:pid="#{car.id}" p:name="#{'bmw'.toUpperCase()}" p:car-ref="car"/>

    測試結(jié)果:
    Person [pid=1, name=BMW, car=Car [id=1, name=寶馬, price=999999.0]]

3.4.6.集合類型屬性注入 (了解-使用時查看即可)

作用:主要用于框架整合配置。

Spring為集合提供了對應(yīng)的標(biāo)簽:
    <list> 注入 list元素
    <set> 注入 set元素
    <map> 注入 map元素
    <props> 注入 properties 元素 (hashtable類的子類,是特殊的map,key和value都是String )

    
    Bean類:提供四種集合,List,Map,Set,Properties,使用setter方式進行屬性注入:

    public class CollectionBean {
    
        private List<Integer> list;
        private Set<String> set;
        private Map<String, String> map;
        private Properties properties;
    
        // 提供setter方式,供Spring框架屬性注入
        public void setList(List<Integer> list) {
            this.list = list;
        }
    
        public void setSet(Set<String> set) {
            this.set = set;
        }
    
        public void setMap(Map<String, String> map) {
            this.map = map;
        }
    
        public void setProperties(Properties properties) {
            this.properties = properties;
        }
    
        @Override
        public String toString() {
            return "CollectionBean [list=" + list + ", set=" + set + ", map=" + map + ", properties=" + properties + "]";
        }
    }
    ======================================================================================

    applicationContext.xml :

        value注入簡單類型。   ref注入復(fù)雜類型。

        <bean id="collectionBean" class="com.itdream.spring.collection.CollectionBean">
        <property name="list">
            <list>
                <value>1</value>
                <value>2</value>
                <value>3</value>
                <value>4</value>
             </list>
        </property>
        
        <property name="set">
            <set>
                <value>aa</value>
                <value>bb</value>
                <value>cc</value>
                <value>dd</value>
            </set>
        </property>
        
        <property name="map">
            <map>
                <entry key="羅貫中" value="三國演義"/>
                <entry key="施耐庵" value="水滸傳"/>
                <entry key="曹雪芹" value="紅樓夢"/>
                <entry key="吳承恩" value="西游記"/>
            </map>
        </property>
        
        <property name="properties">
            <props>
                <prop key="霍建華">林心如</prop>
                <prop key="吳奇隆">李詩詩</prop>
            </props>
        </property>
    </bean>

    測試:
        // 加載配置文件,獲取Spring工廠
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        //獲取Bean對象
        CollectionBean collectionBean = (CollectionBean) applicationContext.getBean("collectionBean");
        System.out.println(collectionBean);

    結(jié)果:
    CollectionBean [list=[1, 2, 3, 4], set=[aa, bb, cc, dd], map={羅貫中=三國演義, 施耐庵=水滸傳, 曹雪芹=紅樓夢, 吳承恩=西游記}, properties={霍建華=林心如, 吳奇隆=李詩詩}]

3.5.配置文件分開管理(了解)

在開發(fā)中,所有的bean不可能只寫在一個配置文件中,如果在src的目錄下又多創(chuàng)建了一個配置文件,現(xiàn)在是兩個核心的配置文件,那么加載這兩個配置文件的方式有兩種:

  • 主配置文件中包含其他的配置文件:【推薦】

      在applicationContext.xml中:
      <import resource="applicationContext2.xml"/>
    
  • 工廠創(chuàng)建的時候直接加載多個配置文件:

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                "applicationContext.xml","applicationContext2.xml");
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,641評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,279評論 6 342
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,504評論 2 7
  • 什么是Spring Spring是一個開源的Java EE開發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,779評論 1 133
  • 心臟公司的野心不言而喻,如果他們停擺,那么大腦也會失去給養(yǎng)停止運作。細枝末節(jié)爬蟲們的盛會一定預(yù)示著什么,不只是場沒...
    賤金屬閱讀 376評論 0 0

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