-Spring
[圖片上傳中管引。士败。。(1)]
導(dǎo)包:
4個(gè)必須的包褥伴,logging(這個(gè)包是阿帕奇下面的那個(gè))
日志包C:\Users\Administrator\Desktop\day100\jar包\JAR包\spring3\spring-framework-3.0.2.RELEASE-dependencies\org.apache.log4j\com.springsource.org.apache.log4j\1.2.15
以上5個(gè)必須的包谅将。
log4j主要是針對老的版本,建議也導(dǎo)入
src下面的總配置文件重慢,取名建議這樣applicationContext.xml
導(dǎo)入約束文件:
1饥臂,打開preference,搜索cata———>add---->file system找到解壓包中的schema找里面的beans文件夾某一個(gè)似踱。
2.key type選擇Schema location隅熙,然后把location最后的文件名復(fù)制到key的最后。
3,將其導(dǎo)入到配置文件核芽,在applicationContext中囚戚,寫<beans><beans>,然后調(diào)整到design,右鍵beans-->Edit namespace-->add-->xsi-->確認(rèn)轧简,
再點(diǎn)add驰坊,選擇Specify new Nnamespace,Browse吉懊,選擇select xml catalog entry庐橙,找到剛才導(dǎo)入的schema,再把去掉文件的部分粘貼到上面一行
或者采用直接復(fù)制的方式:
1.必須的約束
spring-framework-3.2.0.RELEASE-dist/spring-framework-3.2.0.RELEASE/docs/spring-framework-reference/htmlsingle/index.html#spring-core 目錄5. The IoC container 5.2.1的位置
set方法注入:
Spring容器在初始化的時(shí)候就已經(jīng)創(chuàng)建對象了
<property name="name" value="張三"></property> 設(shè)置靜態(tài)值的時(shí)候用value
<property name="name" ref="car"></property> 設(shè)置引用類型用ref
[圖片上傳中借嗽。态鳖。。(2)]
配置文件依賴注入格式:(記得set和get方法)
[圖片上傳中恶导。浆竭。。(3)]
方式二:
采用自動注入
[圖片上傳中惨寿。邦泄。。(4)]
對象的注入方式:
[圖片上傳中裂垦。顺囊。。(5)]
實(shí)例化的方式:
1.配置文件注入蕉拢,控制反轉(zhuǎn)ioc
2.靜態(tài)工廠
3.實(shí)例工廠
2
[圖片上傳中特碳。诚亚。。(6)]
[圖片上傳中午乓。站宗。。(7)]
3
[圖片上傳中益愈。梢灭。。(8)]
[圖片上傳中蒸其。敏释。。(9)]
作用域:用于確定spring創(chuàng)建bean實(shí)例個(gè)數(shù)
singleton 單例枣接,默認(rèn)值颂暇。
prototype 多例,每執(zhí)行一次getBean將獲得一個(gè)實(shí)例但惶。
可以通過scope屬性對其進(jìn)行單例或者多例的設(shè)置
junit的創(chuàng)建規(guī)則:
[圖片上傳中耳鸯。。膀曾。(10)]
建立一個(gè)和src同級的資源文件夾县爬,包名和你要測試類的包名一致,類名(建立junit類)名和要測試的類名一致后面加Test
采用注解的方式來進(jìn)行:
1加入約束
2開啟包掃描
注解的方式:
加上約束添谊,開啟包掃描:
[圖片上傳中财喳。。斩狱。(11)]
注解實(shí)現(xiàn)bean的裝配
添加約束文件耳高,再開啟包掃描
spring3/spring-framework-3.2.0.RELEASE-dist/spring-framework-3.2.0.RELEASE/docs/spring-framework-reference/html/xsd-config.html 2.8位置
開啟包掃面 <context:component-scan base-package="com.qy"/>
@Autowired,Resource 自動裝配依賴所踊,默認(rèn)是按照類型來裝配
@Resource(name="userDao")泌枪,自動按照名字來裝配
@Scope("prototype")
@Repository:dao層
@Service:service層
@Controller:web層
代理模式:
[圖片上傳中。秕岛。碌燕。(12)]
條件:目標(biāo)對象和代理對象要實(shí)現(xiàn)同一個(gè)接口,在目標(biāo)對象和增強(qiáng)類的方法完成后继薛,在代理對象的構(gòu)造方法中傳入增強(qiáng)和目標(biāo)對象這兩個(gè)參數(shù)修壕,在代理對象的重寫方法中目標(biāo)對象和增強(qiáng)各自調(diào)用自己的方法,然后直接new代理類調(diào)用重寫接口的方法遏考。
[圖片上傳中慈鸠。。灌具。(13)]
[圖片上傳中青团。像棘。。(14)]
(已過時(shí))
[圖片上傳中壶冒。。截歉。(15)]
Spring的aop:
連接點(diǎn)(Joinpoint):目標(biāo)對象中所有可以增強(qiáng)的方法
切點(diǎn)(Pointcut):目標(biāo)對象已經(jīng)增強(qiáng)的方法
增強(qiáng)/通知(Advice):增強(qiáng)的代碼
目標(biāo)對象(Target):被代理的對象
織入(Weaving):將增強(qiáng)應(yīng)用到連接點(diǎn)的過程
代理(Proxy):將通知織入到目標(biāo)對象之后胖腾,形成的代理對象
切面(aspect):切點(diǎn)+增強(qiáng)
2.采用jdk動態(tài)代理實(shí)現(xiàn):(缺點(diǎn):必須要有接口)
必須先創(chuàng)建一個(gè)接口,再創(chuàng)建一個(gè)實(shí)現(xiàn)類
[圖片上傳中瘪松。咸作。。(16)]
創(chuàng)建一個(gè)類實(shí)現(xiàn)InvocationHandler宵睦,然后寫構(gòu)造方法记罚,重寫invoke方法(注意全是反射下面的包)
[圖片上傳中。壳嚎。桐智。(17)]
用Proxy調(diào)用相應(yīng)的方法,獲得返回對象
[圖片上傳中烟馅。说庭。。(18)]
如果需要多層增強(qiáng)郑趁,那么下一次把代理類直接看成目標(biāo)對象
3.采用CGlib來實(shí)現(xiàn)動態(tài)代理
CGlib采用非常底層的字節(jié)碼技術(shù)刊驴,可以為一個(gè)類創(chuàng)建子類,并在子類中采用方法攔截技術(shù)攔截所有父類方法的調(diào)用寡润,并織入橫切邏輯
需要先導(dǎo)入包:\spring-framework-3.0.2.RELEASE-dependencies\net.sourceforge.cglib\com.springsource.net.sf.cglib\2.1.3
[圖片上傳中捆憎。。梭纹。(19)]
[圖片上傳中掷酗。读虏。。(20)]
創(chuàng)建增強(qiáng):
Spring使用增強(qiáng)類定義橫切邏輯,同時(shí)由于Spring只支持方法連接點(diǎn)欢摄,增強(qiáng)還包括了在方法的哪一點(diǎn)加入橫切代碼的方位信息,所以增強(qiáng)既包含橫切邏輯醒颖,還包含部分連接點(diǎn)的信息
AOP聯(lián)盟為增強(qiáng)定義了org.aopalliance.aop.Advice接口剿另,Spring支持5種類型的增強(qiáng)
前置增強(qiáng):org.springframework.aop.BeforeAdvice代表前置增強(qiáng),因?yàn)镾pring只支持方法級的增強(qiáng)逛钻,所以MethodBeforeAdvice是目前可用的前置增強(qiáng)僚焦,表示在目標(biāo)方法執(zhí)行前實(shí)施增強(qiáng),而BeforeAdvice是為了將來版本擴(kuò)展需要而定
后置增強(qiáng):org.springframework.aop.AfterReturningAdvice代表后增強(qiáng)曙痘,表示在目標(biāo)方法執(zhí)行后實(shí)施增強(qiáng)芳悲;
環(huán)繞增強(qiáng):org.aopalliance.intercept.MethodInterceptor代表環(huán)繞增強(qiáng)立肘,表示在目標(biāo)方法執(zhí)行前后實(shí)施增強(qiáng);
異常拋出增強(qiáng):org.springframework.aop.ThrowsAdvice代表拋出異常增強(qiáng)名扛,表示在目標(biāo)方法拋出異常后實(shí)施增強(qiáng)谅年;
先導(dǎo)入aop聯(lián)盟的包:spring-framework-3.0.2.RELEASE-dependencies\org.aopalliance
導(dǎo)入aop的包:spring-framework-3.2.0.RELEASE-dist\spring-framework-3.2.0.RELEASE\libs
創(chuàng)建的每個(gè)增強(qiáng)類實(shí)現(xiàn)上面的接口就行了,拋出異常增強(qiáng)得注意一下肮韧,那是一個(gè)空接口融蹂,方法的寫法是固定的
[圖片上傳中。弄企。超燃。(21)]
使用方式:
[圖片上傳中。拘领。意乓。(22)]
創(chuàng)建切面(注解實(shí)現(xiàn)):
AspectJ是一個(gè)面向切面的框架,它擴(kuò)展了Java語言约素。AspectJ定義了AOP語法届良,所以它有一個(gè)專門的編譯器用來生成遵守Java字節(jié)編碼規(guī)范的Class文件。
導(dǎo)入兩個(gè)包spring-framework-3.0.2.RELEASE-dependencies\org.aspectj
waver.jar和tools.jar
[圖片上傳中业汰。伙窃。。(23)]
注意在環(huán)繞增強(qiáng)的時(shí)候需要傳入?yún)?shù)样漆,而且注意寫法为障,還有就是匹配的方式有很多種,學(xué)會利用*和.
[圖片上傳中放祟。鳍怨。。(24)]
采用配置文件的方式來進(jìn)行創(chuàng)建:
需要先添加約束文件:2.7
[圖片上傳中跪妥。鞋喇。。(25)]
[圖片上傳中眉撵。侦香。。(26)]
Spring對dao層的封裝
spring-jdbc 主要封裝了spring以JDBC方式對數(shù)據(jù)庫訪問的各種操作類
spring-tx 主要就是封裝了spring對于事物的控制
spring-framework-3.2.0.RELEASE-dist\spring-framework-3.2.0.RELEASE\libs\spring-tx-3.2.0.RELEASE.jar
dependencies\org.apache.commons\com.springsource.org.apache.commons.dbcp\1.2.2.osgi\com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
spring-framework-3.2.0.RELEASE-dist\spring-framework-3.2.0.RELEASE\libs\spring-jdbc-3.2.0.RELEASE.jar
spring-framework-3.0.2.RELEASE-dependencies\org.apache.commons\com.springsource.org.apache.commons.pool
[圖片上傳中纽疟。罐韩。。(27)]
[圖片上傳中污朽。散吵。。(28)]
[圖片上傳中。矾睦。晦款。(29)]
接口回調(diào):
[圖片上傳中。枚冗。缓溅。(30)]
[圖片上傳中。赁温。肛宋。(31)]
[圖片上傳中。束世。。(32)]
dataSource包含了連接數(shù)據(jù)庫的一些參數(shù)床玻,那么jdbcTemplate含有dataSource的引用毁涉,是對dataSource進(jìn)行了封裝
[圖片上傳中。锈死。贫堰。(33)]
在經(jīng)過依賴注入后可直接用jdbcTemplate操作數(shù)據(jù)庫
[圖片上傳中。待牵。其屏。(34)]
dao繼承JdbcDaoSupport
[圖片上傳中。缨该。偎行。(35)]
jdbcDaoSupport對jdbcTemplate和dataSource都進(jìn)行了封裝,往里面注入
一個(gè)即可贰拿,一定要使用dataSource
查詢:List<User> list = this.getJdbcTemplate().query("select * from user", ParameterizedBeanPropertyRowMapper.newInstance(User.class));
通過讀取配置文件的方式來獲得數(shù)據(jù)庫的連接信息
[圖片上傳中蛤袒。。膨更。(36)]
Spring管理事務(wù)
事務(wù)的特性:
1妙真、原子性(Atomicity):事務(wù)中的全部操作在數(shù)據(jù)庫中是不可分割的,要么全部完成荚守,要么均不執(zhí)行珍德。
2、一致性(Consistency):幾個(gè)并行執(zhí)行的事務(wù)矗漾,其執(zhí)行結(jié)果必須與按某一順序串行執(zhí)行的結(jié)果相一致锈候。
3、隔離性(Isolation):事務(wù)的執(zhí)行不受其他事務(wù)的干擾缩功,事務(wù)執(zhí)行的中間結(jié)果對其他事務(wù)必須是透明的晴及。
4、持久性(Durability):對于任意已提交事務(wù),系統(tǒng)必須保證該事務(wù)對數(shù)據(jù)庫的改變不被丟失虑稼,即使數(shù)據(jù)庫出現(xiàn)故障琳钉。
事務(wù)的隔離級別:
Read Uncommitted(讀取未提交內(nèi)容)
在該隔離級別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果蛛倦。本隔離級別很少用于實(shí)際應(yīng)用歌懒,因?yàn)樗男阅芤膊槐绕渌墑e好多少。讀取未提交的數(shù)據(jù)溯壶,也被稱之為臟讀(Dirty Read)及皂。
Read Committed(讀取提交內(nèi)容)
這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級別(但不是MySQL默認(rèn)的)。它滿足了隔離的簡單定義:一個(gè)事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變且改。這種隔離級別 也支持所謂的不可重復(fù)讀(Nonrepeatable Read)验烧,因?yàn)橥皇聞?wù)的其他實(shí)例在該實(shí)例處理其間可能會有新的commit,所以同一select可能返回不同結(jié)果又跛。
Repeatable Read(可重讀)
這是MySQL的默認(rèn)事務(wù)隔離級別碍拆,它確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí),會看到同樣的數(shù)據(jù)行慨蓝。不過理論上感混,這會導(dǎo)致另一個(gè)棘手的問題:幻讀 (Phantom Read)。簡單的說礼烈,幻讀指當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時(shí)弧满,另一個(gè)事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時(shí)此熬,會發(fā)現(xiàn)有新的“幻影” 行庭呜。InnoDB和Falcon存儲引擎通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機(jī)制解決了該問題犀忱。
Serializable(可串行化)
這是最高的隔離級別疟赊,它通過強(qiáng)制事務(wù)排序,使之不可能相互沖突峡碉,從而解決幻讀問題近哟。簡言之,它是在每個(gè)讀的數(shù)據(jù)行上加上共享鎖鲫寄。在這個(gè)級別吉执,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競爭。
這四種隔離級別采取不同的鎖類型來實(shí)現(xiàn)地来,若讀取的是同一個(gè)數(shù)據(jù)的話戳玫,就容易發(fā)生問題。例如:
臟讀(Drity Read):某個(gè)事務(wù)已更新一份數(shù)據(jù)未斑,另一個(gè)事務(wù)在此時(shí)讀取了同一份數(shù)據(jù)咕宿,由于某些原因,前一個(gè)RollBack了操作,則后一個(gè)事務(wù)所讀取的數(shù)據(jù)就會是不正確的府阀。
不可重復(fù)讀(Non-repeatable read):在一個(gè)事務(wù)的兩次查詢之中數(shù)據(jù)不一致缆镣,這可能是兩次查詢過程中間插入了一個(gè)事務(wù)更新的原有的數(shù)據(jù)。
幻讀(Phantom Read):在一個(gè)事務(wù)的兩次查詢中數(shù)據(jù)筆數(shù)不一致试浙,例如有一個(gè)事務(wù)查詢了幾列(Row)數(shù)據(jù)董瞻,而另一個(gè)事務(wù)卻在此時(shí)插入了新的幾列數(shù)據(jù),先前的事務(wù)在接下來的查詢中田巴,就會發(fā)現(xiàn)有幾列數(shù)據(jù)是它先前所沒有的钠糊。
在MySQL中,實(shí)現(xiàn)了這四種隔離級別壹哺,分別有可能產(chǎn)生問題如下所示:
[圖片上傳中抄伍。。管宵。(37)]
http://www.cnblogs.com/melody210218/p/7120559.html
Spring的事務(wù)管理:
spring-tx-3.2.0.RELEASE.jar
spring-jdbc-3.2.0.RELEASE.jar
spring-orm-3.2.0.RELEASE.jar
配置:
1逝慧,為service注入事務(wù)管理模板對象
2,為事務(wù)模板對象注入事務(wù)管理器
3啄糙,為事務(wù)管理器注入數(shù)據(jù)源
[圖片上傳中。云稚。隧饼。(38)]
service固定寫法:
[圖片上傳中。静陈。燕雁。(39)]
半自動化的方式
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
必須要有接口,加載的是代理類
需要導(dǎo)入相關(guān)的包鲸拥,aop和aop聯(lián)盟的包
[圖片上傳中拐格。。刑赶。(40)]
在spring xml 配置aop 自動生成代理捏浊,進(jìn)行事務(wù)的管理
1.配置管理器
2.配置事務(wù)策略
3.配置aop
[圖片上傳中。撞叨。金踪。(41)]
AOP全自動的方式-注解
配置事務(wù)管理器,將并事務(wù)管理器交予spring
在目標(biāo)類或目標(biāo)方法添加注解即可 @Transactional
[圖片上傳中牵敷。胡岔。。(42)]
[圖片上傳中枷餐。靶瘸。。(43)]
[圖片上傳中。怨咪。屋剑。(44)]
Spring整合hibernate
[圖片上傳中。惊暴。饼丘。(45)]
整合Struts2,導(dǎo)入相關(guān)的包辽话,然后配置一個(gè)監(jiān)聽器
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
[圖片上傳中肄鸽。。油啤。(46)]
第二種配置方式:
取消了hibernate的配置文件典徘,交由spring來管理,并且action也由spring來注入益咬,但是在配置action的時(shí)候要注意逮诲,要配置成多例,struts配置文件里面直接寫spring配置文件里面的id進(jìn)行注入幽告。
[圖片上傳中梅鹦。。冗锁。(47)]
[圖片上傳中齐唆。。冻河。(48)]