Spring學習隨筆
Spring中IOC的理解
1、什麼是IOC?
(1)控制反轉。把物件建立和物件間的呼叫過程交給Spring進行管理。
(2)使用IOC的目的:為了耦合度降低。
2、IOC底層原理?
(1)xml解析、工廠模式、反射
(2)圖解
原始呼叫方式(耦合度太高,dao如果變了service也要跟著變):
引入工廠模式解除上面兩個類的耦合度(但是工廠和service出現了新的耦合):
IOC解耦過程(進一步降低耦合度)
第一步:xml配置檔案,配置建立的物件,示例:<bean id="aaa" class="xxx.dao"></bean>
第二步:有service和dao類,建立工廠類,示例:
IOC介面
- IOC思想基於IOC容器完成,IOC容器底層就是物件工廠
- Spring提供IOC容器實現兩種方式:(兩個介面)
- BeanFactory:最基本介面,供內部人員使用。載入配置檔案時不會去建立物件,在獲取物件或者使用物件時才去建立物件。(.getBean方法時)
- ApplicationContext:BeanFactory介面的一個子介面。提供了更多功能,一般由開發人員使用。載入配置檔案時就會把在配置檔案中物件進行建立。
3.ApplicationContext的主要實現類(File那個類是盤裡全路徑,Class那個是類路徑位置):
IOC操作:Bean管理
1、什麼是Bean管理(2個操作)
(1)Spring建立物件
(2)Spring注入屬性
2、Bean管理操作有兩種方式
(1)基於xml配置檔案方式實現
(2)基於註解方式實現
IOC操作Bean管理(基於xml方式)
1、基於xml建立物件
<bean id="aaa" class="xxx.dao"></bean>
bean中常用屬性:
id:唯一標識
class:類全路徑
建立物件時,預設執行無參構造,完成物件建立。
2、基於xml注入屬性
(1)DI:依賴注入,注入屬性,是IOC一種實現
第一種注入方式:使用set方法進行注入
建立一個類,建立其對應set方法;
在Spring配置檔案中配置物件建立,配置屬性注入,示例如下:
<bean id="book" class="org.zhaojianhui.Spring.Book">
<property name="name" value="我的世界"/>
<property name="price" value="15.0"/>
</bean>
第二種注入方式:使用有參構造進行注入
建立一個類,定義屬性以及有參構造
//有參構造注入
public Book(String name, String price) {
this.name = name;
this.price = price;
}
Spring配置檔案中編寫:
<bean id="book" class="org.zhaojianhui.Spring.Book">
<constructor-arg name="name" value="我的愛人"></constructor-arg>
<constructor-arg name="price" value="16.0"></constructor-arg>
</bean>
P名稱空間注入(底層還是set注入):
1、加一個p名稱空間
2、進行屬性注入:
xml中其他屬性注入:
1、空值注入
2、屬性值包含特殊符號:
轉義<>:< >
注入屬性:外部Bean
- 建立service類和dao類,省略此處。
2.在service中呼叫dao
//建立userDao型別,申明set方法 private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void add() { System.out.println("service add!!!"); userDao.update(); }
3.在Spring配置檔案中進行配置
<!--service和dao物件建立--> <bean id="userService" class="org.zhaojianhui.Spring.service.UserService"> <!--注入userdao物件,name是類裡的屬性名稱, ref是建立UserDao中bean標籤的id,注入外部bean--> <property name="userDao" ref="userDao"></property> </bean> <bean id="userDao" class="org.zhaojianhui.Spring.dao.UserDaoImpl"></bean>
注入屬性:內部Bean
- 一對多關係:例如部門對員工示例
//部門類 public class Dept { private String dname; public void setDname(String dname) { this.dname = dname; } }
//員工類 public class Emp { private String name; private String gender; private Dept dept; public void setDept(Dept dept) { this.dept = dept; } public void setName(String name) { this.name = name; } public void setGender(String gender) { this.gender = gender; } }
2.在Spring配置檔案中進行配置
<!--內部bean--> <bean id="emp" class="org.zhaojianhui.Spring.Bean.Emp"> <property name="name" value="zs"></property> <property name="gender" value="男"></property> <!--物件型別屬性--> <property name="dept"> <bean id="demp" class="org.zhaojianhui.Spring.Bean.Dept"> <property name="dname" value="安保部"></property> </bean> </property> </bean>
級聯賦值:
寫法1:
<bean id="emp" class="org.zhaojianhui.Spring.Bean.Emp"> <property name="name" value="zs"></property> <property name="gender" value="男"></property> <!--物件型別屬性--> <property name="dept" ref="depts"></property> </bean> <bean id="depts" class="org.zhaojianhui.Spring.Bean.Dept"> <property name="dname" value="安保部"></property> </bean>
寫法2:
<property name="dept.dname" value="體育部"></property>,對應Emp實體需要生成dept屬性的getter方法才能完成!
IOC操作Bean管理(xml注入集合屬性)
1、注入陣列型別屬性
2、注入List型別屬性
3、注入Map型別屬性
配置檔案中程式碼示例如下:
<!--陣列、List、Map注入-->
<bean id="stu" class="org.zhaojianhui.Spring.Bean.Stu">
<property name="course">
<array>
<value>語文</value>
<value>數學</value>
</array>
</property>
<property name="list">
<list>
<value>張三</value>
<value>三兒</value>
</list>
</property>
<property name="map">
<map>
<entry key="JAVA" value="java">
</entry>
<entry key="PHP" value="php"></entry>
</map>
</property>
</bean>
在集合裡設定物件型別值:
<!--注入list集合型別,值是物件--> <property name="courseList"> <list> <ref bean="course1"></ref> <ref bean="course2"></ref> </list> </property> </bean> <bean id="course1" class="org.zhaojianhui.Spring.Bean.Course"> <property name="cname" value="Spring"></property> </bean> <bean id="course2" class="org.zhaojianhui.Spring.Bean.Course"> <property name="cname" value="MVC"></property> </bean>
把集合注入部分提取出來
1、在配置檔案中引入一個名稱空間util
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> </beans>
2、使用util標籤完成list集合提取注入
<!--提取list集合屬性注入--> <util:list id="list"> <value>w</value> <value>q</value> <value>r</value> </util:list> <!--注入使用--> <bean id="stu" class="org.zhaojianhui.Spring.Bean.Stu"> <property name="list" ref="list"> </property> </bean>
IOC操作Bean管理(FactoryBean)
1、Spring有兩種Bean,一種普通Bean,另外一種工廠Bean
2、普通Bean:在配置檔案中定義Bean型別就是返回型別
3、工廠Bean:在配置檔案中定義Bean型別可以和返回型別不一樣
Bean的作用域:
預設單例,可以在配置檔案中修改作用域,在bean標籤的scope屬性用於設定,屬性值有singleton,prototype(多例),request,session
區別:
設定為單例時,載入配置檔案時就會建立單例物件,設定為多例時候不是在載入配置檔案時建立物件,而是在呼叫getBean方法時候建立多例項物件。
Bean的生命週期:
1、通過構造器建立bean示例(無參構造)
2、為bean的屬性設定值和對其他bean的引用(呼叫set方法)
把bean例項傳遞給bean後置處理器方法(如果使用了後置處理器就會多兩個步驟,即實現BeanPostProcessor方法)
3、呼叫bean的初始化方法
把bean例項傳遞給bean後置處理器方法
4、bean可以使用了(物件獲取到了)
5、當容器關閉時,呼叫Bean的銷燬方法
XML自動裝配
1、基於名稱 2、基於型別
<!--自動裝配,bean標籤屬性autowire配置自動裝配,byName根據屬性名稱注入(bean的id值和類屬性名稱一樣),byType根據屬性型別注入 (但是相同型別的bean不能定義多個)--> <bean id="emp" class="org.zhaojianhui.Spring.Bean.Emp" autowire="byName"></bean> <bean id="dept" class="org.zhaojianhui.Spring.Bean.Dept"> <property name="dname" value="開發部門"></property> </bean>
引入外部屬性檔案(以資料庫資訊為例):
1、直接配置資料庫資訊
2、通過引入外部屬性檔案配置資料庫連線池
1、引入context名稱空間
2、spring配置檔案中引入外部檔案
<!--引入外部屬性檔案--> <context:property-placeholder location="classpath:jdbc.properties"/>
3、使用${屬性}填充內容
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${prop.driverClass}"></property> <property name="url" value="${prop.url}"></property> <property name="username" value="${prop.userName}"></property> <property name="password" value="${prop.password}"></property> </bean>
IOC操作Bean管理(基於註解方式)
1、什麼是註解?
1、@註解名稱,註解可以作用在類、方法、屬性上
2、使用目的:簡化xml配置
2、Spring針對Bean管理中建立物件提供註解:
1、@Component:
2、@Service:
3、@Controller:
4、@Repository:用於dao層一般
3、基於註解方式演示物件建立(註解的value值預設為類首字母小寫)
第一步:引入aop依賴
第二步:開啟組建掃描
<!--開啟元件掃描--> <context:component-scan base-package="org.zhaojianhui.Spring"></context:component-scan>