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>