欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)邀請(qǐng)碼778899分享:數(shù)據(jù)庫(kù) java

柚子快報(bào)邀請(qǐng)碼778899分享:數(shù)據(jù)庫(kù) java

http://yzkb.51969.com/

Spring為了降低Java開(kāi)發(fā)的復(fù)雜性,采用了以下四種策略

基于POJO的輕量級(jí)和最小侵入性編程; 通過(guò)依賴注入和面向接口實(shí)現(xiàn)松耦合; 基于切面和慣例進(jìn)行聲明式編程; 通過(guò)切面和模板減少樣板式代碼。

下面簡(jiǎn)單介紹一下這四種策略分別是什么:

1、激發(fā)POJO的潛能:

Spring竭力避免因自身的API而弄亂你的應(yīng)用代碼。Spring不會(huì)強(qiáng)迫你實(shí)現(xiàn)Spring規(guī)范的接口或繼承Spring規(guī)范的類,相反,在基于Spring構(gòu)建的應(yīng)用中,它的類通常沒(méi)有任何痕跡表明你使用了Spring。最壞的場(chǎng)景是,一個(gè)類或許會(huì)使用Spring注解,但它依舊是POJO

2、依賴注入:

任何一個(gè)有實(shí)際意義的應(yīng)用(肯定比Hello World示例更復(fù)雜)都會(huì)由兩個(gè)或者更多的類組成,這些類相互之間進(jìn)行協(xié)作來(lái)完成特定的業(yè)務(wù)邏輯。按照傳統(tǒng)的做法,每個(gè)對(duì)象負(fù)責(zé)管理與自己相互協(xié)作的對(duì)象(即它所依賴的對(duì)象)的引用,這將會(huì)導(dǎo)致高度耦合和難以測(cè)試的代碼。通過(guò)DI,對(duì)象的依賴關(guān)系將由系統(tǒng)中負(fù)責(zé)協(xié)調(diào)各對(duì)象的第三方組件在創(chuàng)建對(duì)象的時(shí)候進(jìn)行設(shè)定。對(duì)象無(wú)需自行創(chuàng)建或管理它們的依賴關(guān)系依賴關(guān)系將被自動(dòng)注入到需要它們的對(duì)象當(dāng)中去。

3、面向切面:

DI能夠讓相互協(xié)作的軟件組件保持松散耦合,而面向切面編程(aspect-oriented programming,AOP)允許你把遍布應(yīng)用各處的功能分離出來(lái)形成可重用的組件。面向切面編程往往被定義為促使軟件系統(tǒng)實(shí)現(xiàn)關(guān)注點(diǎn)的分離一項(xiàng)技術(shù)。系統(tǒng)由許多不同的組件組成,每一個(gè)組件各負(fù)責(zé)一塊特定功能。除了實(shí)現(xiàn)自身核心的功能之外,這些組件還經(jīng)常承擔(dān)著額外的職責(zé)。諸如日志、事務(wù)管理和安全這樣的系統(tǒng)服務(wù)經(jīng)常融入到自身具有核心業(yè)務(wù)邏輯的組件中去,這些系統(tǒng)服務(wù)通常被稱為橫切關(guān)注點(diǎn),因?yàn)樗鼈儠?huì)跨越系統(tǒng)的多個(gè)組件。

?編輯

4、使用模板消除樣板式代碼:

有過(guò)java開(kāi)發(fā)經(jīng)驗(yàn)的同學(xué)應(yīng)該都知道在使用JDBC操作數(shù)據(jù)庫(kù)時(shí)的步驟有多繁瑣,下面我來(lái)看一下JDBC操作數(shù)據(jù)庫(kù)的代碼

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 import?java.sql.Connection; import?java.sql.DriverManager; import?java.sql.ResultSet; import?java.sql.SQLException; import?java.sql.Statement; ? public?class?Demo { ????public?static?void?main(String[] args) { ????????String url =?"jdbc:mysql://localhost:3306/person"; ????????String user =?"root"; ????????String pwd =?"admin"; ????????String sql =?"select * from student"; ????????? ????????Connection conn =?null; ????????Statement st =?null; ????????ResultSet rs =?null; ????????try?{ ????????????Class.forName("com.mysql.jdbc.Driver"); ????????????conn = DriverManager.getConnection(url,user,pwd); ????????????st = conn.createStatement(); ????????????//執(zhí)行查詢語(yǔ)句,另外也可以用execute(),代表執(zhí)行任何SQL語(yǔ)句 ????????????rs = st.executeQuery(sql); ????????????while(rs.next()) { ????????????????System.out.println(rs.getObject(1) +?"? "?+ ????????????????????????rs.getObject(2) +?"? "?+ rs.getInt("birth")); ????????????} ????????//分別捕獲異常 ????????}?catch?(ClassNotFoundException e) { ????????????e.printStackTrace(); ????????}?catch?(SQLException e) { ????????????e.printStackTrace(); ????????}?finally?{ ????????????try?{ ????????????????//判斷資源是否存在 ????????????????if(rs !=?null) { ????????????????????rs.close(); ????????????????????//顯示的設(shè)置為空,提示gc回收 ????????????????????rs =?null; ????????????????} ????????????????if(st !=?null) { ????????????????????st.close(); ????????????????????st =?null; ????????????????} ????????????????if(conn !=?null) { ????????????????????conn.close(); ????????????????????conn =?null; ????????????????} ????????????}?catch?(SQLException e) { ????????????????e.printStackTrace(); ????????????}??? ????????} ????} }

估計(jì)很少有讀者能將這段代碼一行一行的看完,因?yàn)閷?shí)在是太長(zhǎng)了。

JDBC不是產(chǎn)生樣板式代碼的唯一場(chǎng)景。在許多編程場(chǎng)景中往往都會(huì)導(dǎo)致類似的樣板式代碼,JMS、JNDI和使用REST服務(wù)通常也涉及大量的重復(fù)代碼。Spring旨在通過(guò)模板封裝來(lái)消除樣板式代碼。Spring的JdbcTemplate使得執(zhí)行數(shù)據(jù)庫(kù)操作時(shí),避免傳統(tǒng)的JDBC樣板代碼成為了可能。

1|2二、容納Bean

在基于Spring的應(yīng)用中,你的應(yīng)用對(duì)象生存于Spring容器(container)中。如下圖所示,Spring容器負(fù)責(zé)創(chuàng)建對(duì)象,裝配它們,配置它們并管理它們的整個(gè)生命周期,從生存到死亡(在這里,可能就是new到finalize())。?編輯

Spring容器是Spring的核心,Spring自帶了多個(gè)容器實(shí)現(xiàn),可以歸為兩種不同的類型。bean工廠(由org.springframework.beans.factory.eanFactory接口定義)是最簡(jiǎn)單的容器,提供基本的DI支持。應(yīng)用上下文(由org.springframework.context.ApplicationContext接口定義)基于BeanFactory構(gòu)建,并提供應(yīng)用框架級(jí)別的服務(wù),例如從屬性文件解析文本信息以及發(fā)布應(yīng)用事件給感興趣的事件監(jiān)聽(tīng)者。通常我們使用的是應(yīng)用上下文,因?yàn)閎ean工廠對(duì)大多數(shù)開(kāi)發(fā)者來(lái)說(shuō)功能比較薄弱。

