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>