天天看點

【SSM架構】Spring筆記 --- Spring概述;IOC控制反轉詳解

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>