韓順平Spring筆記_第1頁
韓順平Spring筆記_第2頁
韓順平Spring筆記_第3頁
韓順平Spring筆記_第4頁
韓順平Spring筆記_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、u spring的快速入門案例 spring是什么?struts 是 web 框架 (jsp/action/actionfrom)hibernate 是 orm框架,處于持久層.spring 是容器框架,用于配置bean,并維護(hù)bean之間關(guān)系的框架 spring中有一個非常概念: bean (是java中的任何一種對象 javabean/service/action/數(shù)據(jù)源./dao, ioc(控制反轉(zhuǎn) inverse of control) di( dependency injection 依賴注入) 畫一個框架圖u 快速入門開發(fā)一個spring項(xiàng)目.1. 引入spring的開發(fā)包(最小配

2、置spring.jar 該包把常用的jar都包括, 還要 寫日志包 common-logging.jar2. 創(chuàng)建spring的一個核心文件 applicationContext.xml, hibernate有核心 hibernate.cfg.xml struts核心文件 struts-config.xml, 該文件一般放在src目錄下,該文件中引入 xsd文件 :可以從給出的案例中拷貝一份.3. 配置bean<!- 在容器文件中配置bean(service/dao/domain/action/數(shù)據(jù)源) -><!- bean元素的作用是,當(dāng)我們的spring框架加載時候,sp

3、ring就會自動的創(chuàng)建一個bean對象,并放入內(nèi)存 UserService userSerivce=new UserService();userSerivce.setName("韓順平");-><bean id="userService" class="com.service.UserService"><!- 這里就體現(xiàn)出注入的概念. -><property name="name"><value>韓順平</value></property>

4、;</bean>4. 在Test.java中,我們怎么使用/我們現(xiàn)在使用spring來完成上面的任務(wù)/1.得到spring 的applicationContext對象(容器對象)ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");UserService us=(UserService) ac.getBean("userService");us.sayHello();5. 細(xì)節(jié)討論?傳統(tǒng)的方法和使用spring的方法5.1 使用sp

5、ring ,沒有new 對象,我們把創(chuàng)建對象的任務(wù)交給spring框架5.2 spring的運(yùn)行原理圖:5.3我們再看spring 對上面案例總結(jié):spring實(shí)際上是一個容器框架,可以配置各種bean(action/service/domain/dao),并且可以維護(hù)bean與bean的關(guān)系,當(dāng)我們需要使用某個bean的時候,我們可以getBean(id),使用即可.ioc是什么?答 :ioc(inverse of controll ) 控制反轉(zhuǎn): 所謂控制反轉(zhuǎn)就是把創(chuàng)建對象(bean),和維護(hù)對象(bean)的關(guān)系的權(quán)利從程序中轉(zhuǎn)移到spring的容器(applicationContext

6、.xml),而程序本身不再維護(hù).DI是什么?答: di(dependency injection) 依賴注入: 實(shí)際上di和ioc是同一個概念,spring設(shè)計者認(rèn)為di更準(zhǔn)確表示spring核心技術(shù) 學(xué)習(xí)框架,最重要的就是學(xué)習(xí)各個配置.把Applicationcontext做成一個單例的.上機(jī)練習(xí): 把我寫的代碼走一遍.u spring開發(fā)提倡接口編程,配合di技術(shù)可以層與層的解耦舉例說明:現(xiàn)在我們體驗(yàn)一下spring的di配合接口編程的,完成一個字母大小寫轉(zhuǎn)換的案例:思路:1. 創(chuàng)建一個接口 ChangeLetter2. 兩個類實(shí)現(xiàn)接口3. 把對象配置到spring容器中4. 使用通過上面

7、的案例,我們可以初步體會到di配合接口編程,的確可以減少層(web層) 和 業(yè)務(wù)層的耦合度.思考題:接口ValidateUser有一個方法:check(?)有兩個類CheckUser1 implements ValidateUsercheck/ 安裝xml驗(yàn)證CheckUser2 implements VallidateUsercheck()/ 到數(shù)據(jù)庫去驗(yàn)證u 從ApplicationContex 應(yīng)用上下文容器中獲取bean和從bean工廠容器中獲取bean具體案例:/從ApplicationContext中取beanApplicationContext ac=new ClassPathX

8、mlApplicationContext("com/hsp/ioc/beans.xml");/當(dāng)我們?nèi)?shí)例化beans.xml,該文件中配置的bean被實(shí)例(該bean scope是 singleton)從bean中取出student/如果我們使用beanfactory去獲取bean,當(dāng)你只是實(shí)例化該容器, 那么/容器的bean不被實(shí)例化,只有當(dāng)你去使用getBean某個bean時,才會實(shí)時的創(chuàng)建.BeanFactory factory = new XmlBeanFactory(new ClassPathResource("com/hsp/ioc/beans.xm

9、l");factory.getBean("student");結(jié)論: 1.如果使用ApplicationContext ,則配置的bean如果是 singlton不管你用不用,都被實(shí)例化.(好處就是可以預(yù)先加載,缺點(diǎn)就是耗內(nèi)存)2.如果是 BeanFactory ,則當(dāng)你獲取beanfacotry時候,配置的bean不會被馬上實(shí)例化,當(dāng)你使用的時候,才被實(shí)例(好處節(jié)約內(nèi)存,缺點(diǎn)就是速度)3.規(guī)定: 一般沒有特殊要求,應(yīng)當(dāng)使用ApplicatioContext完成(90%)u bean 的 scope的細(xì)節(jié)入門案例:/獲取兩個studentStudent s1=(S

10、tudent) ac.getBean("student");Student s2=(Student) ac.getBean("student");System.out.println(s1+" "+s2);l requestl sessionl global-session 是在web開發(fā)中才有意義.u 三種獲取ApplicationContext 對象引用的方法1. ClassPathXmlApplicationContext -> 通過類路徑2. FileSystemXmlApplicationContext -> 通

11、過文件路徑舉例:ApplicationContext ac=new FileSystemXmlApplicationContext("文件路徑beans.xml / applicationContext.xml");3. XmlWebApplicationContextu bean的生命周期為什么總是一個生命周期當(dāng)做一個重點(diǎn)?Servlet -> servlet生命周期 init() destory()java對象生命周期.往往筆試,面試總喜歡問生命周期的問題 實(shí)例化(當(dāng)我們的程序加載beans.xml文件),把我們的bean(前提是scope=singleton)實(shí)

12、例化到內(nèi)存 調(diào)用set方法設(shè)置屬性 如果你實(shí)現(xiàn)了bean名字關(guān)注接口(BeanNameAware) 則,可以通過setBeanName獲取id號 如果你實(shí)現(xiàn)了 bean工廠關(guān)注接口,(BeanFactoryAware),則可以獲取BeanFactory 如果你實(shí)現(xiàn)了 ApplicationContextAware接口,則調(diào)用方法 /該方法傳遞ApplicationContextpublic void setApplicationContext(ApplicationContext arg0)throws BeansException / TODO Auto-generated method s

13、tubSystem.out.println("setApplicationContext"+arg0); 如果bean 和 一個后置處理器關(guān)聯(lián),則會自動去調(diào)用 Object postProcessBeforeInitialization方法 如果你實(shí)現(xiàn)InitializingBean 接口,則會調(diào)用 afterPropertiesSet 如果自己在<bean init-method=”init” /> 則可以在bean定義自己的初始化方法. 如果bean 和 一個后置處理器關(guān)聯(lián),則會自動去調(diào)用 Object postProcessAfterInitializat

14、ion方法 使用我們的bean11. 容器關(guān)閉12. 可以通過實(shí)現(xiàn)DisposableBean 接口來調(diào)用方法 destory13. 可以在<bean destory-method=”fun1”/> 調(diào)用定制的銷毀方法小結(jié): 我們實(shí)際開發(fā)中往往,沒有用的這么的過程,常見的是:1->2->6->10->9->11 上機(jī)練習(xí): 把使用每個 bean的時間記錄到一個recoder.txt文件 ,內(nèi)容是xxbean. 使用時間是 : 1999-11-11 11:11:11問題:通過BeanFactory來獲取bean對象,bean的生命周期是否和Ap

15、plicationcontext 是一樣嗎?不是一樣的,bean是工廠中創(chuàng)建的生命周期會簡單一些:u 配置bean的細(xì)節(jié) scope 的說明: 盡量使用 scope=”singleton” ,不要使用prototype,因?yàn)檫@樣對我們的性能影響較大. 如何給集合類型注入值.java中主要的集合有幾種: map set list / 數(shù)組 Department類:package com.hsp.collection;import java.util.List;import java.util.Map;import java.util.Set;public class Department pri

