SSH框架學習之Spring ----1、Spring入門和IOC
一、 spring概述
-
開源的輕量級框架(不依賴很多其他東西–輕量級)
-
兩部分核心
- aop 面向切面程式設計:擴充套件功能不是修改原始碼來實現
- ioc 控制反轉:把物件的建立交給spring,通過配置代替之前的new物件操作。
- 一站式框架
在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 >標籤建立
物件上的資料成員: 通過註釋(別忘了開啟掃描)