1、使用應(yīng)用上下文:

?Spring自帶了多種類型的應(yīng)用上下文

AnnotationConfigApplicationContext:從一個(gè)或多個(gè)基于Java的配置類中加載Spring應(yīng)用上下文。AnnotationConfigWebApplicationContext:從一個(gè)或多個(gè)基于Java的配置類中加載Spring Web應(yīng)用上下文。ClassPathXmlApplicationContext:從類路徑下的一個(gè)或多個(gè)XML配置文件中加載上下文定義,把應(yīng)用上下文的定義文件作為類資源。FileSystemXmlapplicationcontext:從文件系統(tǒng)下的一個(gè)或多個(gè)XML配置文件中加載上下文定義。XmlWebApplicationContext:從Web應(yīng)用下的一個(gè)或多個(gè)XML配置文件中加載上下文定義

2、bean的生命周期:

在傳統(tǒng)的Java應(yīng)用中,bean的生命周期很簡(jiǎn)單。使用Java關(guān)鍵字new進(jìn)行bean實(shí)例化,然后該bean就可以使用了。一旦該bean不再被使用,則由Java自動(dòng)進(jìn)行垃圾回收。相比之下,Spring容器中的bean的生命周期就顯得相對(duì)復(fù)雜多了

?編輯

1、Spring對(duì)bean進(jìn)行實(shí)例化;

2、Spring將值和bean的引用注入到bean對(duì)應(yīng)的屬性中;

3、如果bean實(shí)現(xiàn)了BeanNameAware接口,Spring將bean的ID傳遞給setBean-Name()方法;

4、如果bean實(shí)現(xiàn)了BeanFactoryAware接口,Spring將調(diào)用setBeanFactory()方法,將BeanFactory容器實(shí)例傳入;

5、如果bean實(shí)現(xiàn)了ApplicationContextAware接口,Spring將調(diào)用setApplicationContext()方法,將bean所在的應(yīng)用上下文的引用傳入進(jìn)來(lái);

6、如果bean實(shí)現(xiàn)了BeanPostProcessor接口,Spring將調(diào)用它們的post-ProcessBeforeInitialization()方法;

7、如果bean實(shí)現(xiàn)了InitializingBean接口,Spring將調(diào)用它們的after-PropertiesSet()方法。類似地,如果bean使用init-method聲明了初始化方法,該方法也會(huì)被調(diào)用;

8、如果bean實(shí)現(xiàn)了BeanPostProcessor接口,Spring將調(diào)用它們的post-ProcessAfterInitialization()方法;

9、此時(shí),bean已經(jīng)準(zhǔn)備就緒,可以被應(yīng)用程序使用了,它們將一直駐留在應(yīng)用上下文中,直到該應(yīng)用上下文被銷毀;

10、如果bean實(shí)現(xiàn)了DisposableBean接口,Spring將調(diào)用它的destroy()接口方法。同樣,如果bean使用destroy-method聲明了銷毀方法,該方法也會(huì)被調(diào)用

3、Spring的核心模塊:

?編輯

?我們來(lái)逐一分析一下Sping的各個(gè)組成模塊

Spring核心容器

容器是Spring框架最核心的部分,它管理著Spring應(yīng)用中bean的創(chuàng)建、配置和管理。在該模塊中,包括了Spring bean工廠,它為Spring提供了DI的功能?;赽ean工廠,我們還會(huì)發(fā)現(xiàn)有多種Spring應(yīng)用上下文的實(shí)現(xiàn),每一種都提供了配置Spring的不同方式。

除了bean工廠和應(yīng)用上下文,該模塊也提供了許多企業(yè)服務(wù),例如E-mail、JNDI訪問(wèn)、EJB集成和調(diào)度。所有的Spring模塊都構(gòu)建于核心容器之上。當(dāng)你配置應(yīng)用時(shí),其實(shí)你隱式地使用了這些類。

Spring的AOP模塊

?在AOP模塊中,Spring對(duì)面向切面編程提供了豐富的支持。這個(gè)模塊是Spring應(yīng)用系統(tǒng)中開(kāi)發(fā)切面的基礎(chǔ)。與DI一樣,AOP可以幫助應(yīng)用對(duì)象解耦。借助于AOP,可以將遍布系統(tǒng)的關(guān)注點(diǎn)(例如事務(wù)和安全)從它們所應(yīng)用的對(duì)象中解耦出來(lái)。

數(shù)據(jù)訪問(wèn)和集成