16、vate String name;private String empName;private List<Employee> empList;private Set<Employee> empsets;private Map<String,Employee> empMaps;public Set<Employee> getEmpsets() return empsets;public void setEmpsets(Set<Employee> empsets) this.empsets = empsets;public String

17、getEmpName() return empName;public void setEmpName(String empName) this.empName = empName;public String getName() return name;public void setName(String name) = name;public List<Employee> getEmpList() return empList;public void setEmpList(List<Employee> empList) this.empList =

18、empList;public Map<String, Employee> getEmpMaps() return empMaps;public void setEmpMaps(Map<String, Employee> empMaps) this.empMaps = empMaps;/Employeel類 package com.hsp.collection;public class Employee private String name;private int id;public int getId() return id;public void setId(int

19、 id) this.id = id;public String getName() return name;public void setName(String name) = name;beans.xml配置文件:<?xml version="1.0" encoding="utf-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-

20、instance"xmlns:context="/schema/context"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.5.xsdhttp:/www.springframework

21、.org/schema/context /schema/context/spring-context-2.5.xsd/schema/tx /schema/tx/spring-tx-2.5.xsd"><bean id="department" class="com.hsp.collection.Department"><property name=&q

22、uot;name" value="財務(wù)部"/><!- 給數(shù)組注入值 -><property name="empName"><list><value>小明</value><value>小明小明</value><value>小明小明小明小明</value></list></property><!- 給list注入值 list 中可以有相當(dāng)?shù)膶ο?-><property name="em

