03 spring的基本配置

2021-08-28 09:06:08 字數 4280 閱讀 2208

在spring配置中,id和name屬性都可以表示bean元素的名稱,不同的是:

id屬性,遵守xml語法id約束。必須以字母開始,可以使用字母、數字、連字元、下劃線、句話、冒號,不能以「/」開頭。

name屬性,就可以使用很多特殊字元,比如在spring和struts1或spring mvc的整合中,就得使用name屬性來的定義bean的名稱。

注意:從spring3.1開始,id屬性不再是id型別了,而是string型別,也就是說id屬性也可以使用「/」開頭了,而bean元素的id的唯一性由容器負責檢查。(鼓掌)

當然也使用name屬性為元素起多個別名,多個別名之間使用逗號或空格隔開,在**中依然使用beanfactory物件.getbean(...)方法獲取。

或則建議:bean起名盡量規範,不要搞一些非主流的名字,盡量使用id。

使用import元素引入其他的配置檔案:

使用import元素注意:

1、預設情況下,從classpath的跟路徑尋找。

2、可以使用字首來定位檔案的基礎位置:

①:[classpath:]:後面的檔案從classpath路徑開始找(推薦);[注意classloader的問題。]

②:[file:]:後面的檔案使用檔案系統的路徑開始找;

注意:只有當框架中實現了resource介面才能夠識別上述的字首識別符號。

傳統的測試方式來測試spring**,存在問題:

1,每個測試都要重新啟動spring容器,啟動容器的開銷大,測試效率低下。

2,不應該是測試**管理spring容器,應該是spring容器在管理測試**。

spring測試環境準備:

依賴jar:

1.spring-test-4.1.2.release.jar

2.spring-context-4.1.2.release.jar

3.spring-aop-4.1.2.release.jar

4.spring-expression-4.1.2.release.jar

spring4.x需要依賴的單元測試得是最新的junit4.12,eclipse自帶的junit4.8不支援,同時從spring4.x開始,還得依賴aop包的支援。

junit-4.12.jar

hamcrest-core-1.3.jar

@runwith(springjunit4classrunner.class)//表示先啟動spring容器,把junit執行在spring容器中

public class helloworldtest

}

//針對於當前xml中所有的bean:是否需要延遲初始化.

//針對於指定的bean:是否需要延遲初始化.

singleton: 單例 ,在spring ioc容器中僅存在乙個bean例項 (預設的scope)

prototype: 多例 ,每次從容器中呼叫bean時,都返回乙個新的例項,即每次呼叫getbean()時 ,相當於執行new ***bean():不會在容器啟動時建立物件

request: 用於web開發,將bean放入request範圍 ,request.setattribute("***") , 在同乙個request 獲得同乙個bean

session: 用於web開發,將bean 放入session範圍,在同乙個session 獲得同乙個bean

globalsession: 一般用於porlet應用環境 , 分布式系統存在全域性session概念(單點登入),如果不是porlet環境,globalsession 等同於session

對於struts2中的action使用prototype型別(多個使用者多個請求用的是同乙個物件),其他使用singleton

比如datasource,sessionfactory最終都需要關閉資源:在bean銷毀之前,都要呼叫close方法.

init-method:bean生命週期初始化方法,物件建立後就進行呼叫.

destroy-method:容器被銷毀的時候,如果bean被容器管理,會呼叫該方法。

分析原理:

如果bean的scope="prototype",那麼容器只負責建立和初始化,它並不會被spring容器管理。交給使用者自己呼叫.

總結:bean的生命週期過程

依賴注入介紹 和xml的自動裝配

指spring建立物件的過程中,將物件依賴屬性通過配置進行注入

xml方式-自動裝配(一般不推薦使用):

元素的:autowire屬性

autowire屬性:讓spring按照一定的方式自己去找合適的物件,並完成di

- default:不要自動注入

- no:不要自動注入

- byname:按照名字注入(按照屬性的名字在spring中找bean) factory.getbean(「屬性的名字」)

- bytype:按照依賴物件的型別注入(factory.getbean(屬性的型別))

- constructor:按照物件的構造器上面的引數型別注入

注意:

1,如果按照byname自動注入,要求所有的屬性名字和id的名字必須保證一種規範的命名方式;

2,如果按照bytype注入,如果spring中同乙個型別有多個例項-->報bean不是唯一型別錯誤;

屬性注入: 通過物件的setter方法注入依賴的物件.

使用setter注入:

1,使用bean元素的子元素設定;

1,簡單型別值,直接使用value賦值;

2,引用型別,使用ref賦值;

3,集合型別,直接使用對應的集合型別元素即可。

2,spring通過屬性的setter方法注入值;

3,在配置檔案中配置的值都是string,spring可以自動的完成型別的轉換

4,屬性的設定值是在init方法執行之前完成的

5,改進spring的測試,直接在測試類裡面注入需要測試的物件

//實體類

@setter

public class employee

//測試類

@runwith(springjunit4classrunner.class)

@contextconfiguration

public class employeetest

}

構造器注入: 通過構造器,在建立物件的時候就注入依賴物件

constructor-arg:構造器引數

1,spring在例項化物件的時候,如果物件沒有配置constructor-arg,則使用預設的構造器例項化物件

2,如果有constructor-arg,那麼spring使用這些constructor-arg來唯一確定乙個構造器

1,預設情況下,constructor-arg的順序就是構造器引數的順序

2,3中調整構造器順序:

1.index:在構造器中的引數位置

2.type:在構造器中的引數的型別

3.name:在構造器中按照構造器的引數名字設定值

使用哪種注入方式比較好(setter?構造器?)?

1,如果乙個類必須依賴另乙個類才能正常執行,用構造器;

2,但是構造器的引數如果過多,構造器很難看;

3,更多的還是使用setter注入;

4,可以使用@required標籤來要求乙個屬性必須注入

public class employee 

}

spring屬性佔位符之建立連線池物件

依賴的jar:>>mysql驅動包》druid包.

@runwith(springjunit4classrunner.class)

@contextconfiguration

public class propertyplaceholdertest

}

<?xml version="1.0" encoding="utf-8"?>

db.properties檔案

jdbd.driverclassname=com.mysql.jdbc.driver

jdbd.url=jdbc:mysql:///springdemo

jdbd.username=root

jdbd.password=admin

Spring系列教程 03Spring容器的建立

new beans.xml 第二種 檔案系統路徑獲得配置檔案 絕對路徑 new d springframework講解 src beans.xml 第三種 使用beanfactory 了解 newxmlbeanfactory new filesystemresource d springframew...

03 spring學習 自動裝配

新建person類 package com.spring.bean.autowire public class person public void setname string name public address getaddress public void setaddress addres...

Spring03 配置介紹

1 別名 people class com.study.pojo.people name value amy age value 2 bean 給bean設定別名 people alias anothername 2 bean 的配置 id bean 的唯一識別符號,相當於物件名 class bea...