使用JDBC編寫(xiě)代碼通常會(huì)導(dǎo)致大量的樣板式代碼,例如獲得數(shù)據(jù)庫(kù)連接、創(chuàng)建語(yǔ)句、處理結(jié)果集到最后關(guān)閉數(shù)據(jù)庫(kù)連接。Spring的JDBC和DAO(Data Access Object)模塊抽象了這些樣板式代碼,使我們的數(shù)據(jù)庫(kù)代碼變得簡(jiǎn)單明了,還可以避免因?yàn)殛P(guān)閉數(shù)據(jù)庫(kù)資源失敗而引發(fā)的問(wèn)題。該模塊在多種數(shù)據(jù)庫(kù)服務(wù)的錯(cuò)誤信息之上構(gòu)建了一個(gè)語(yǔ)義豐富的異常層,以后我們?cè)僖膊恍枰忉屇切╇[晦專有的SQL錯(cuò)誤信息了!

Web與遠(yuǎn)程調(diào)用

?MVC(Model-View-Controller)模式是一種普遍被接受的構(gòu)建Web應(yīng)用的方法,它可以幫助用戶將界面邏輯與應(yīng)用邏輯分離。Java從來(lái)不缺少M(fèi)VC框架,Apache的Struts、JSF、WebWork和Tapestry都是可選的最流行的MVC框架。

2|0Spring裝配bean

2|1一、Spring裝配的三種方式

1、在XML中進(jìn)行顯示配置

2、在Java中進(jìn)行顯示配置

3、隱式的bean的發(fā)現(xiàn)機(jī)制和自動(dòng)裝配

至于哪一種裝配方式好,這里沒(méi)有統(tǒng)一的答案,讀者可以選擇適合自己的方案進(jìn)行bean的裝配

2|2二、自動(dòng)化裝配bean

1、Spring 從兩個(gè)角度來(lái)實(shí)現(xiàn)自動(dòng)化裝配bean :

組件掃描:Spring會(huì)自動(dòng)發(fā)現(xiàn)應(yīng)用上下文中所創(chuàng)建的bean自動(dòng)裝配:Spring自動(dòng)滿足bean之間的依賴

2、創(chuàng)建可被發(fā)現(xiàn)的bean:

接下來(lái)我將用一個(gè)CD播放器案例來(lái)說(shuō)明整個(gè)自動(dòng)化裝配bean的過(guò)程,該項(xiàng)目是一個(gè)Maven項(xiàng)目,進(jìn)行實(shí)驗(yàn)前需要引入相關(guān)Maven配置文件,對(duì)Maven還不了解的同學(xué)建議去學(xué)習(xí)相關(guān)資料,這里不再贅述

第一步:創(chuàng)建CompactDisc接口,接口中包含了一個(gè)play()方法

1 2 3 4 5 package?soundsystem; public?interface?CompactDisc { ????void?play(); }

CompactDisc的具體內(nèi)容并不重要,重要的是你將其定義為一個(gè)接口。作為接口,它定義了CD播放器對(duì)一盤CD所能進(jìn)行的操作。它將CD播放器的任意實(shí)現(xiàn)與CD本身的耦合降低到了最小的程度。

第二步:我們還需要一個(gè)CompactDisc的實(shí)現(xiàn),SgtPeppers實(shí)現(xiàn)了CompactDisc接口

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package?soundsystem; import?org.springframework.stereotype.Component; @Component?//該類是一個(gè)組件類 public?class?SgtPeppers?implements?CompactDisc { ????private?String title =?"曾經(jīng)的你"; ????private?String artist =?"許巍"; ????@Override ????public?void?play() { ????????System.out.println("Playing "?+ title +?" by "?+ artist); ????} }

和CompactDisc接口一樣,Sgtpeppers的具體內(nèi)容并不重要。你需要注意的就是SgtPeppers類上使用了@Component注解。這個(gè)簡(jiǎn)單的注解表明該類會(huì)作為組件類,并告知Spring要為這個(gè)類創(chuàng)建bean。沒(méi)有必要顯式配置Sgtpeppers bean,因?yàn)檫@個(gè)類使用了@Component注解,所以Spring會(huì)為你把事情處理妥當(dāng)。

第三步:我們聲明了組件類之后Spring并不知道這個(gè)組件類,所以我們還需要開(kāi)啟組件掃描,讓Spring去查找相關(guān)的組件類。新建一個(gè)CDPlayerConfig類

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package?soundsystem; import?org.springframework.context.annotation.ComponentScan; import?org.springframework.context.annotation.Configuration; @Configuration?//Configuration注解表明該類是一個(gè)配置類 @ComponentScan?//ComponentScan注解表示開(kāi)啟組件掃描,默認(rèn)是掃描當(dāng)前包下的組件 public?class?CDPlayerConfig { ????/*@Bean ????public CompactDisc compactDisc() { ????????return new SgtPeppers(); ????} ????@Bean ????public CDPlayer cdPlayer(CompactDisc compactDisc) { ????????return new CDPlayer(compactDisc); ????}*/ }

第四步:下面我們來(lái)測(cè)試一下自動(dòng)裝配是否成功

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package?soundsystem; import?org.junit.Test; import?org.junit.runner.RunWith; import?org.springframework.beans.factory.annotation.Autowired; import?org.springframework.test.context.ContextConfiguration; import?org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes=CDPlayerConfig.class) public?class?CDPlayTest { ????@Autowired?//@Autowired注解將CompactDisc注入到測(cè)試代碼中,稍后會(huì)講解到 ????private?CompactDisc compactDisc; ????@Test ????public?void?play() { ????????compactDisc.play(); ????} }

運(yùn)行結(jié)果:

1 Playing 曾經(jīng)的你 by 許巍

我們看到結(jié)果正常輸出,說(shuō)明我們的自動(dòng)裝配成功

3、自動(dòng)裝配中的注解介紹:

@Component:

@Component注解表明該類作為組件類,并告知Spring要為這個(gè)類創(chuàng)建bean,另外@Component中還可以傳入一個(gè)參數(shù),用于為這個(gè)bean設(shè)置ID,如果你之前有過(guò)通過(guò)xml文件配置bean的經(jīng)驗(yàn)話就知道在配置bean的時(shí)候就需要設(shè)置bean的id。

@Component("cdplay"),這個(gè)注解表明當(dāng)前bean的ID為cdplay

@ComponentScan:

@ComponentScan默認(rèn)會(huì)掃描與配置類相同的包,比如上面的程序中因?yàn)镃DPlayerConfig類位于soundsystem包中,因此Spring將會(huì)掃描這個(gè)包以及這個(gè)包下的所有子包,查找?guī)в蠤Component注解的類。這樣的話,就能發(fā)現(xiàn)CompactDisc,并且會(huì)在Spring中自動(dòng)為其創(chuàng)建一個(gè)bean。我們也可以為該注解傳入?yún)?shù),讓其掃描指定的包:@ComponentScan(basePackages={"soundsystem","video"}),掃描soundsystem和video包下的組件

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 //直接在value屬性中指明包的名稱 @Configuration @ComponentScan("soundsystem") public?class?CDPlayerConfig{} //通過(guò)basePackages屬性配置 @Configuration @ComponentScan(basePackages="soundsystem") public?class?CDPlayerConfig{} //設(shè)置多個(gè)基礎(chǔ)包,用數(shù)組表示 @Configuration @ComponentScan(basePackages={"soundsystem","video"}) public?class?CDPlayerConfig{} //基礎(chǔ)包以String類型表示是不安全的,如果重構(gòu)代碼的話,指定的基礎(chǔ)包可能會(huì)出現(xiàn)錯(cuò)誤,用指定為包中所包含的類或接口的方法 @Configuration @ComponentScan(basePackageClasses={CDPlayer.class,DVDPlayer.class}) public?class?CDPlayerConfig{}

