1. 程式人生 > >SSH框架學習之Spring ----1、Spring入門和IOC

SSH框架學習之Spring ----1、Spring入門和IOC

一、 spring概述

  1. 開源的輕量級框架(不依賴很多其他東西–輕量級)

  2. 兩部分核心

  • aop 面向切面程式設計:擴充套件功能不是修改原始碼來實現
  • ioc 控制反轉:把物件的建立交給spring,通過配置代替之前的new物件操作。
  1. 一站式框架
    在javaee三層結構中,每一層都提供了不同的解決技術
    web層:springMVC
    service層:spring的ioc
    dao層:spring的jdbcTemplate

二、IOC底層原理

思想:高內聚,低耦合

落後的版本:

按之前生成物件的方式,new User(),如果User類發生了改動,那麼它使用的所有地方都需要修改。耦合度太高。

後來出現了工廠模式,每次建立呼叫工廠。這樣降低了一些耦合度,不過工廠和物件出現了新的耦合。

在這裡插入圖片描述

IOC如何解決耦合度問題

在工廠類中,建立物件的方式改為:
讀取配置檔案、解析得到物件的資訊 -> 通過物件的資訊,使用反射建立類

在這裡插入圖片描述

優點:

如果Service物件發生了改變,那麼我們不需要在其他地方改動程式碼。

如果Service物件路徑發生了改變,那麼我們只需修改xml配置檔案。

耦合度大大減少

這裡是XML解析器的學習

三、ioc入門案例

由於上面的底層程式碼寫起來繁瑣,Spring提供了幾種實現的方法(封裝好的輪子),下面是一個小案例,分為幾步完成。

第一步:匯入jar包

第二步: 建立類User,在類裡面建立方法add()

第三步:建立配置檔案,配置建立的類
關於配置檔案,名稱和位置不固定,但是建議放到src下,官方建議起名applicationContext.xml。使用之前還需引入約束schema

Code:配置檔案
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        
       <bean id="user" class="cn.itcast.ioc.User"></bean>
</beans>

最後測試一下:

 ApplicationContext context =
                new ClassPathXmlApplicationContext("bean1.xml");
        User user = (User) context.getBean("user");
        System.out.println(user);
        user.add();

四、深入bean管理的屬性

回顧: IOC是要在建立物件的時候解耦,不用new AnotherClass();這種操作。

屬性介紹
  • id:起的名稱,任意命名(不能包含特殊符號,根據id值得到配置物件)
  • class:建立的類所在的路徑
  • name:和id屬性一樣,可以包含特殊符號(一般不用)
  • scope:重要
    singleton(單例):建立的物件指向同一個。
    prototype(多例):建立的屬不同物件。
    另外還有其他的,瞭解即可
    在這裡插入圖片描述

五、屬性注入(DI)

5.1 概念

希望在建立物件時,能初始化屬性的值。

5.2 Spring支援下面的第一第二種形式的初始化

方法一:建立物件的時候,向類裡面屬性設定值
換句話說: 當類的成員變數初始化是通過前兩種方式,那就可以用Spring提供的屬性注入的方式來實現

(1)第一種set方式的注入:

第一步:建立例項,包含所需注入的屬性,和屬性的set方法
在這裡插入圖片描述
第二步:配置檔案,對Book類進行屬性注入
在這裡插入圖片描述

(2)第二種構造方法的注入:

第一步:建立實體類,實現構造方法
在這裡插入圖片描述
第二步:完成配置
在這裡插入圖片描述
這個時候得到的物件,其資料成員的值都會被初始化

六、資料成員是其他型別的屬性注入

1) 資料成員是物件:

在這裡插入圖片描述

在這裡插入圖片描述

2)陣列:

在這裡插入圖片描述

3) list:

在這裡插入圖片描述

4)map

在這裡插入圖片描述

5)properties

在這裡插入圖片描述

七、用註解的方式實現IOC

上面介紹了Spring提供的物件建立,和屬性注入。我們是用過配置檔案完成配置,然後ApplicationContext取出物件的,現在要說一種簡便的註解方式實現。

註解的結構是這樣的

@註解的名字(屬性名=值)

註解可以標註在類、方法或者屬性上

7.1 準備工作

引入一個新的約束,然後通知Spring開啟對包的掃描,具體的看程式碼

<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
	   
   <!--開啟掃描,再填入要建立物件所在的包
    可以加,號新增多個,表示掃描多個
    也可以填高階包名,例如cn.itcast,表示掃描整個包

    作用:到包裡面掃描類,方法,屬性上是否有註解
    -->
    <context:component-scan base-package="cn.itcast"></context:component-scan>

    <!--只掃描屬性上面的註解-->
    <!--<context:annotation-config></context:annotation-config>-->

</beans>

7.2 使用註解建立物件

在第一節,建立物件是用的

<bean id="user"  class = "cn.itcast.xx"></bean>
code: 用註解是這麼寫的
@Component(value = "user") // <bean id="user" class=""/>
public class User {
    public void add() {
        System.out.println("Anno add.......");
    }
}

Spring還提供了@Component的幾種衍生註解,它僅僅是為了讓邏輯更加清晰,就目前而言,他們都是等價的
@Controller : Web層
@Service :業務邏輯層
@Repository: 持久層

另外還有一個註解

@Scope(value="prototype") // 多例模式
@Scope(value="singleton") // 預設的,單例

7.3 屬性注入

在第一節中,通過在bean標籤裡面進行配置完成,這裡也使用註釋。

需求:Service中包含Dao的資料成員,通過呼叫Service,來呼叫Dao

第一步:建立Dao和Service物件

code: Dao.class
@Component(value = "dao")
public class Dao {
    public void add() {
        System.out.println("dao.....");
    }
}

code: Service.class
@Component(value = "service")
public class Service {
    @Autowired // 或者Resource(name="userDao"),name裡面的值填的是Dao類在value裡寫的值
    private Dao dao;
    // 不需要set方法了
    public void add() {
        dao.add();
        System.out.println("service.....");
    }
}

注意:資料成員的註釋,有兩種寫法,不過推薦使用Resource(name=“userDao”),這樣邏輯更加清晰。

7.4 總結:

顯然兩種方法可以混合一起用,開發中:
建立物件:通過< bean >標籤建立
物件上的資料成員: 通過註釋(別忘了開啟掃描)