Spring框架是一個容器,是一個整合了很多其他框架的框架,它的核心是 IOC 和 AOP ...
1、什麼是Spring框架
它是一個容器,整合其它框架的框架,它的核心是 IOC 和 AOP。Spring 框架由20多個模塊構成,它在很多領域都提供了優秀的解決方案。
2、Spring的特點
1)輕量級
由20多個模塊構成,每個jar包都很小,小於1M,核心包也就3M左右;
對代碼無污染;
2)面向介面編程
使用介面,就是面向靈活。項目的可擴展性,可維護性都極高。使用時介面指向實現類,切換實現類即可切換整個功能。
3)AOP --- 面向切麵編程
就是將公共的,通用的,重覆的代碼單獨開發,在需要的時候反織回去,底層的原理是動態代理。
4)整合其它框架
大魚吃小魚,Spring整合了很多優秀的框架。
3、什麼是IOC
- 控制反轉 IOC(Inversion of Control)是一個概念,是一種思想。由Spring容器進行對象的創建和依賴註入,程式員在使用時直接取出使用。
正轉:由程式員進行對象的創建和依賴註入稱為正轉.程式員說了算。
//程式員創建對象
Student stu = new Student();
//程式員進行賦值
stu.setName("張三");
stu.setAge(22);
反轉:由Spring容器創建對象和依賴註入稱為反轉,將控制權從程式員手中奪走,由給Spring容器,稱為反轉,容器說了算。
<!--Spring容器負責對象的創建-->
<bean id="stu" class="com.bjpowernode.pojo.Student">
<!--Spring容器依賴註入值-->
<property name="name" value="張三"/>
<property name="age" value="22"/>
</bean>
切記:Spring容器在啟動時,就創建所有的對象(stu、、、)
4、基於xml的IOC
1)創建對象
<bean id="stu" class="com.bjpowernode.pojo.Student"></bean>
2)給創建的對象賦值
A.使用setter註入,註入分為簡單類型註入和引用類型註入:
- 簡單類型註入值使用value屬性;(簡單類型指的是 【8種基本類型+String】)
- 引用類型註入值使用ref屬性
<!--必須要註意:使用setter註入必須提供無參的構造方法,必須提供setXXX()方法.-->
<!--創建學生對象-->
<bean id="stu" class="com.bjpowernode.pojo2.Student">
<!--簡單類型註入-->
<property name="name" value="李四"></property>
<property name="age" value="22"></property>
<!--引用類型註入-->
<property name="school" ref="school"></property>
</bean>
<!--創建學校對象-->
<bean id="school" class="com.bjpowernode.pojo2.School">
<property name="name" value="清華大學"></property>
<property name="address" value="海澱區"></property>
</bean>
B.使用構造方法註入
a.使用構造方法的參數名稱進行註入值
<bean id="school" class="com.bjpowernode.pojo3.School">
<constructor-arg name="name1" value="清華大學"></constructor-arg>
<constructor-arg name="address1" value="海澱區"></constructor-arg>
</bean>
b.使用構造方法參數的下標註入值
<bean id="stu" class="com.bjpowernode.pojo3.Student">
<constructor-arg index="0" value="錢七"></constructor-arg>
<constructor-arg index="1" value="22"></constructor-arg>
<constructor-arg index="2" ref="school"></constructor-arg>
</bean>
c.使用預設的構造方法的參數的順序註入值
<bean id="stuSequence" class="com.bjpowernode.pojo3.Student">
<constructor-arg value="陳十"></constructor-arg>
<constructor-arg value="22"></constructor-arg>
<constructor-arg ref="school"></constructor-arg>
</bean>
5、基於註解的IOC
- 基於註解的 IOC 也稱為DI(Dependency Injection),它是IOC的具體實現的技術.
基於註解的IOC,必須要在Spring的核心配置文件中添加包掃描.
<context:component-scan base-package="com.bjpowernode.s01"></context:component-scan>
1)創建對象的註解:
@Component:可以創建任意對象.創建的對象的預設名稱是類名的駝峰命名法,也可以指定對象的名稱@Component("指定名稱").
@Controller:專門用來創建控制器的對象(Servlet),這種對象可以接收用戶的請求,可以返回處理結果給客戶端.
@Service:專門用來創建業務邏輯層的對象,負責向下訪問數據訪問層,處理完畢後的結果返回給界面層.
@Repository:專門用來創建數據訪問層的對象,負責資料庫中的增刪改查所有操作.
案例:
@Component("stu") //交給Spring去創建對象,就是在容器啟動時創建
public class Student {
//簡單類型的值註入
@Value("張三")
private String name;
@Value("22")
private int age;
}
2)依賴註入的註解
用來給簡單類型註入值:
@Value:
引用類型的註入
A.@Autowired:使用類型註入值,從整個Bean工廠中搜索同源類型的對象進行註入.
- 什麼是同源類型:
a.被註入的類型(Student中的school)與註入的類型是完全相同的類型
b.被註入的類型(Student中的school父)與註入的類型(子)是父子類
c.被註入的類型(Student中的school介面)與註入的類型(實現類)是介面和實現類的類型
註意:在有父子類的情況下,使用按類型註入,可能有多個可註入的對象.此時按照名稱進行二次篩選,選中與被註入對象相同名稱的對象進行註入.
B.使用名稱註入值,從整個Bean工廠中搜索相同名稱的對象進行註入.
@Autowired
@Qualifier("名稱")
註意:如果有父子類的情況下,直接按名稱進行註入值;兩個註解都有才起按名稱註入值的作用
6、添加包掃描的方式
1)單個包掃描(推薦使用)
<context:component-scan base-package="com.bjpowernode.controller"></context:component-scan>
<context:component-scan base-package="com.bjpowernode.service.impl"></context:component-scan>
<context:component-scan base-package="com.bjpowernode.dao"></context:component-scan>
2)多個包掃描,多個包之間以逗號或空格或分號分隔
<context:component-scan base-package="com.bjpowernode.controller com.bjpowernode.service ,com.bjpowernode.dao"></context:component-scan>
3)掃描根包(不推薦)
<context:component-scan base-package="com.bjpowernode"></context:component-scan>
- 會降低容器啟動的速度,導致多做無用功.
7、為應用指定多個 Spring 配置文件
當項目越來越大,需要多人合作開發,只用一個配置文件就存在很大隱患.
1)拆分配置文件的策略
A.按層拆
applicationContext_controller.xml(寫關於界面層的操作)
<bean id="uController" class="com.bjpowernode.controller.UsersController">
<bean id="bController" class="com.bjpowernode.controller.BookController">
applicationContext_service.xml (寫關於業務邏輯層的操作)
<bean id="uService" class="com.bjpowernode.controller.UsersService">
<bean id="bService" class="com.bjpowernode.controller.BookService">
applicationContext_mapper.xml(寫關於數據訪問層的操作)
<bean id="uMapper" class="com.bjpowernode.controller.UsersMapper">
<bean id="bMapper" class="com.bjpowernode.controller.BookMapper">
B.按功能拆
applicationContext_users.xml
<bean id="uController" class="com.bjpowernode.controller.UsersController">
<bean id="uService" class="com.bjpowernode.controller.UsersService">
<bean id="uMapper" class="com.bjpowernode.controller.UsersMapper">
applicationContext_book.xml
<bean id="bController" class="com.bjpowernode.controller.BookController">
<bean id="bService" class="com.bjpowernode.controller.BookService">
<bean id="bMapper" class="com.bjpowernode.controller.BookMapper">
8、spring配置文件的整合
1)單個文件導入
<import resource="applicatoinContext_mapper.xml"></import>
<import resource="applicatoinContext_service.xml"></import>
<import resource="applicatoinContext_controller.xml"></import>
2)批量導入
<import resource="applicatoinContext_*.xml"></import>