@Autowired:

簡(jiǎn)單來(lái)說(shuō),自動(dòng)裝配就是讓Spring自動(dòng)滿足bean依賴的一種方法,在滿足依賴的過(guò)程中,會(huì)在Spring應(yīng)用上下文中尋找匹配某個(gè)bean需求的其他bean。為了聲明要進(jìn)行自動(dòng)裝配,我們可以借助Spring的@Autowired注解。

比如上面的測(cè)試代碼添加了@Autowired注解,這表明當(dāng)Spring創(chuàng)建CDPlayer bean的時(shí)候,會(huì)通過(guò)這個(gè)構(gòu)造器來(lái)進(jìn)行實(shí)例化并且會(huì)傳入一個(gè)可設(shè)置給CompactDisc類型的bean。

1 2 3 4 5 6 7 8 9 10 11 12 13 @Component public?class?CDPlayer?implements?MediaPlayer{ ??private?CompactDisc cd; ??@Autowired//這表明當(dāng)Spring創(chuàng)建CDPlayer bean的時(shí)候,會(huì)通過(guò)這個(gè)構(gòu)造器來(lái)進(jìn)行實(shí)例化并且會(huì)傳入一個(gè)可設(shè)置給CompactDisc類型的bean. ??public?CDPlayer(CompactDisc cd){//構(gòu)造器 ????this.cd = cd; ??} ??public?void?paly(){ ????cd.paly(); ??} }

@Autowired注解不僅能夠用在構(gòu)造器上,還能用在屬性的Setter方法上.比如說(shuō),如果CDPlayer有一個(gè)setCompactDisc()方法,那么可以采用如下的注解形式進(jìn)行自動(dòng)裝配:

1 2 3 4 @Autowired public?void?setCompactDisc(CompactDisc cd){ ??this.cd = cd; }

但是如果沒(méi)有匹配的bean,那么在應(yīng)用上下文創(chuàng)建的時(shí)候,Spring會(huì)拋出一個(gè)異常,為了避免異常的出現(xiàn),你可以將@Autowired的requied屬性設(shè)置為false

1 2 3 4 @Autowired(required=false) public?void?setCompactDisc(CompactDisc cd){ ??this.cd = cd; }

2|3三、通過(guò)Java代碼裝配bean

盡管在很多場(chǎng)景下通過(guò)組件掃描和自動(dòng)裝配實(shí)現(xiàn)Spring的自動(dòng)化掃描配置是更為推薦的方式,但在有些情況下自動(dòng)化掃描的方案行不通,如想要將第三方庫(kù)中的組件裝配到自己的應(yīng)用中。在這種情況下必須通過(guò)顯示 裝配的方式。

顯示裝配有兩種可選方案:Java和XML。JavaConfig是更好的方案:更強(qiáng)大、類型安全并對(duì)重構(gòu)友好。因他就是Java代碼。

還是上面的那個(gè)案例,我們現(xiàn)在將它用Java代碼來(lái)實(shí)現(xiàn)裝配bean

接口:CompactDisc.java

1 2 3 4 5 package?soundsystem; public?interface?CompactDisc { ??void?play(); }

接口: MediaPlayer.java

1 2 3 4 5 package?soundsystem; public?interface?MediaPlayer { ??void?play(); }

CompactDisc的實(shí)現(xiàn)類:SgtPeppers.java

1 2 3 4 5 6 7 8 9 10 11 12 13 package?soundsystem; public?class?SgtPeppers?implements?CompactDisc { ??private?String title =?"曾經(jīng)的你";? ??private?String artist =?"許巍"; ??@Override ??public?void?play() { ????System.out.println("Playing "?+ title +?" by "?+ artist); ??} }

細(xì)心的讀者可以發(fā)現(xiàn),這里我們?nèi)サ袅薂Compenent注解

MediaPlayer的實(shí)現(xiàn)類:CDPlayer.java

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package?soundsystem; import?org.springframework.beans.factory.annotation.Autowired; public?class?CDPlayer?implements?MediaPlayer { ??private?CompactDisc cd; ??@Autowired ??public?CDPlayer(CompactDisc cd) { ????this.cd = cd; ??} ??@Override ??public?void?play() { ????cd.play(); ??} }

借助JavaConfig實(shí)現(xiàn)注入

CDPlayerConfig.java

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package?soundsystem; import?org.springframework.context.annotation.Bean; import?org.springframework.context.annotation.Configuration; @Configuration public?class?CDPlayerConfig { ??? ??@Bean ??public?CompactDisc compactDisc() { ????return?new?SgtPeppers(); ??} ??@Bean ??public?CDPlayer cdPlayer(CompactDisc compactDisc) { ????return?new?CDPlayer(compactDisc); ??} }

區(qū)別與自動(dòng)裝配,這里去掉了@ComponentScan注解,而是顯式的聲明了Bean。@Bean注解告訴了Spring上下文這個(gè)方法會(huì)將返回一個(gè)對(duì)象,該對(duì)象要注冊(cè)為Spring應(yīng)用上下文中的bean,方法體重包含了最終產(chǎn)生bean實(shí)例的實(shí)現(xiàn)邏輯。

