一,Spring的概念 (4.x版本)
1,spring是一個開源的輕量級框架(免費,源碼公開,不需要依賴過多其它工具)
2,spring核心的兩部分:
(1),aop : 面向切面編程-----------擴展功能 不是修改源代碼來實現
(2),ioc : 控制反轉---------創建類對象,不是通過new來實現,而是通過spring配置來創建
3,spring是一站式框架
spring在javaee三層結構中,每一層都提供不同的解決技術
-----Web層 : springMVC
-----Service層: spring的ioc
-----Dao層: spring的jdbcTemplate
二,Spring的IOC介紹
1,作用: 將對象的創建交給spring進行管理
2,ioc操作的兩部分:
(1), 配置文件方式
(2), 註解方式
三,IOC底層原理
1,底層技術
(1), xml配置文件
(2), dom4j解析
(3), 工廠設計模式
(4), 反射
2,對比分析(以及ioc的底層實現原理)
核心:解決耦合度過高的問題,符合高內聚,低耦合的思想
傳統方案: new對象,一改全改
改良方案:(工廠設計模式): 通過工廠模式獲得類對象,工廠與業務類建立了新的耦合
現代方案: ioc(修改類名,包名時,修改相應的xml配置文件就行)
第一步: 創建xml配置文件,配置要創建的對象類
<bean id="UserService" class="com.zhuo.service.UserService">
第二步: 創建工廠類,使用dom4j解析xml文件+反射,獲得類對象
public class Factory{ public static UserService getUserService(){ //dom4j解析,通過id值獲得class值 String classvalue = "class屬性值" //使用反射獲得字節碼文件 Class claz = Class.forName(classvalue); //創建類對象 UserService us = claz.newInstance(); return us; } }
四,IOC入門案例
1,導jar包(基本包,日誌包)
2,創建類
3,創建xml配置文件(引入xml約束,在文檔中找)
4,使用spring內置對象和方法創建類對象
//獲得文件路徑
ApplicationContext context = new ClassPathXmlApplicationContext("");
//創建類對象
User user = (User)context.getBean("id");
5,解決配置文件沒有提示的問題
五,spring的bean管理(xml配置文件)
(1)實例化的三種方式
I,調用無參構造函數
<bean id="user" class="com.zhuo.domain.User"></bean>
II,靜態工廠
<bean id="user" class="com.zhuo.factory.Factory" factory-method="getUser"></bean>
III,實例工廠
<bean id="factory" class="com.zhuo.factory.Factory"></bean> <bean id="user" factory-bean="factory" factory-method="getUser"></bean>
(2)Bean標籤的常用屬性
id , class , name ,scope
-----scope屬性:設置bean的作用範圍
singleton 默認,單例
prototype 多例的
(3)三種屬性注入方式
I,set方法
II,有參構造函數注入
<bean id="demo" class="com.zhuo.user.User"> <constuctor-arg name="name" value="小王"></constuctor-arg> </bean>
III,接口注入
<bean id="demo" class="com.zhuo.user.User"> <property name="name" value="小王"></property> </bean>
(4)注入對象類型屬性(重點掌握)
案例:在UserService中注入UserDao對象 //在UserService類中定義一個UserDao類型的私有變量 //創建相應的get方法 //在xml文件中進行注入配置 <bean id="UserDao" class="com.zhuo.dao.UserDao"></bean> <bean id="UserService" class="com.zhuo.service.UserService"> <property name="userdao" ref="UserDao"></property> </bean>
(5)P名稱空間注入(會用就行)
(6)注入複雜類型的屬性
數組,列表,map,properties
<bean id = "person" class="com.zhuo.domain.Person">
//數組
<property name="args">
<list>
<value>小王</value>
<value>小馬</value>
</list>
</property>
//列表
<property name="list">
<list>
<value>小王</value>
<value>小馬</value>
</list>
</property>
//map
<property name="map">
<map>
<entry key="a" value="1"></entry>
<entry key="b" value="2"></entry>
</map>
</property>
//properties
<property name="properties">
<props>
<prop key="a">123</prop>
<prop key="b">456</prop>
</map>
</property>
</bean>
(7)IOC和DI的區別
IOC:控制反轉,把對象的創建交給spring來管理
DI:依賴注入,向類裏面的屬性設置值
關係:DI不能淡出存在,要在IOC的基礎上完成
六,Spring整合web項目原理
1,加載spring核心配置文件,每次new,實現功能,性能很低
ApplicationContext context = new ClassPathXmlApplicationContext("abc.xml");
2,解決思想:把加載配置文件,創建對象過程,在服務器啓動時完成,把壓力交給服務器
3,實現原理:
I,ServletContext對象
II,監聽器
III,具體流程:
在服務器啓動時,會創建唯一一個ServletContext對象,通過監聽器可以知道這個對象具體在什麼時候創建
此時可以完成配置文件的加載和對象的創建,並加載到ServletContext這個域對象中
之後從域對象中獲取對象