1. 程式人生 > >Spring--01(Spring初識)

Spring--01(Spring初識)

1.Spring

    Spring 的核心是控制反轉(IoC)和麵向切面(AOP)。簡單來說,Spring 是一個分層的 JavaSE/EEfull-stack(一站式) 輕量級開源框架。

  架構圖:

                                         

  

2.Spring的好處:

   1.方便解耦,簡化開發:Spring 就是一個大工廠,可以將所有物件建立和依賴關係維護,交給 Spring 管理

   2.AOP 程式設計的支援:Spring 提供面向切面程式設計,可以方便的實現對程式進行許可權攔截、執行監控等功能

   3.宣告式事務的支援:只需要通過配置就可以完成對事務的管理,而無需手動程式設計

   4.方便程式的測試:Spring 對 Junit4 支援,可以通過註解方便的測試 Spring 程式

   5.方便整合各種優秀框架:Spring 不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支援

   6.降低 JavaEE API 的使用難度:Spring 對 JavaEE 開發中非常難用的一些 API(JDBC、JavaMail、遠端呼叫等),都提供了封裝,使這些 API 應用難度大大降低

3.IOC 和 DI:

IOC :控制反轉,將物件的建立權交給了 Spring

DI :Dependency Injection 依賴注入.需要有 IOC 的環境,Spring 建立這個類的過程中,Spring 將類的依賴的屬性設定進去。

4.Spring快速體驗:

 引入容器的相關依賴,包括beans,context,core,spEL

package com.wx.springsource1.dao;
public interface UserDao {
    public void sayHello();
}

 實現UserDao介面:

package com.wx.springsource1.daoimp;
import com.wx.springsource1.dao.UserDao;
public class UserDaoImp implements UserDao {
    @Override
    public void sayHello() {
        System.out.println("hello");
    }
}

 上下文配置檔案:applicationContext.xml

<bean id="userDao" class="com.wx.springsource1.daoimp.UserDaoImp"/>

 測試建立例項:第一種方式,通過ApplicationContext類來建立。

 // 建立 Spring 的工廠類:
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 通過工廠解析 XML 獲取 Bean 的例項.
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        userDao.sayHello();

 

測試建立例項:第二種方式,通過BeanFactory工廠類來建立(過時)

 ClassPathResource resource = new ClassPathResource("applicationContext.xml");
        //spring最核心的類DefaultListableBeanFactory,主要功能是載入bean
        BeanFactory beanFactory = new DefaultListableBeanFactory();
        //spring最核心的第二個類XmlBeanDefinitionReader,主要功能是讀取配置的xml檔案
        XmlBeanDefinitionReader definitionReader = new XmlBeanDefinitionReader((BeanDefinitionRegistry) beanFactory);
        definitionReader.loadBeanDefinitions(resource);
        UserDao userDao = (UserDao) beanFactory.getBean("userDao");
        userDao.sayHello();

 

兩種建立方式有何區別:

   BeanFactory :是在 getBean 的時候才會生成類的例項.

  ApplicationContext :在載入 applicationContext.xml(容器啟動)時候就會建立

5.Spring 的相關配置解釋:

   1.id 屬性和 name 屬性標籤的配置

       id :Bean 起個名字. 在約束中採用 ID 的約束:唯一.必須以字母開始,可以使用字母、數字、連字元、下劃線、句話、冒號 id:不能出現特殊字元.<bean id=”bookAction”>

     name:Bean 起個名字. 沒有采用 ID 的約束. name:出現特殊字元.如果<bean>沒有 id 的話 , name 可以當做 id 使用.

  2.scope 屬性:Bean 的作用範圍 

   * singleton :預設值,單例的.

    * prototype :多例的

    * request :WEB 專案中,Spring 建立一個 Bean 的物件,將物件存入到 request 域中.

    * session :WEB 專案中,Spring 建立一個 Bean 的物件,將物件存入到 session 域中.

    * globalSession :WEB 專案中,應用在 Porlet 環境.如果沒有 Porlet 環境那麼 globalSession 相當於 session.

  3.Bean 的生命週期的配置:

通過配置<bean>標籤上的 init-method 作為 Bean 的初始化的時候執行的方法,配置 destroy-method作為 Bean 的銷燬的時候執行的方法。銷燬方法想要執行,需要是單例建立的 Bean 而且在工廠關閉的時候,Bean 才會被銷燬  

  4.Spring 生成 Bean 的時候三種方式:

      無引數的構造方法的方式:

<bean id="bean1" class="cn.itcast.spring.demo3.Bean1"></bean>

     靜態工廠例項化 Bean:

<bean id="bean2" class="cn.itcast.spring.demo3.Bean2Factory" factory-method="getBean2"/>

    例項工廠例項化的方式:

<bean id="bean3Factory" class="cn.itcast.spring.demo3.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>

 5.Spring 的 Bean 的屬性注入:

   set 方法的方式注入屬性:

bean id="car2" class="cn.itcast.spring.demo4.Car2">
<property name="name" value="奇瑞 QQ"/>
<property name="price" value="40000"/>
</bean>

  構造方法的方式注入屬性:

<bean id="car" class="cn.itcast.spring.demo4.Car">
<constructor-arg name="name" value="保時捷"/>
<constructor-arg name="price" value="1000000"/>
</bean>

6.Spring 的屬性注入:物件型別的注入:

<bean id="person" class="cn.itcast.spring.demo4.Person">
<property name="name" value="張三"/>
<!-- ref 屬性:引用另一個 bean 的 id 或 name -->
<property name="car2" ref="car2"/>
</bean>

 7.SpEL 的方式的屬性注入:Spring3.x 版本後提供的方式

SpEL:Spring Expression Language.
語法:#{ SpEL }
<!-- SpEL 的注入的方式 -->
<bean id="car2" class="cn.itcast.spring.demo4.Car2">
<property name="name" value="#{'賓士'}"/>
<property name="price" value="#{800000}"/>
</bean>
引用了另一個類的屬性
<bean id="car2" class="cn.itcast.spring.demo4.Car2">
<!-- <property name="name" value="#{'賓士'}"/> -->
<property name="name" value="#{carInfo.carName}"/>
<property name="price" value="#{carInfo.calculatePrice()}"/>
</bean>

  8.注入複雜型別:

<bean id="collectionBean" class="cn.itcast.spring.demo5.CollectionBean">
     <!-- 陣列型別的屬性 -->
     <property name="arrs">
        <list>
           <value>張三</value>
           <value>李四</value>
           <value>王五</value>
        </list>
     </property>
     <!-- 注入 List 集合的資料 -->
     <property name="list">
        <list>
          <value>芙蓉</value>
          <value>如花</value>
          <value>鳳姐</value>
       </list>
     </property>
     <!-- 注入 Map 集合 -->
     <property name="map">
       <map>
          <entry key="aaa" value="111"/>
          <entry key="bbb" value="222"/>
          <entry key="ccc" value="333"/>
       </map>
     </property>
     <!-- Properties 的注入 -->
     <property name="properties">
       <props>
          <prop key="username">root</prop>
          <prop key="password">123</prop>
          </props>
     </property>

  9.7 Spring 的分配置檔案的開發

一種:建立工廠的時候載入多個配置檔案:
ApplicationContext applicationContext = new 
ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");

二種(推薦):在一個配置檔案中包含另一個配置檔案:
<import resource="applicationContext2.xml"></import>