測(cè)試類:CDPlayerTest.java

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package?soundsystem; import?org.junit.Test; import?org.junit.runner.RunWith; import?org.springframework.beans.factory.annotation.Autowired; import?org.springframework.test.context.ContextConfiguration; import?org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes=CDPlayerConfig.class) public?class?CDPlayerTest { ??@Autowired ??private?MediaPlayer player; ??@Test ??public?void?play() { ????player.play(); ??} }

依然可以得出正確的輸出結(jié)果

2|4四、通過(guò)XML裝配bean

XML 配置是最原始最古老的 Bean 的裝配方案,曾經(jīng)我們的項(xiàng)目離不開(kāi)它,而如今,我們卻在慢慢的拋棄它,沒(méi)辦法,時(shí)代在進(jìn)步,我們也要進(jìn)步呀。為了能看懂前輩們寫(xiě)的代碼,我們還是有必要來(lái)看一下如何通過(guò) XML 來(lái)裝配 Bean。

創(chuàng)建一個(gè)Book類:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 package?xmlTest; public?class?Book { ????private?Integer id; ????private?String name; ????private?Double price; ????public?Book() { ????} ????public?Book(Integer id, String name, Double price) { ????????this.id = id; ????????this.name = name; ????????this.price = price; ????} ????public?Integer getId() { ????????return?id; ????} ????public?void?setId(Integer id) { ????????this.id = id; ????} ????public?String getName() { ????????return?name; ????} ????public?void?setName(String name) { ????????this.name = name; ????} ????public?Double getPrice() { ????????return?price; ????} ????public?void?setPrice(Double price) { ????????this.price = price; ????} }

然后再在 resources 目錄下(用IDEA創(chuàng)建maven項(xiàng)目時(shí)會(huì)有一個(gè)resources文件夾)創(chuàng)建一個(gè) beans.xml 文件,作為 Spring 的配置文件,然后在里邊配置一個(gè) Book bean,如下:

1 2 3 4 5 6 ????

在這里,我們?cè)?class 屬性中配置類的全路徑,id 則表示 bean 的名稱,也可以通過(guò) name 屬性來(lái)指定 bean 的名稱,大部分場(chǎng)景下兩者無(wú)任何差別,會(huì)有一些特殊場(chǎng)景下(例如用,隔開(kāi)多個(gè)實(shí)例名,兩者的處理方案不同),兩者有區(qū)別。

接下來(lái)新建一個(gè)測(cè)試類,看一下我們的配置是否正確:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package?xmlTest; import?org.springframework.context.support.ClassPathXmlApplicationContext; public?class?BookTest { ????public?static?void?main(String[] args) { ????????ClassPathXmlApplicationContext ctx =?new?ClassPathXmlApplicationContext("classpath:bean.xml"); ????????Book book = (Book) ctx.getBean("book"); ????????System.out.println(book); ????} }

輸出結(jié)果:xmlTest.Book@e45f292

在配置 Bean 時(shí),給 Bean 指定相關(guān)的屬性值,我們有幾種不同的方式:

1.構(gòu)造方法指定:

?首先我們可以通過(guò)構(gòu)造方法指定 bean 的屬性值,前提是我們?yōu)?Book 類提供一個(gè)有參構(gòu)造方法(大家在創(chuàng)建有參構(gòu)造方法時(shí),一定記得再順手加一個(gè)無(wú)參構(gòu)造方法):

1 2 3 4 5 6 7 8 9 10 11 12 13 public?class?Book { ????private?Integer id; ????private?String name; ????private?Double price; ????public?Book() { ????} ????public?Book(Integer id, String name, Double price) { ????????this.id = id; ????????this.name = name; ????????this.price = price; ????} ????//省略 getter/setter }

然后在 XML 文件中,我們就可以通過(guò)構(gòu)造方法注入相關(guān)值了:

1 2 3 4 5 ???? ???? ????

使用構(gòu)造方法注入相關(guān)值的時(shí)候,也可以使用下標(biāo)來(lái)描述參數(shù)的順序,注意如果使用下標(biāo),參數(shù)順序不能錯(cuò):

1 2 3 4 5 ???? ???? ????

注入成功之后,當(dāng)我們?cè)俅稳カ@取 Bean 的時(shí)候,就可以看到這些屬性了。

2.通過(guò)屬性注入:

1 2 3 4 5 ???? ???? ????

3|0Spring的面向切面(AOP)

3|1一、面向切面編程簡(jiǎn)介

AOP(Aspect-Oriented Programming):面向切面的編程。OOP(Object-Oriented Programming)面向?qū)ο蟮木幊?。?duì)于OOP我們已經(jīng)再熟悉不過(guò)了,對(duì)于AOP,可能我們會(huì)覺(jué)得是一種新特性,其實(shí)AOP是對(duì)OOP的一種補(bǔ)充,OOP面向的是縱向編程,繼承、封裝、多態(tài)是其三大特性,而AOP是面向橫向的編程。

面向切面編程(AOP)通過(guò)提供另外一種思考程序結(jié)構(gòu)的途經(jīng)來(lái)彌補(bǔ)面向?qū)ο缶幊蹋∣OP)的不足。在OOP中模塊化的關(guān)鍵單元是類(classes),而在AOP中模塊化的單元?jiǎng)t是切面。切面能對(duì)關(guān)注點(diǎn)進(jìn)行模塊化,例如橫切多個(gè)類型和對(duì)象的事務(wù)管理。

3|2二、AOP術(shù)語(yǔ):

?與大多數(shù)技術(shù)一樣,AOP已經(jīng)形成了自己的術(shù)語(yǔ)。描述切面的常用術(shù)語(yǔ)有通知(advice)、切點(diǎn)(pointcut)和連接點(diǎn)(join point)。初學(xué)者在學(xué)習(xí)AOP時(shí)最頭疼的就是理解這些概念,包括我自己也是這樣,網(wǎng)上面的一些博客在介紹AOP時(shí)也只是從定義角度去解釋,不太容易理解,下面我將用一個(gè)日常生活中的例子來(lái)向大家介紹AOP術(shù)語(yǔ),方便大家理解。

