在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...