23、pList"><list><ref bean="emp2" /><ref bean="emp1"/><ref bean="emp1"/><ref bean="emp1"/><ref bean="emp1"/><ref bean="emp1"/><ref bean="emp1"/></list></property><

24、!- 給set注入值 set不能有相同的對象 -><property name="empsets"><set><ref bean="emp1" /><ref bean="emp2"/><ref bean="emp2"/><ref bean="emp2"/><ref bean="emp2"/></set></property><!- 給map注入值 map只有

25、key不一樣,就可以裝配value -><property name="empMaps"><map><entry key="11" value-ref="emp1" /> <entry key="22" value-ref="emp2"/><entry key="33" value-ref="emp1"/></map></property><!- 給屬性集合配置

26、 ->【點(diǎn)http協(xié)議 referer 】<property name="pp"><props><prop key="pp1">abcd</prop><prop key="pp2">hello</prop></props></property></bean><bean id="emp1" class="com.hsp.collection.Employee"><pr

27、operty name="name" value="北京"/><property name="id" value="1"/></bean><bean id="emp2" class="com.hsp.collection.Employee"><property name="name" value="天津"/><property name="id" value

28、="2"/></bean></beans> 內(nèi)部bean<bean id=”foo” class=”.Foo”><property name=”屬性”><!第一方法引用-><ref bean=bean對象名/><!內(nèi)部bean-><bean> <properyt></property></bean></property></bean> 繼承配置public class Student public class Gr

29、adate extends Student在beans.xml文件中體現(xiàn)配置 <!- 配置一個學(xué)生對象 -><bean id="student" class="com.hsp.inherit.Student"><property name="name" value="順平" /><property name="age" value="30"/></bean><!- 配置Grdate對象 -><bea

30、n id="grdate" parent="student" class="com.hsp.inherit.Gradate"><!- 如果自己配置屬性name,age,則會替換從父對象繼承的數(shù)據(jù) -><property name="name" value="小明"/><property name="degree" value="學(xué)士"/></bean>思考: 目前我們都是通過set方式給bean注入值,

31、spring還提供其它的方式注入值,比如通過構(gòu)造函數(shù)注入值!u 通過構(gòu)造函數(shù)注入值beans.xml 關(guān)鍵代碼:<!- 配置一個雇員對象 -><bean id="employee" class="com.hsp.constructor.Employee"><!- 通過構(gòu)造函數(shù)來注入屬性值 -><constructor-arg index="0" type="java.lang.String" value="大明" /></bean>u

32、自動裝配bean的屬性值(1) byName的用法:<!- 配置一個master對象 -><bean id="master" class="com.hsp.autowire.Master" autowire="byName"><property name="name"><value>順平</value></property></bean><!- 配置dog對象 -><bean id="dog"

33、class="com.hsp.autowire.Dog"><property name="name" value="小黃"/><property name="age" value="3"/></bean>原理圖:(2) byType: byType:尋找和屬性類型相同的bean,找不到,裝不上,找到多個拋異常。(3) constructor: autowire="constructor"說明 : 查找和bean的構(gòu)造參數(shù)一致的一個或

34、多個bean,若找不到或找到多個,拋異常。按照參數(shù)的類型裝配 (4) autodetect說明 : autowire="autodetect"(3)和(2)之間選一個方式。不確定 性的處理與(3)和(2)一致。(5) defualt這個需要在<beans defualt-autorwire=“指定” />當(dāng)你在<beans >指定了 default-atuowrite后, 所有的bean的 默認(rèn)的autowire就是 指定的裝配方法;如果沒有在<beans defualt-autorwire=“指定” /> 沒有 defualt-auto

35、rwire=“指定” ,則默認(rèn)是defualt-autorwire=”no”(6) no: 不自動裝配使用spring的特殊bean,完成分散配置:beans.xml說明: 當(dāng)通過 context:property-placeholder 引入 屬性文件的時候,有多個需要使用 , 號間隔.<!- 引入我們的perties文件 -><context:property-placeholder location="classpath:com/hsp/dispatch/perties,classpath:com/hsp/dispatch/db2.pr

36、operties"/><!- 配置一DBUtil對象 $占位符號 -><bean id="dbutil" class="com.hsp.dispatch.DBUtil"><property name="name" value="$name" /><property name="drivername" value="$drivername" /><property name="url" value="$url" /><property name="pwd" value="$pwd" /></bean><!- 配置一DBUtil對象 -><bean id="dbutil2" class="com.hsp.dispatch.DBUtil"><property name="name" value="$" /><property name=&qu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論