我們現(xiàn)在每家每戶都需要用電,那么用電就會(huì)涉及到用電量和電費(fèi),在10年前科技還沒(méi)有如此發(fā)達(dá)的時(shí)候,我們的電費(fèi)都是需要專門的人員來(lái)收取的,電力公司會(huì)安排人員去到不同的地區(qū)進(jìn)行電表的查看和電費(fèi)的收取。

通知(Advice):

當(dāng)抄表員出現(xiàn)在我們家門口時(shí),他們要登記用電量并回去向電力公司報(bào)告。顯然,他們必須有一份需要抄表的住戶清單,他們所匯報(bào)的信息也很重要,但記錄用電量才是抄表員的主要工作。類似的,切面也有目標(biāo)——它必須要完成的工作。在AOP術(shù)語(yǔ)中,切面的工作被稱為通知。

Spring切面可以應(yīng)用5種類型的通知:

前置通知(Before):在目標(biāo)方法被調(diào)用之前調(diào)用通知功能;后置通知(After):在目標(biāo)方法完成之后調(diào)用通知,此時(shí)不會(huì)關(guān)心方法的輸出是什么;返回通知(After-returning):在目標(biāo)方法成功執(zhí)行之后調(diào)用通知;異常通知(After-throwing):在目標(biāo)方法拋出異常后調(diào)用通知;環(huán)繞通知(Around):通知包裹了被通知的方法,在被通知的方法調(diào)用之前和調(diào)用之后執(zhí)行自定義的行為。

連接點(diǎn)(Join Point):

電力公司為多個(gè)住戶提供服務(wù),甚至可能是整個(gè)城市。每家都有一個(gè)電表,這些電表上的數(shù)字都需要讀取,因此每家都是抄表員的潛在目標(biāo)。

同樣,我們的應(yīng)用可能也有數(shù)以千計(jì)的時(shí)機(jī)應(yīng)用通知。這些時(shí)機(jī)被稱為連接點(diǎn)。連接點(diǎn)是在應(yīng)用執(zhí)行過(guò)程中能夠插入切面的一個(gè)點(diǎn)。這個(gè)點(diǎn)可以是調(diào)用方法時(shí)、拋出異常時(shí)、甚至修改一個(gè)字段時(shí)。切面代碼可以利用這些點(diǎn)插入到應(yīng)用的正常流程之中,并添加新的行為。

切點(diǎn)(Poincut):

如果讓一個(gè)工作人員去抄寫(xiě)全市的所有電表,那么肯定是不現(xiàn)實(shí)的。實(shí)際上,電力公司會(huì)安排每一個(gè)抄表員負(fù)責(zé)一個(gè)地區(qū)的抄表工作,比如小宋負(fù)責(zé)陽(yáng)光小區(qū)的抄表工作,小馬負(fù)責(zé)歐風(fēng)小區(qū)的抄表工作。類似的,切點(diǎn)也是如此,一個(gè)程序中可能有很多連接點(diǎn),那么并不是每個(gè)連接點(diǎn)我們都需要通知,我們只需要通知部分的連接點(diǎn)即可,那么切點(diǎn)就是這個(gè)我們通知的連接點(diǎn)。

切面(Aspect):

當(dāng)抄表員開(kāi)始一天的工作時(shí),他知道自己要做的事情(報(bào)告用電量)和從哪些房屋收集信息。因此,他知道要完成工作所需要的一切東西。

切面是通知和切點(diǎn)的結(jié)合。通知和切點(diǎn)共同定義了切面的全部?jī)?nèi)容——它是什么,在何時(shí)和何處完成其功能。

3|3三、Spring對(duì)AOP的支持

1、動(dòng)態(tài)代理:

Spring AOP構(gòu)建在動(dòng)態(tài)代理之上,也就是說(shuō),Spring運(yùn)行時(shí)會(huì)為目標(biāo)對(duì)象動(dòng)態(tài)創(chuàng)建代理對(duì)象。代理類封裝了目標(biāo)類,并攔截被通知方法的調(diào)用,再把調(diào)用轉(zhuǎn)發(fā)給真正的目標(biāo)bean。當(dāng)代理類攔截到方法調(diào)用時(shí),在調(diào)用目標(biāo)bean方法之前,會(huì)執(zhí)行切面邏輯。

??編輯

2、織入切面的時(shí)間:

通過(guò)在代理類中包裹切面,Spring在運(yùn)行期把切面織入到Spring 管理的bean中,也就是說(shuō),直到應(yīng)用需要被代理的bean時(shí),Spring才會(huì)創(chuàng)建代理對(duì)象。

因?yàn)镾pring運(yùn)行時(shí)才創(chuàng)建代理對(duì)象,所以我們不需要特殊的編譯器來(lái)織入Spring AOP切面。

?

3|4四、Spring AOP的使用

假設(shè)我們有個(gè)現(xiàn)場(chǎng)表演的接口Performance和它的實(shí)現(xiàn)類SleepNoMore:

1 2 3 4 5 6 7 8 package?PerformTest; /** ?* 現(xiàn)場(chǎng)表演,如舞臺(tái)劇,電影,音樂(lè)會(huì) ?*/ public?interface?Performance { ????void?perform(); }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 package?PerformTest; import?org.springframework.stereotype.Component; /** ?* 戲劇:《哈姆雷特》 ?*/ @Component public?class?SleepNoMore?implements?Performance { ????@Override ????public?void?perform() { ????????System.out.println("戲劇《哈姆雷特》"); ????} }

既然是演出,就需要觀眾,假設(shè)我們的需求是:在看演出之前,觀眾先入座并將手機(jī)調(diào)整至靜音,在觀看演出之后觀眾鼓掌,如果演出失敗觀眾退票,我們當(dāng)然可以把這些邏輯寫(xiě)在上面的perform()方法中,但不推薦這么做,因?yàn)檫@些邏輯理論上和演出的核心無(wú)關(guān),就算觀眾不將手機(jī)調(diào)整至靜音或者看完演出不鼓掌,都不影響演出的進(jìn)行。

針對(duì)這個(gè)需求,我們可以使用AOP來(lái)實(shí)現(xiàn)。

1、定義切面:

