一伪窖、概述
(一)Spring框架的核心功能:
1、負(fù)責(zé)創(chuàng)建和管理所有的java對象居兆,這些java對象被稱為bean
2覆山、管理容器中Bean之間的依賴關(guān)系,以一種"依賴注入"的方式來管理Bean之間的依賴關(guān)系泥栖。(依賴注入為Bean注入普通的屬性值簇宽,也可以注入其他Bean的引用)
通俗的說,Spring框架的本質(zhì)就是通過XML配置類驅(qū)動(dòng)java代碼吧享,從而把耦合關(guān)系提取到配置文件中管理魏割,實(shí)現(xiàn)了系統(tǒng)中各組件的解耦。
(二)總結(jié)需要的:
? 創(chuàng)建spring項(xiàng)目兩種方式:
? 1.直接創(chuàng)建spring項(xiàng)目:如 另一篇文章很簡易的spring的基本使用(以及spring mvc的) - 簡書
?(1)bean包(setter钢颂、getter方法钞它,以及包括其具體的實(shí)現(xiàn)類)(2)spring.xml(spring的配置文件,主要是配置bean實(shí)例的甸陌,指定實(shí)例之間依賴關(guān)系须揣,可以建一個(gè), 其中多個(gè)bean钱豁,也可以對應(yīng)每個(gè)數(shù)據(jù)模型建多個(gè)xml文件耻卡,對應(yīng)不同的bean)或者注解(通過反射來創(chuàng)建實(shí)例) (3)spring的實(shí)現(xiàn)類
2.創(chuàng)建一個(gè)Maven項(xiàng)目:如下圖,
比起直接創(chuàng)建spring項(xiàng)目牲尺,要多一個(gè)pom.xml(自動(dòng)生成)用于配置spring
二卵酪、入門:
(一)spring框架結(jié)構(gòu):
AOP:面向切面(面向方面編程)
IOC:控制反轉(zhuǎn),容器
DI:依賴注入
(注意:spring沒有提供AOP方式的日志系統(tǒng)谤碳,我們需要使用AOP方式溃卡,借助spring與日志系統(tǒng)log4j實(shí)現(xiàn)我們自己的日志系統(tǒng))
Spring通過配置文件描述Bean及Bean之間的依賴關(guān)系,并通過Java語言的反射功能實(shí)例化Bean并建立Bean之間的依賴關(guān)系蜒简。
Spring的IOC容器瘸羡,一個(gè)是完成底層工作,并且提供一些高級服務(wù)(通過BeanFactory和ApplicationContext)
配置Bean(定義了Bean的實(shí)現(xiàn)及依賴關(guān)系)搓茬,Spring容器根據(jù)各種形式的Bean配置信息在容器內(nèi)部建立Bean定義注冊表犹赖,然后根據(jù)注冊表加載、實(shí)例化Bean卷仑,并建立bean和bean的依賴關(guān)系峻村,最后將準(zhǔn)備就緒的bean放到bean緩存池,供外岑的應(yīng)用程序調(diào)用锡凝。
(二)入門示例:
用的是Maven項(xiàng)目結(jié)構(gòu)來創(chuàng)建spring項(xiàng)目:
1.eclipse創(chuàng)建maven項(xiàng)目:
注意創(chuàng)建路徑不能和其他java項(xiàng)目路徑一致粘昨,干脆在D盤另開一個(gè)文件夾。
2.用maven,對單個(gè)項(xiàng)目右鍵propeties更改默認(rèn)設(shè)置java1.8:
3. 配置pom.xml张肾,聲明spring基本庫:
配置前:
配置后:
4.這個(gè)例子中有點(diǎn)類似spring基礎(chǔ)的例子芭析,同樣還是在applicationConfig.xml配置文件中配置java bean,在主類中用ApplicationContext獲取這個(gè)xml吞瞪。
(三)Maven中pom.xml中配置spring和數(shù)據(jù)庫(oracle,mysql,sql server):
三放刨、Spring的核心機(jī)制:依賴注入
依賴注入(DI)通常有兩種:
1、設(shè)值注入:IOC容器使用成員變量的setter方法來注入被依賴對象
通過<property.../>元素驅(qū)動(dòng)spring執(zhí)行setter方法
推薦面向接口編程尸饺,更好使規(guī)范和實(shí)現(xiàn)分離,提供更好的解耦助币。無論DAO組件或者業(yè)務(wù)邏輯組件浪听,都應(yīng)該先定義一個(gè)接口,定義該組件應(yīng)該實(shí)現(xiàn)的功能眉菱,但具體實(shí)現(xiàn)由實(shí)現(xiàn)類提供迹栓。
A調(diào)用B,B調(diào)用C...這其實(shí)就是依賴關(guān)系俭缓。但spring是以松耦合的方式來管理這種調(diào)用關(guān)系克伊。
配置文件:配置Bean實(shí)例,通常指定id华坦、class愿吹、ref屬性
需要:接口類、實(shí)現(xiàn)類惜姐、spring的配置文件xxx.xml(配置Bean犁跪,指定實(shí)例之間的依賴關(guān)系)、spring容器的實(shí)現(xiàn)類
2歹袁、構(gòu)造注入:IOC容器使用構(gòu)造器來注入被依賴對象坷衍,通過構(gòu)造方法
在配置文件中使用元素指定構(gòu)造器的參數(shù),通過<constructor-arg.../>元素驅(qū)動(dòng)spring執(zhí)行帶參數(shù)的構(gòu)造器条舔。
四枫耳、使用spring容器:(一般使用ApplicationContext作為spring容器,所以spring容器也稱為spring上下文)
(一)Spring的兩個(gè)核心接口:BeanFactory和ApplicationContext
(區(qū)別:BeanFactory等到程序需要Bean實(shí)例是才創(chuàng)建bean孟抗;ApplicationContext在創(chuàng)建容器實(shí)例時(shí)就預(yù)初始化所有singleton Bean)
1迁杨、BeanFactory:IOC容器,是Spring框架的基礎(chǔ)設(shè)施夸浅,面向spring本身仑最,提供了高級IOC的配置機(jī)制。負(fù)責(zé)配置帆喇、創(chuàng)建警医、管理Bean,但很少用BeanFactory實(shí)例來作Spring的容器。
(主要方法:初始化配置Bean预皇,再通過getBean()獲取bean實(shí)例)侈玄,初始化時(shí)必須為其提供一種日志框架,Log4J)
包含:Object getBean(Sring id)吟温、
? ? ? ? ? T getBean(String name,Class?requiredType)序仙、
? ? ? ? ? ?getType()方法
2、ApplicationContext:是BeanFactory的子接口鲁豪,用于創(chuàng)建beanFactory的實(shí)例潘悼。一般用在spring的實(shí)現(xiàn)類中,作為用于訪問容器中的bean常用接口(Spring容器爬橡,應(yīng)用上下文治唤,面向使用spring框架的開發(fā)者)常用!2谏辍1鎏怼!
其實(shí)現(xiàn)類:
(1)ClassPathXmlApplicationContext類:從類路徑加載配置文件(較穩(wěn)定柜裸,常使用)
【ApplicationContext context =new ClassPathXmlApplicationContext(“xxx.xml”);
Person p=context.getBean("person",Person.CLass)】
(2)FileSystemXmlApplicationContext類:從文件系統(tǒng)裝載配置文件
【ApplicationContext context =new FileSystemXmlApplicationContextxml(“xxx.xml”);】
(3)AnnotationConfigApplicationContext類
(4)WebXmlApplicationContext:定義了一個(gè)WEB應(yīng)用的所有bean缕陕。?
(二)spring獲取bean對象的方法:在ApplicationContext接口的實(shí)現(xiàn)類中使用
(1)Object getBean(Sring id)由容器中Bean的id獲取指定bean
(2)T getBean(String name,Class requiredType)由容器中Beanid獲取
五、Spring容器中的Bean:
1疙挺、bean的基本定義和別名:
根元素:<beans>扛邑,其中可以包含多個(gè)<bean.../>子元素,每個(gè)子元素定義一個(gè)Bean铐然,每個(gè)Bean又對應(yīng)Spring容器里的一個(gè)JAVA實(shí)例鹿榜。
定義Bean一般要指定2個(gè)屬性:id、class锦爵,還有name(可設(shè)置多個(gè))
而元素<alias../>可指定別名:有兩個(gè)屬性:name和alias
2舱殿、容器中bean的作用域:6個(gè)(p569)
常用:singleton(只產(chǎn)生一個(gè)實(shí)例,默認(rèn)险掀,一旦創(chuàng)建成功可以重復(fù)使用)沪袭、prototype(每次都產(chǎn)生一個(gè)新的bean實(shí)例,從內(nèi)存申請角度應(yīng)盡量避免設(shè)置)樟氢、
web應(yīng)用中的:request冈绊、session、application埠啃、websocket(這四個(gè)只在web應(yīng)用中生效死宣,所以必須要在web.xml中增加額外配置,如listener配置
<listener>
<listener-class>org.springframework.web.content.request.RequestContextListener</listener-class>
</listener>
因?yàn)槭窃趙eb應(yīng)用中的碴开,所以一般是在jsp中獲取毅该,在jsp中用java代碼獲取spring容器:WebApplicationContext??
也可直接使用springMVC框架博秫。
3、配置依賴:
配置<bean>元素眶掌,相當(dāng)于創(chuàng)建一個(gè)java實(shí)例挡育;
在<bean>元素中配置<property>子元素,相當(dāng)于bean類中的屬性朴爬,每包含一個(gè)<property>子元素即寒,spring則為該bean實(shí)例調(diào)用一次setter方法。
并在實(shí)現(xiàn)類中運(yùn)用反射實(shí)現(xiàn)召噩。
<property>中的屬性:
(1)value:設(shè)置普通屬性值
<property name="屬性名"? value="屬性值"/>
?(2)引用容器中其他bean:<ref.../>
(3)? 自動(dòng)裝配屬性:autowire母赵、default-autowire
其可接收如下值:no、byName(根據(jù)setter方法名與bean的id進(jìn)行匹配具滴,spring容器會(huì)根據(jù)該bean的setter方法名尋找容器中id為同盟的bean市咽,將其作為調(diào)用該setter方法的參數(shù);找不到則不進(jìn)行任何注入)抵蚊、byType(同理,但這是根據(jù)setter方法的參數(shù)類型與bean的類型進(jìn)行匹配溯革,若有多個(gè)匹配贞绳,容器會(huì)無法判斷,從而拋出異常致稀;找不到則不進(jìn)行任何注入)冈闭、constructor(類似byType,但找不到則拋出異常)抖单、autodetect(根據(jù)bean內(nèi)部結(jié)構(gòu)決定使用constructor或byType策略萎攒,?首先嘗試使用constructor來自動(dòng)裝配,如果無法工作矛绘,則使用byType方式耍休。)
(4)注入嵌套bean:把<bean>配置成<property.../>或<costructor-args.../>的子元素
總結(jié):spring配置文件,根據(jù)傳入?yún)?shù)的參數(shù)類型不同货矮,配置文件不同
①基本類型羊精,在value寫值;②其他類時(shí):用ref的方式囚玫;注入嵌套喧锦;自動(dòng)裝配?
③注入集合值:map、list抓督、set燃少、properties(key、value只能說字符串)
六铃在、spring中配置bean的xml(applicationConfig.xml):
基于xml文件配置阵具,三種方式注入bean屬性:
舉例:一個(gè)java類碍遍,有name和type屬性
1.正常方式:在一個(gè)“value”標(biāo)簽注入值,并附有“property”標(biāo)簽結(jié)束怔昨。
2.快捷方式:注入值“value”屬性雀久。
3."p"模式:通過使用“p”模式作為注入值到一個(gè)屬性。
并且趁舀,
七赖捌、類注解的配置方式
在實(shí)體類:
@configuration在類前注解:表示是一個(gè)配置信息提供類
@Bean(name=“xxx”):定義一個(gè)bean
@Value:修飾,設(shè)定值
@SuppressWarnings("serial"):實(shí)現(xiàn)序列化接口矮烹,對實(shí)體類進(jìn)行標(biāo)注
則實(shí)例化Bean越庇,啟動(dòng)IOC容器并裝配Bean如下:
ApplicationContext ctx=new AnnotationConfigApplicationContext(Beans.class)
在bean實(shí)現(xiàn)類:
@Component(基本注解。標(biāo)注基本類)或其他衍型類奉狈,如
@Repository:用于對DAO實(shí)現(xiàn)類進(jìn)行標(biāo)注:@Repository對應(yīng)數(shù)據(jù)訪問層Bean
@Repository(value="userDao")注解是告訴Spring卤唉,讓Spring創(chuàng)建一個(gè)名字叫“userDao”的UserDaoImpl實(shí)例。
業(yè)務(wù)層:
@Service:用于對service業(yè)務(wù)層實(shí)現(xiàn)類進(jìn)行標(biāo)注仁期,聲明spring要?jiǎng)?chuàng)建的bean
控制層:
@Controller:對controller實(shí)現(xiàn)類進(jìn)行標(biāo)注桑驱,說明action的名字
在成員變量或方法入?yún)⑻帢?biāo)注@Autowird(按類型匹配自動(dòng)注入),或者配合使用@Qualifer(按名稱匹配方式注入)
@Scope注解:@Scope("prototype")表示將Action的范圍聲明為原型跛蛋,可以利用容器的scope="prototype"來保證每一個(gè)請求有一個(gè)單獨(dú)的Action來處理熬的,避免struts中Action的線程安全問題。spring?默認(rèn)scope?是單例模式
@RequestMapping:說明action的路徑赊级,用于類上或者方法上押框,在類上可以不用,但在方法上必須使用
@Responsebody 注解:表示該方法的返回的結(jié)果直接寫入 HTTP 響應(yīng)正文(ResponseBody)中理逊,一般在異步獲取數(shù)據(jù)時(shí)使用橡伞,通常是在使用 @RequestMapping 后,返回值通常解析為跳轉(zhuǎn)路徑晋被,加上 @Responsebody 后返回結(jié)果不會(huì)被解析為跳轉(zhuǎn)路徑兑徘,而是直接寫入HTTP 響應(yīng)正文中。?
另外:@Autowired的用法和作用:它可以對類成員變量羡洛、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注道媚,完成自動(dòng)裝配的工作
這個(gè)注解就是spring可以自動(dòng)幫你把bean里面引用的對象的setter/getter方法省略,它會(huì)自動(dòng)幫你set/get翘县。
這樣你在userService里面要做一個(gè)userDao的setter/getter方法最域。
但如果你用了@Autowired的話,你只需要在UserService的實(shí)現(xiàn)類中聲明即可锈麸。
@Autowired
private IUserDao userdao;
Spring@Autowired注解與自動(dòng)裝配
八镀脂、創(chuàng)建bean的三種方式:
1、通過構(gòu)造器創(chuàng)建bean實(shí)例:在<bean.../>元素中添加<constructor-arg.../>子元素忘伞,配置構(gòu)造器參數(shù)
2薄翅、靜態(tài)工廠方法創(chuàng)建(P589)
3沙兰、實(shí)例工廠方法創(chuàng)建(P591)
九、web.xml中配置字符編碼過濾器
十翘魄、session作用域和request作用域類似:request作用域的bean對于每次http請求有效鼎天,而session作用域的Bean則對于每次http session有效
在web.xml中增加Listener配置,程序可以在spring配置文件中使用request/session作用域 scope="request"