定義一個(gè)觀眾的切面,并聲明前置、后置和異常通知:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 package?PerformTest; import?org.aspectj.lang.annotation.*; /** ?* 觀眾 ?* 使用@Aspect注解定義為切面 ?*/ @Aspect?//@Aspect注解表明Audience類是一個(gè)切面。 public?class?Audience { ????/** ?????* 表演之前,觀眾就座,前置通知 ?????*/ ????@Before("execution(* PerformTest.Performance.perform(..))") ????public?void?takeSeats() { ????????System.out.println("Taking seats"); ????} ????/** ?????* 表演之前,將手機(jī)調(diào)至靜音,前置通知 ?????*/ ????@Before("execution(* PerformTest.Performance.perform(..))") ????public?void?silenceCellPhones() { ????????System.out.println("Silencing cell phones"); ????} ????/** ?????* 表演結(jié)束,不管表演成功或者失敗,后置通知 ?????*/ ????@After("execution(* PerformTest.Performance.perform(..))") ????public?void?finish() { ????????System.out.println("perform finish"); ????} ????/** ?????* 表演之后,鼓掌,后置通知 ?????*/ ????@AfterReturning("execution(* PerformTest.Performance.perform(..))") ????public?void?applause() { ????????System.out.println("CLAP CLAP CLAP!!!"); ????} ????/** ?????* 表演失敗之后,觀眾要求退款,異常通知 ?????*/ ????@AfterThrowing("execution(* PerformTest.Performance.perform(..))") ????public?void?demandRefund() { ????????System.out.println("Demanding a refund"); ????} }

@Before:該注解用來(lái)定義前置通知,通知方法會(huì)在目標(biāo)方法調(diào)用之前執(zhí)行

@After:該注解用來(lái)定義后置通知,通知方法會(huì)在目標(biāo)方法調(diào)用之后執(zhí)行

@AfterReturning:該注解用來(lái)定義返回通知,通知方法會(huì)在目標(biāo)方法返回后調(diào)用

@AfterThrowing:該注解用來(lái)定義異常通知,通知方法會(huì)在目標(biāo)方法拋出異常后調(diào)用

execution(* PerformTest.Performance.perform(..))含義:

execution:在方法執(zhí)行時(shí)觸發(fā)

*:表明我們不關(guān)心方法返回值的類型,即可以是任意類型

.PerformTest.performance:使用全限定類名和方法名指定要添加前置通知的方法

(..):方法的參數(shù)列表使用(..),表明我們不關(guān)心方法的入?yún)⑹鞘裁?,即可以是任意類?/p>

2、定義配置類:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package?PerformTest; import?org.springframework.context.annotation.Bean; import?org.springframework.context.annotation.ComponentScan; import?org.springframework.context.annotation.Configuration; import?org.springframework.context.annotation.EnableAspectJAutoProxy; @Configuration??//配置類注解 @EnableAspectJAutoProxy??//啟用自動(dòng)代理 @ComponentScan??//啟用掃描 public?class?ConcertConfig { ????@Bean ????public?Audience audience() { ????????return?new?Audience(); ????} }

3、定義測(cè)試類:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package?PerformTest; import?org.springframework.context.annotation.AnnotationConfigApplicationContext; public?class?PerformTest { ????public?static?void?main(String[] args) { ????????AnnotationConfigApplicationContext context =?new?AnnotationConfigApplicationContext(ConcertConfig.class); ????????Performance performance = context.getBean(Performance.class); ????????performance.perform(); ????????context.close(); ????} }

運(yùn)行結(jié)果:

1 2 3 4 5 Silencing cell phones Taking seats 戲劇《哈姆雷特》 perform finish CLAP CLAP CLAP!!!

從結(jié)果可以看出在戲劇《哈姆雷特》的前面和后面都有語(yǔ)句輸出,這就是Spring AOP的通知起了作用

4|0SpringMVC

4|1一、SpringMVC的執(zhí)行流程

?編輯

1、請(qǐng)求旅程的第一站是Spring的DispatcherServlet。與大多數(shù)基于Java的Web框架一樣,Spring MVC所有的請(qǐng)求都會(huì)通過(guò)一個(gè)前端控制器(front controller)Servlet。前端控制器是常用的Web應(yīng)用程序模式,在這里一個(gè)單實(shí)例的Servlet將請(qǐng)求委托給應(yīng)用程序的其他組件來(lái)執(zhí)行實(shí)際的處理。在SpringMVC中DispatcherServlet就是前端控制器。

2、Dispatcherservlet的任務(wù)是將請(qǐng)求發(fā)送給Spring MVC控制器(controller),控制器是一個(gè)用于處理請(qǐng)求的Spring組件。在典型的應(yīng)用程序中可能會(huì)有多個(gè)控制器,Dispatcherservlet需要知道應(yīng)該將請(qǐng)求發(fā)送給哪個(gè)控制器。所以DispatcherServlet以會(huì)查詢一個(gè)或多個(gè)處理器映射(handler mapping)來(lái)確定請(qǐng)求的下一站在哪里。處理器映射會(huì)根據(jù)請(qǐng)求所攜帶的URL信息來(lái)進(jìn)行決策。

3、一旦選擇了合適的控制器,Dispatcherservlet會(huì)將請(qǐng)求發(fā)送給選中的控制器。到了控制器,請(qǐng)求會(huì)卸下其負(fù)載(用戶提交的信息)并耐心等待控制器處理這些信息。

4、控制器在完成邏輯處理后,通常會(huì)產(chǎn)生一些信息,這些信息需要返回給用戶并在瀏覽器上顯示。這些信息被稱為模型(model)。不過(guò)僅僅給用戶返回原始的信息是不夠的——這些信息需要以用戶友好的方式進(jìn)行格式化,一般會(huì)是HTML。所以,信息需要發(fā)送給一個(gè)視圖(view),通常會(huì)是JSP。控制器所做的最后一件事就是將模型數(shù)據(jù)打包,并且標(biāo)示出用于渲染輸出的視圖名。它接下來(lái)會(huì)將請(qǐng)求連同模型和視圖名發(fā)送回DispatcherServlete。

5、這樣,控制器就不會(huì)與特定的視圖相耦合,傳遞給DispatcherServlet的視圖名并不直接表示某個(gè)特定的JSP。實(shí)際上,它甚至并不能確定視圖就是JSP。相反,它僅僅傳遞了一個(gè)邏輯名稱,這個(gè)名字將會(huì)用來(lái)查找產(chǎn)生結(jié)果的真正視圖。Dispatcherservlet將會(huì)使用視圖解析器(view resolver)來(lái)將邏輯視圖名匹配為一個(gè)特定的視圖實(shí)現(xiàn),它可能是也可能不是JSP。

6、既然Dispatcherservlet已經(jīng)知道由哪個(gè)視圖渲染結(jié)果,那請(qǐng)求的任務(wù)基本上也就完成了。它的最后一站是視圖的實(shí)現(xiàn)(可能是JSP)

7、在這里它交付模型數(shù)據(jù)。請(qǐng)求的任務(wù)就完成了。視圖將使用模型數(shù)據(jù)渲染輸出,這個(gè)輸出會(huì)通過(guò)響應(yīng)對(duì)象傳遞給客戶端(不會(huì)像聽(tīng)上去那樣硬編碼)

4|2二、SpingMVC初探

1、首先用maven創(chuàng)建一個(gè)web項(xiàng)目(我這里用的是idea),創(chuàng)建完成后的項(xiàng)目目錄結(jié)構(gòu)如下:

?編輯

2、在pom.xml文件中引入spring相關(guān)jar包:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 ???? ??????commons-logging ??????commons-logging ??????1.1.1 ???? ???? ??????org.springframework ??????spring-beans ??????4.1.6.RELEASE ???? ???? ??????org.springframework ??????spring-aop ??????4.1.6.RELEASE ???? ???? ??????org.springframework ??????spring-context ??????4.1.6.RELEASE ???? ???? ??????org.springframework ??????spring-core ??????4.1.6.RELEASE ???? ???? ??????org.springframework ??????spring-expression ??????4.1.6.RELEASE ???? ???? ??????org.springframework ??????spring-web ??????4.1.6.RELEASE ???? ???? ??????org.springframework ??????spring-webmvc ??????4.1.6.RELEASE ???? ??

3、在web.xml中進(jìn)行SpringMVC的相關(guān)配置:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ??Archetype Created Web Application ?? ?? ????springmvc ????org.springframework.web.servlet.DispatcherServlet ???? ?????? ??????contextConfigLocation ??????classpath:springmvc-servlet.xml ???? ???? ?? ?? ????springmvc ???? ????/ ??

4、在resources目錄下新建springmvc-servlet.xml文件,如果沒(méi)有resources目錄的話自己新建一個(gè)resources目錄,并將其設(shè)置為Resources Root:

?編輯

springmvc-servlet.xml文件是Spring的配置文件,文件內(nèi)容如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ???? ???? ???? ???? ???? ???? ???? ???? ???????? ???????? ???????? ???????? ????

5、在WEB-INF目錄下新建一個(gè)文件夾jsp,然后在jsp文件夾中創(chuàng)建一個(gè)hello.jsp:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <%-- ??Created by IntelliJ IDEA. ??User: wydream ??Date:?2020/1/2 ??Time:?17:13 ??To change?this?template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8"?language="java"?%> ???? ????????hello ???? ???? ????????Hello World ????

6、新建一個(gè)Controller類:

?編輯

1 2 3 4 5 6 7 8 9 10 11 12 13 14 package?test.SpingMvc; import?org.springframework.stereotype.Controller; import?org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/mvc") public?class?mvcController { ????@RequestMapping("hello") ????public?String hello() { ????????return?"hello"; ????} }

7、配置tomcat服務(wù)器并啟動(dòng)項(xiàng)目:?

?編輯

?編輯

8、在瀏覽器輸入http://localhost:8080/項(xiàng)目名/mvc/hello即可訪問(wèn)

4|3?三、配置文件詳解

?1、web.xml配置:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 ????? ??? ?? ?? ????404 ????/error404.jsp ?? ?? ?? ????500 ????/error500.jsp ?? ??? ?? ???? ????????contextConfigLocation ????????WEB-INF/classes/spring/applicationContext-*.xml ???? ???? ????????org.springframework.web.context.ContextLoaderListener ???? ????? ?? ?? ??????spring ??????org.springframework.web.servlet.DispatcherServlet ?????? ?????????? ??????????contextConfigLocation ??????????WEB-INF/classes/spring/springmvc.xml ?? ?? ?? ??????spring ?????? ??????/ ?? ????? ?? ?? ??????CharacterEncodingFilter ??????org.springframework.web.filter.CharacterEncodingFilter ?????? ??????????encoding ??????????utf-8 ?????? ?? ?? ??????CharacterEncodingFilter ??????/* ?? ?? ????welcome.jsp ?? ??? ??? ?????

2、springmvc.xml文件的配置:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 ????? ????? ????? ????? ????????? ????????? ????????? ????? ?????? ????? ????? ????? ????? ???? ????? ???? ???? ????? ????????? ????????????? ????????????? ????????? ????? ???? ????? ????? ???? ???? ????? ???? ????? ???? ???? ????? ???? ???? ???? ???? ???????? ???? ????? ???? ???? ???????? ????????????9242880 ???????? ???? ????? ???? ???? ???? ????? ?

3、applicationContext-*.xml的配置:

?applicationContext-*.xml包括三個(gè)配置文件,分別對(duì)應(yīng)數(shù)據(jù)層控制、業(yè)務(wù)邏輯service控制和事務(wù)的控制。

數(shù)據(jù)訪問(wèn)層的控制,applicationContext-dao.xml的配置:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ????

事務(wù)控制,applicationContext-transaction.xml的配置:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 ????? ???? ???? ????? ???? ???? ???????? ???????????? ???????????? ???????????? ???????????? ???????????? ???????????? ???????????? ????????????? ????????????? ???????? ???? ????? ???? ???? ???????? ???? ????? ?????

?4、?MyBatis的配置:

?SqlMapConfig.xml的配置 ??全局setting配置這里省略,數(shù)據(jù)庫(kù)連接池在spring整合文件中已經(jīng)配置,具體setting配置參考官方文檔。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ???? ???? ???? ????

柚子快報(bào)邀請(qǐng)碼778899分享:數(shù)據(jù)庫(kù) java

http://yzkb.51969.com/

相關(guān)鏈接

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19339111.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問(wèn)

文章目錄