Spring MVC開(kāi)發(fā)技術(shù)指南第1章 Spring基礎(chǔ)_第1頁(yè)
Spring MVC開(kāi)發(fā)技術(shù)指南第1章 Spring基礎(chǔ)_第2頁(yè)
Spring MVC開(kāi)發(fā)技術(shù)指南第1章 Spring基礎(chǔ)_第3頁(yè)
Spring MVC開(kāi)發(fā)技術(shù)指南第1章 Spring基礎(chǔ)_第4頁(yè)
Spring MVC開(kāi)發(fā)技術(shù)指南第1章 Spring基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩102頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第1章Spring基礎(chǔ)主要內(nèi)容Spring概述Spring開(kāi)發(fā)環(huán)境的構(gòu)建Maven管理Spring應(yīng)用SpringIoCSpringAOPSpringBeanSpring的數(shù)據(jù)庫(kù)編程1.1Spring概述1.CoreContainerSpring的CoreContainer是其它模塊建立的基礎(chǔ),由Beans(spring-beans)、Core(spring-core)、Context(spring-context)和Expression(spring-expression,Spring表達(dá)式語(yǔ)言)等模塊組成。spring-beans模塊

該模塊提供了BeanFactory,是工廠模式的一個(gè)經(jīng)典實(shí)現(xiàn),Spring將管理對(duì)象稱為Bean。spring-core模塊該模塊提供了框架的基本組成部分,包括控制反轉(zhuǎn)(InversionofControl,IoC)和依賴注入(DependencyInjection,DI)功能。spring-context模塊該模塊建立在spring-beans和spring-core模塊基礎(chǔ)上,提供一個(gè)框架式的對(duì)象訪問(wèn)方式,是訪問(wèn)定義和配置的任何對(duì)象媒介。spring-expression模塊該模塊提供了強(qiáng)大的表達(dá)式語(yǔ)言去支持運(yùn)行時(shí)查詢和操作對(duì)象圖。2.AOP和Instrumentation與AOP和Instrumentation相關(guān)的模塊有AOP(spring-aop)模塊、Aspects(spring-aspects)模塊以及Instrumentation(spring-instrument)模塊。spring-aop模塊該模塊提供了一個(gè)符合AOP要求的面向切面的編程實(shí)現(xiàn),允許定義方法攔截器和切入點(diǎn),將代碼按照功能進(jìn)行分離,以便干凈地解耦。spring-aspects模塊該模塊提供了與AspectJ的集成功能,AspectJ是一個(gè)功能強(qiáng)大且成熟的AOP框架。spring-instrument模塊該模塊提供了類植入(Instrumentation)支持和類加載器的實(shí)現(xiàn),可以在特定的應(yīng)用服務(wù)器中使用。Instrumentation提供了一種虛擬機(jī)級(jí)別支持的AOP實(shí)現(xiàn)方式,使得開(kāi)發(fā)者無(wú)需對(duì)JDK做任何升級(jí)和改動(dòng),就可以實(shí)現(xiàn)某些AOP的功能。3.MessagingSpring4.0以后新增了Messaging(spring-messaging)模塊,該模塊提供了對(duì)消息傳遞體系結(jié)構(gòu)和協(xié)議的支持。4.DataAccess/Integration數(shù)據(jù)訪問(wèn)/集成層由JDBC(spring-jdbc)、ORM(spring-orm)、OXM(spring-oxm)、JMS(spring-jms)和Transactions(spring-tx)模塊組成。spring-jdbc模塊該模塊提供了一個(gè)JDBC的抽象層,消除了繁瑣的JDBC編碼和數(shù)據(jù)庫(kù)廠商特有的錯(cuò)誤代碼解析。spring-orm模塊為流行的對(duì)象關(guān)系映射(Object-RelationalMapping)API提供集成層,包括JPA和Hibernate。spring-oxm模塊該模塊提供了一個(gè)支持對(duì)象/XML映射的抽象層實(shí)現(xiàn),如JAXB、Castor、JiBX和XStream。spring-jms模塊該模塊指Java消息傳遞服務(wù),包含用于生產(chǎn)和使用消息的功能。spring-tx模塊該模塊支持用于實(shí)現(xiàn)特殊接口和所有POJO(普通Java對(duì)象)類的編程和聲明式事務(wù)管理。5.WebWeb層由Web(spring-web)、WebMVC(spring-webmvc)、WebSocket(spring-websocket)和WebFlux(spring-webflux)模塊組成。spring-web模塊提供了基本的Web開(kāi)發(fā)集成功能。例如:多文件上傳功能、使用Servlet監(jiān)聽(tīng)器初始化一個(gè)IoC容器以及Web應(yīng)用上下文。spring-webmvc模塊該模塊包含用于Web應(yīng)用程序的SpringMVC和RESTWebServices實(shí)現(xiàn)。spring-websocket模塊Spring4.0后新增的模塊,它提供了WebSocket和SockJS的實(shí)現(xiàn),主要是與Web前端的全雙工通訊的協(xié)議。spring-webflux該模塊是一個(gè)新的非堵塞函數(shù)式ReactiveWeb框架,可以用來(lái)建立異步的、非阻塞、事件驅(qū)動(dòng)的服務(wù),并且擴(kuò)展性非常好。(該模塊是Spring5新增模塊)6.TestTest(spring-test)模塊:該模塊支持使用JUnit或TestNG對(duì)Spring組件進(jìn)行單元測(cè)試和集成測(cè)試。主要內(nèi)容Spring概述Spring開(kāi)發(fā)環(huán)境的構(gòu)建Maven管理Spring應(yīng)用SpringIoCSpringAOPSpringBeanSpring的數(shù)據(jù)庫(kù)編程1.2Spring開(kāi)發(fā)環(huán)境的構(gòu)建1.2.1使用Eclipse開(kāi)發(fā)JavaWeb應(yīng)用1.2.2使用STS(SpringToolSuite)開(kāi)發(fā)JavaWeb應(yīng)用1.2.3Spring的下載及目錄結(jié)構(gòu)1.2.4第一個(gè)Spring入門程序1.2.1使用Eclipse開(kāi)發(fā)JavaWeb應(yīng)用

使用Eclipse之前,需要對(duì)JDK、Web服務(wù)器和Eclipse進(jìn)行一些必要的配置。因此,在安裝Eclipse之前,應(yīng)事先安裝JDK和Web服務(wù)器。1.安裝JDK

按照提示安裝完成JDK后,需要配置“環(huán)境變量”的“系統(tǒng)變量”Java_Home和Path。2.Web服務(wù)器3.安裝EclipseEclipse下載完成后,解壓到自己設(shè)置的路徑下,即可完成安裝。安裝Eclipse后,雙擊Eclipse安裝目錄下的eclipse.exe文件,啟動(dòng)Eclipse。4.集成Tomcat至此,可以使用Eclipse創(chuàng)建DynamicWebProject(JavaWeb應(yīng)用),并在Tomcat下運(yùn)行。1.2.2使用STS(SpringToolSuite)開(kāi)發(fā)JavaWeb應(yīng)用STS是一個(gè)專為Spring開(kāi)發(fā)定制的Eclipse,方便創(chuàng)建、調(diào)試、運(yùn)行及維護(hù)Spring應(yīng)用。通過(guò)該工具,可以很方便地生成一個(gè)Spring工程,比如Web工程。1.2.3Spring的下載及目錄結(jié)構(gòu)

對(duì)于不使用Maven和Gradle下載的開(kāi)發(fā)者,本書(shū)給出一個(gè)SpringFrameworkJAR官方直接下載路徑:/libs-release-local/org/springframework/spring/。本書(shū)采用的是spring-5.2.3.RELEASE-dist.zip。libs目錄包含開(kāi)發(fā)Spring應(yīng)用所需要的JAR包和源代碼。該目錄下有三類JAR文件,其中,以RELEASE.jar結(jié)尾的文件是Spring框架class的JAR包,即開(kāi)發(fā)Spring應(yīng)用所需要的JAR包;以RELEASE-javadoc.jar結(jié)尾的文件是Spring框架API文檔的壓縮包;RELEASE-sources.jar結(jié)尾的文件是Spring框架源文件的壓縮包。在libs目錄中,有四個(gè)基礎(chǔ)包:spring-core-5.2.3.RELEASE.jar、spring-beans-5.2.3.RELEASE.jar、spring-context-5.2.3.RELEASE.jar和spring-expression-5.2.3.RELEASE.jarcommons.logging的JAR包Spring框架依賴于ApacheCommonsLogging組件,該組件的JAR包可以通過(guò)官方網(wǎng)站/proper/commons-logging/download_logging.cgi下載,本書(shū)下載的是commons-logging-1.2-bin.zip,解壓縮后,即可找到commons-logging-1.2.jar。對(duì)于Spring框架的初學(xué)者,開(kāi)發(fā)Spring應(yīng)用時(shí),只需要將Spring的四個(gè)基礎(chǔ)包和commons-logging-1.2.jar復(fù)制到Web應(yīng)用的WEB-INF/lib目錄下。1.2.4第一個(gè)Spring入門程序1.使用STS創(chuàng)建Web應(yīng)用并導(dǎo)入JAR包2.創(chuàng)建接口TestDao3.創(chuàng)建接口TestDao的實(shí)現(xiàn)類TestDaoImpl4.創(chuàng)建配置文件applicationContext.xml5.創(chuàng)建測(cè)試類1.使用STS創(chuàng)建Web應(yīng)用并導(dǎo)入JAR包在講解SpringMVC框架前,本書(shū)的實(shí)例并沒(méi)有真正運(yùn)行Web應(yīng)用。創(chuàng)建Web應(yīng)用的目的是方便添加相關(guān)JAR包。2.創(chuàng)建接口TestDaopackagedao;publicinterfaceTestDao{ publicvoidsayHello();}3.創(chuàng)建接口TestDao的實(shí)現(xiàn)類TestDaoImplpackagedao;publicclassTestDaoImplimplementsTestDao{ @Override publicvoidsayHello(){ System.out.println("Hello,Studyhard!"); }}4.創(chuàng)建配置文件applicationContext.xml<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd"> <!--將指定類TestDaoImpl配置給Spring,讓Spring創(chuàng)建其實(shí)例-->

<beanid="test"class="dao.TestDaoImpl"/></beans>

配置文件信息不需要讀者手寫(xiě),可以從Spring的幫助文檔中復(fù)制(首先使用瀏覽器打開(kāi)\spring-framework-5.2.3.RELEASE\docs\spring-framework-reference\index.html,在頁(yè)面中單擊超鏈接Core,在1.2.1.ConfigurationMetadata小節(jié)下即可找到配置文件的約束信息)。5.創(chuàng)建測(cè)試類publicstaticvoidmain(String[]args){ //初始化Spring容器ApplicationContext,加載配置文件 //@SuppressWarnings抑制警告的關(guān)鍵字,有泛型未指定類型 @SuppressWarnings("resource")

ApplicationContextappCon=new ClassPathXmlApplicationContext("applicationContext.xml"); //通過(guò)容器獲取test實(shí)例

TestDaott=(TestDao)appCon.getBean("test");//test為配置文件中的id tt.sayHello();}主要內(nèi)容Spring概述Spring開(kāi)發(fā)環(huán)境的構(gòu)建Maven管理Spring應(yīng)用SpringIoCSpringAOPSpringBeanSpring的數(shù)據(jù)庫(kù)編程1.3Maven管理Spring應(yīng)用1.3.1Maven簡(jiǎn)介1.3.2Maven的pom.xml1.3.3在STS中創(chuàng)建MavenWeb項(xiàng)目1.3.4使用Maven管理第一個(gè)Spring入門程序1.3.1Maven簡(jiǎn)介ApacheMaven是一個(gè)軟件項(xiàng)目管理工具?;陧?xiàng)目對(duì)象模型(ProjectObjectModel,POM)的理念,通過(guò)一段核心描述信息來(lái)管理項(xiàng)目構(gòu)建、報(bào)告和文檔信息。在Java項(xiàng)目中,Maven主要完成兩件工作:①統(tǒng)一開(kāi)發(fā)規(guī)范與工具;②統(tǒng)一管理JAR包。Maven統(tǒng)一管理項(xiàng)目開(kāi)發(fā)所需要的JAR包,但這些JAR包將不再包含在項(xiàng)目?jī)?nèi)(即不在lib目錄下),而是存放于倉(cāng)庫(kù)當(dāng)中。1.中央倉(cāng)庫(kù)2.本地倉(cāng)庫(kù)1.3.2Maven的pom.xml1.properties元素2.dependencies元素3.dependency元素4.scope子元素1.properties元素

在<properties></properties>之間可以定義變量,以便在<dependency></dependency>中引用。<properties><!--spring版本號(hào)--><spring.version>5.2.3.RELEASE</spring.version></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency></dependencies>2.dependencies元素<dependencies></dependencies>,此元素包含多個(gè)項(xiàng)目依賴需要使用的<dependency></dependency>元素。3.dependency元素<dependency></dependency>元素內(nèi)部通過(guò)<groupId></groupId>、<artifactId></artifactId>、<version></version>三個(gè)子元素確定唯一的依賴,也可以稱為三個(gè)坐標(biāo)。<dependency> <!--groupId組織的唯一標(biāo)識(shí)--> <groupId>org.springframework</groupId> <!--artifactId項(xiàng)目的唯一標(biāo)識(shí)--> <artifactId>spring-core</artifactId> <!--version項(xiàng)目的版本號(hào)--> <version>${spring.version}</version></dependency>4.scope子元素

在<dependency></dependency>元素中,有時(shí)使用<scope></scope>子元素管理依賴的部署。(1)compile(編譯范圍)compile是缺省值,即默認(rèn)范圍。依賴如果沒(méi)有提供范圍,那么該依賴的范圍就是編譯范圍。編譯范圍的依賴,在所有的classpath中可用,同時(shí)也會(huì)被打包發(fā)布。(2)provided(已提供范圍)provided表示已提供范圍,只有當(dāng)JDK或者容器已提供該依賴才可以使用。已提供范圍的依賴不是傳遞性的,也不會(huì)被打包發(fā)布。(3)runtime(運(yùn)行時(shí)范圍)runtime范圍依賴在運(yùn)行和測(cè)試系統(tǒng)時(shí)需要,但在編譯時(shí)不需要。(4)test(測(cè)試范圍)test范圍依賴在一般的編譯和運(yùn)行時(shí)都不需要,它們只有在測(cè)試編譯和測(cè)試運(yùn)行階段可用。不會(huì)隨項(xiàng)目發(fā)布。(5)system(系統(tǒng)范圍)system范圍與provided范圍類似,但需要顯式提供包含依賴的JAR包,Maven不會(huì)在Repository中查找它。1.3.3在STS中創(chuàng)建MavenWeb項(xiàng)目1.新建Maven項(xiàng)目1.新建Maven項(xiàng)目1.新建Maven項(xiàng)目2.配置Maven項(xiàng)目2.配置Maven項(xiàng)目2.配置Maven項(xiàng)目2.配置Maven項(xiàng)目2.配置Maven項(xiàng)目2.配置Maven項(xiàng)目3.測(cè)試Maven項(xiàng)目

首先,在項(xiàng)目ch1_2的src/main/webapp目錄下,創(chuàng)建名為index.jsp的頁(yè)面。然后,選中index.jsp的文件名,單擊右鍵選擇RunAs->RunonServer,測(cè)試運(yùn)行index.jsp頁(yè)面。1.3.4使用Maven管理第一個(gè)Spring入門程序1.Maven管理項(xiàng)目所依賴的JAR包 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> </dependencies>

spring-context定義了Spring容器,并依賴了spring-core、spring-expression、spring-aop和spring-beans。2.復(fù)制相關(guān)代碼文件

將ch1_1的src目錄下的dao包、test包和applicationContext.xml配置文件復(fù)制到ch1_2的src/main/java目錄下,即可進(jìn)行代碼測(cè)試。主要內(nèi)容Spring概述Spring開(kāi)發(fā)環(huán)境的構(gòu)建Maven管理Spring應(yīng)用SpringIoCSpringAOPSpringBeanSpring的數(shù)據(jù)庫(kù)編程1.4SpringIoC1.4.1SpringIoC的基本概念1.4.2Spring的常用注解1.4.3基于注解的依賴注入1.4.4Java配置1.4.1SpringIoC的基本概念

控制反轉(zhuǎn)(IOC)是一個(gè)比較抽象的概念,是Spring框架的核心,用來(lái)消減計(jì)算機(jī)程序的耦合問(wèn)題。依賴注入(DI)是IoC的另外一種說(shuō)法,只是從不同的角度,描述相同的概念。

當(dāng)Spring框架出現(xiàn)后,對(duì)象的實(shí)例不再由調(diào)用者來(lái)創(chuàng)建,而是由Spring容器(比如面包店)來(lái)創(chuàng)建。Spring容器會(huì)負(fù)責(zé)控制程序之間的關(guān)系(比如面包店負(fù)責(zé)控制您與面包的關(guān)系),而不是由調(diào)用者的程序代碼直接控制。這樣,控制權(quán)由調(diào)用者轉(zhuǎn)移到Spring容器,控制權(quán)發(fā)生了反轉(zhuǎn),這就是Spring的控制反轉(zhuǎn)。

從Spring容器角度來(lái)看,Spring容器負(fù)責(zé)將被依賴對(duì)象賦值給調(diào)用者的成員變量,相當(dāng)于為調(diào)用者注入它所依賴的實(shí)例,這就是Spring的依賴注入,主要目的是為了解耦,體現(xiàn)一種“組合”的理念。1.4.2Spring的常用注解1.聲明Bean的注解1)@Component該注解是一個(gè)泛化的概念,僅僅表示一個(gè)組件對(duì)象(Bean),可以作用在任何層次上,沒(méi)有明確的角色。2)@Repository該注解用于將數(shù)據(jù)訪問(wèn)層(DAO)的類標(biāo)識(shí)為Bean,即注解數(shù)據(jù)訪問(wèn)層Bean,其功能與@Component()相同。3)@Service該注解用于標(biāo)注一個(gè)業(yè)務(wù)邏輯組件類(Service層),其功能與@Component()相同。4)@Controller該注解用于標(biāo)注一個(gè)控制器組件類(SpringMVC的Controller),其功能與@Component()相同。2.注入Bean的注解1)@Autowired該注解可以對(duì)類的成員變量、方法及構(gòu)造方法進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作。通過(guò)@Autowired的使用來(lái)消除setter和getter方法。默認(rèn)按照Bean的類型進(jìn)行裝配。2)@Resource該注解與@Autowired功能一樣。區(qū)別在于,該注解默認(rèn)是按照名稱來(lái)裝配注入的,只有當(dāng)找不到與名稱匹配的Bean才會(huì)按照類型來(lái)裝配注入;而@Autowired默認(rèn)按照Bean的類型進(jìn)行裝配,如果想按照名稱來(lái)裝配注入,則需要結(jié)合@Qualifier注解一起使用。@Resource注解有兩個(gè)屬性:name和type。name屬性指定Bean的實(shí)例名稱,即按照名稱來(lái)裝配注入;type屬性指定Bean類型,即按照Bean的類型進(jìn)行裝配。3)@Qualifier該注解與@Autowired注解配合使用。當(dāng)@Autowired注解需要按照名稱來(lái)裝配注入,則需要結(jié)合該注解一起使用,Bean的實(shí)例名稱由@Qualifier注解的參數(shù)指定。1.4.3基于注解的依賴注入SpringIoC容器(ApplicationContext)負(fù)責(zé)創(chuàng)建和注入Bean。Spring提供使用XML配置、注解、Java配置以及groovy配置實(shí)現(xiàn)Bean的創(chuàng)建和注入。1.使用STS創(chuàng)建Maven項(xiàng)目并添加依賴的JAR包【例1-3】基于注解的依賴注入的使用過(guò)程。2.創(chuàng)建DAO層packageannotation.dao;publicinterfaceTestDao{ publicvoidsave();}packageannotation.dao;importorg.springframework.stereotype.Repository;@Repository("testDaoImpl")/**相當(dāng)于@Repository,但如果在service層使用@Resource(name="testDaoImpl"),testDaoImpl不能省略。**/publicclassTestDaoImplimplementsTestDao{ @Override publicvoidsave(){ System.out.println("testDaosave"); }}3.創(chuàng)建Service層packageannotation.service;publicinterfaceTestService{ publicvoidsave();}packageannotation.service;importjavax.annotation.Resource;importorg.springframework.stereotype.Service;importannotation.dao.TestDao;@Service("testSeviceImpl")//相當(dāng)于@ServicepublicclassTestSeviceImplimplementsTestService{

@Resource(name="testDaoImpl") /**相當(dāng)于@Autowired,@Autowired默認(rèn)按照Bean類型注入**/

privateTestDaotestDao; @Override publicvoidsave(){ testDao.save(); System.out.println("testServicesave"); }}4.創(chuàng)建Controller層packageannotation.controller;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importannotation.service.TestService;@ControllerpublicclassTestController{

@Autowired privateTestServicetestService; publicvoidsave(){ testService.save(); System.out.println("testControllersave"); }}5.創(chuàng)建配置類packageannotation.config;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configuration;@Configuration//聲明當(dāng)前類是一個(gè)配置類(見(jiàn)1.4.4節(jié)),相當(dāng)于一個(gè)Spring的XML配置文件。@ComponentScan("annotation")//自動(dòng)掃描annotation包及其子包下使用的注解,并注冊(cè)為Bean。/*相當(dāng)于在Spring的XML配置文件中使用<context:component-scanbase-package="Bean所在的包路徑"/>語(yǔ)句。*/publicclassConfigAnnotation{}6.創(chuàng)建測(cè)試類packageannotation.test;importorg.springframework.context.annotation.AnnotationConfigApplicationContext;importannotation.config.ConfigAnnotation;importannotation.controller.TestController;publicclassTestAnnotation{ publicstaticvoidmain(String[]args){ //初始化Spring容器ApplicationContext

AnnotationConfigApplicationContextappCon= newAnnotationConfigApplicationContext(ConfigAnnotation.class);

TestControllertc=appCon.getBean(TestController.class); tc.save(); appCon.close(); }}7.運(yùn)行結(jié)果1.4.4Java配置Java配置是Spring4.x推薦的配置方式,它是通過(guò)@Configuration和@Bean注解來(lái)實(shí)現(xiàn)的。@Configuration注解聲明當(dāng)前類是一個(gè)配置類,相當(dāng)于一個(gè)Spring配置的XML文件。@Bean注解在方法上,聲明當(dāng)前方法的返回值為一個(gè)Bean。【例1-4】Java配置的使用過(guò)程。1.使用STS創(chuàng)建Maven項(xiàng)目并添加依賴的JAR包

使用STS創(chuàng)建一個(gè)名為ch1_4的MavenProject,并通過(guò)pom.xml文件添加項(xiàng)目所依賴的JAR包。這里只需要添加spring-context依賴,pom.xml文件內(nèi)容,不再贅述。2.創(chuàng)建DAO層packagedao;//此處沒(méi)有使用@Repository聲明BeanpublicclassTestDao{ publicvoidsave(){ System.out.println("TestDaosave"); }}3.創(chuàng)建Service層packageservice;importdao.TestDao;//此處沒(méi)有使用@Service聲明BeanpublicclassTestService{

//此處沒(méi)有使用@Autowired注入testDao TestDaotestDao; publicvoidsetTestDao(TestDaotestDao){ this.testDao=testDao; } publicvoidsave(){ testDao.save(); }}4.創(chuàng)建Controller層packagecontroller;importservice.TestService;//此處沒(méi)有使用@Controller聲明BeanpublicclassTestController{

//此處沒(méi)有使用@Autowired注入testService TestServicetestService; publicvoidsetTestService(TestServicetestService){ this.testService=testService; } publicvoidsave(){ testService.save(); }}5.創(chuàng)建配置類在配置類中使用@Bean注解定義0個(gè)或多個(gè)Bean。@Configuration//一個(gè)配置類,相當(dāng)于一個(gè)Spring配置的XML文件;//此處沒(méi)有使用包掃描,是因?yàn)樗蠦ean都在此類中通過(guò)@Bean注解定義了。publicclassJavaConfig{

@Bean publicTestDaogetTestDao(){ returnnewTestDao(); }

@Bean publicTestServicegetTestService(){ TestServicets=newTestService(); //使用set方法注入testDao ts.setTestDao(getTestDao()); returnts; }

@Bean publicTestControllergetTestController(){ TestControllertc=newTestController(); //使用set方法注入testService tc.setTestService(getTestService()); returntc; }}主要內(nèi)容Spring概述Spring開(kāi)發(fā)環(huán)境的構(gòu)建Maven管理Spring應(yīng)用SpringIoCSpringAOPSpringBeanSpring的數(shù)據(jù)庫(kù)編程1.5SpringAOP1.5.1SpringAOP的基本概念1.5.2基于注解開(kāi)發(fā)AspectJ1.5.1SpringAOP的基本概念2.AOP的術(shù)語(yǔ)1)切面切面(Aspect)是指封裝橫切到系統(tǒng)功能(如事務(wù)處理)的類。2)連接點(diǎn)連接點(diǎn)(Joinpoint)是指程序運(yùn)行中的一些時(shí)間點(diǎn),如方法的調(diào)用或異常的拋出。3)切入點(diǎn)切入點(diǎn)(Pointcut)是指那些需要處理的連接點(diǎn)。在SpringAOP中,所有的方法執(zhí)行都是連接點(diǎn),而切入點(diǎn)是一個(gè)描述信息,它修飾的是連接點(diǎn),通過(guò)切入點(diǎn)確定哪些連接點(diǎn)需要被處理。4)通知(增強(qiáng)處理)由切面添加到特定的連接點(diǎn)(滿足切入點(diǎn)規(guī)則)的一段代碼,即在定義好的切入點(diǎn)處所要執(zhí)行的程序代碼??梢詫⑵淅斫鉃榍忻骈_(kāi)啟后,切面的方法。因此,通知是切面的具體實(shí)現(xiàn)。5)引入引入(Introduction)允許在現(xiàn)有的實(shí)現(xiàn)類中添加自定義的方法和屬性。6)目標(biāo)對(duì)象目標(biāo)對(duì)象(TargetObject)是指所有被通知的對(duì)象。如果AOP框架使用運(yùn)行時(shí)代理的方式(動(dòng)態(tài)的AOP)來(lái)實(shí)現(xiàn)切面,那么通知對(duì)象總是一個(gè)代理對(duì)象。7)代理代理(Proxy)是通知應(yīng)用到目標(biāo)對(duì)象之后,被動(dòng)態(tài)創(chuàng)建的對(duì)象。8)組入組入(Weaving)是將切面代碼插入到目標(biāo)對(duì)象上,從而生成代理對(duì)象的過(guò)程。根據(jù)不同的實(shí)現(xiàn)技術(shù),AOP組入有三種方式:編譯器組入,需要有特殊的Java編譯器;類裝載期組入,需要有特殊的類裝載器;動(dòng)態(tài)代理組入,在運(yùn)行期為目標(biāo)類添加通知生成子類的方式。SpringAOP框架默認(rèn)采用動(dòng)態(tài)代理組入,而AspectJ(基于Java語(yǔ)言的AOP框架)采用編譯器組入和類裝載器組入。1.5.2基于注解開(kāi)發(fā)AspectJ1.環(huán)繞通知環(huán)繞通知是在目標(biāo)方法執(zhí)行前和執(zhí)行后實(shí)施增強(qiáng),可以應(yīng)用于日志記錄、事務(wù)處理等。2.前置通知前置通知是在目標(biāo)方法執(zhí)行前實(shí)施增強(qiáng),可應(yīng)用于權(quán)限管理等。3.后置返回通知后置返回通知是在目標(biāo)方法成功執(zhí)行后實(shí)施增強(qiáng),可應(yīng)用于關(guān)閉流、刪除臨時(shí)文件等。4.后置(最終)通知后置通知是在目標(biāo)方法執(zhí)行后實(shí)施增強(qiáng),與后置返回通知不同的是,不管是否發(fā)生異常都要執(zhí)行該通知,可應(yīng)用于釋放資源。5.異常通知異常通知是在方法拋出異常后實(shí)施增強(qiáng),可以應(yīng)用于處理異常、記錄日志等。6.引入通知引入通知是在目標(biāo)類中添加一些新的方法和屬性,可以應(yīng)用于修改目標(biāo)類(增強(qiáng)類)。注解名稱描

述@Aspect用于定義一個(gè)切面,注解在切面類上@Pointcut用于定義切入點(diǎn)表達(dá)式。在使用時(shí),需要定義一個(gè)切入點(diǎn)方法。該方法是一個(gè)返回值void,且方法體為空的普通方法@Before用于定義前置通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式@AfterReturning用于定義后置返回通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式@Around用于定義環(huán)繞通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式@AfterThrowing用于定義異常通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式。另外,還有一個(gè)throwing屬性用于訪問(wèn)目標(biāo)方法拋出的異常,該屬性值與異常通知方法中同名的形參一致@After用于定義后置(最終)通知。在使用時(shí),通常為其指定value屬性值,該值可以是已有的切入點(diǎn),也可以直接定義切入點(diǎn)表達(dá)式【例1-5】基于注解開(kāi)發(fā)AspectJ的過(guò)程1.使用STS創(chuàng)建Maven項(xiàng)目并添加依賴的JAR包 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> </dependencies>2.創(chuàng)建接口及實(shí)現(xiàn)類

創(chuàng)建接口TestDao和接口實(shí)現(xiàn)類TestDaoImpl。該實(shí)現(xiàn)類作為目標(biāo)類,在切面類中對(duì)其方法進(jìn)行增強(qiáng)處理。使用注解@Repository將目標(biāo)類aspectj.dao.TestDaoImpl注解為目標(biāo)對(duì)象。3.創(chuàng)建切面類

創(chuàng)建切面類MyAspect。在該類中,首先使用@Aspect注解定義一個(gè)切面類,由于該類在Spring中是作為組件使用的,所以還需要使用@Component注解。然后,使用@Pointcut注解定義切入點(diǎn)表達(dá)式,并通過(guò)定義方法來(lái)表示切入點(diǎn)名稱。最后在每個(gè)通知方法上添加相應(yīng)的注解,并將切入點(diǎn)名稱作為參數(shù)傳遞給需要執(zhí)行增強(qiáng)的通知方法。4.創(chuàng)建配置類

創(chuàng)建配置類AspectjAOPConfig。在該類中使用@Configuration注解聲明此類為配置類;使用@ComponentScan("aspectj")注解自動(dòng)掃描aspectj包下使用的注解;使用@EnableAspectJAutoProxy注解開(kāi)啟Spring對(duì)AspectJ的支持。5.創(chuàng)建測(cè)試類publicstaticvoidmain(String[]args){ //初始化Spring容器ApplicationContext AnnotationConfigApplicationContextappCon= newAnnotationConfigApplicationContext(AspectjAOPConfig.class); //從容器中,獲取增強(qiáng)后的目標(biāo)對(duì)象 TestDaotestDaoAdvice=appCon.getBean(TestDao.class); //執(zhí)行方法 testDaoAdvice.save(); System.out.println("================"); testDaoAdvice.modify(); System.out.println("================"); testDaoAdvice.delete(); appCon.close(); }6.運(yùn)行測(cè)試類主要內(nèi)容Spring概述Spring開(kāi)發(fā)環(huán)境的構(gòu)建Maven管理Spring應(yīng)用SpringIoCSpringAOPSpringBeanSpring的數(shù)據(jù)庫(kù)編程1.6SpringBean1.6.1Bean的實(shí)例化1.6.2Bean的作用域1.6.3Bean的初始化和銷毀1.6.1Bean的實(shí)例化

Spring框架實(shí)例化Bean有三種方式:構(gòu)造方法實(shí)例化、靜態(tài)工廠實(shí)例化和實(shí)例工廠實(shí)例化(其中,最常用的實(shí)例方法是構(gòu)造方法實(shí)例化)。

【例1-8】Bean的實(shí)例化過(guò)程。該實(shí)例的具體要求是:分別使用構(gòu)造方法、靜態(tài)工廠和實(shí)例工廠實(shí)例化Bean。1.6.2Bean的作用域

在Spring中為Bean的實(shí)例定義了如表1.2所示的作用域,通過(guò)@Scope注解來(lái)實(shí)現(xiàn)。作用域名稱描述singleton默認(rèn)的作用域,使用singleton定義的Bean在Spring容器中只有一個(gè)Bean實(shí)例。prototypeSpring容器每次獲取prototype定義的Bean,容器都將創(chuàng)建一個(gè)新的Bean實(shí)例。request在一次HTTP請(qǐng)求中容器將返回一個(gè)Bean實(shí)例,不同的HTTP請(qǐng)求返回不同的Bean實(shí)例。僅在WebSpring應(yīng)用程序上下文中使用。session在一個(gè)HTTPSession中,容器將返回同一個(gè)Bean實(shí)例。僅在WebSpring應(yīng)用程序上下文中使用。application為每個(gè)ServletContext對(duì)象創(chuàng)建一個(gè)實(shí)例,即同一個(gè)應(yīng)用共享一個(gè)Bean實(shí)例。僅在WebSpring應(yīng)用程序上下文中使用。websocket為每個(gè)WebSocket對(duì)象創(chuàng)建一個(gè)Bean實(shí)例。僅在WebSpring應(yīng)用程序上下文中使用。

【例1-7】Bean的作用域。該實(shí)例的具體要求是:分別定義作用域?yàn)閟ingleton和prototype的兩個(gè)Bean。1.6.3Bean的初始化和銷毀

可以使用@Bean注解的initMethod和destroyMethod屬性(相當(dāng)于XML配置的init-method和destroy-method)對(duì)Bean進(jìn)行初始化和銷毀。

【例1-8】Bean的初始化和銷毀。該實(shí)例的具體要求是:首先,定義一個(gè)MyService類,在該類中定義構(gòu)造方法、初始化方法和銷毀方法。然后,在Java配置類,使用@Bean注解的initMethod和destroyMethod屬性對(duì)MyService對(duì)象進(jìn)行初始化和銷毀。主要內(nèi)容Spring概述Spring開(kāi)發(fā)環(huán)境的構(gòu)建Maven管理Spring應(yīng)用SpringIoCSpringAOPSpringBeanSpring的數(shù)據(jù)庫(kù)編程1.7Spring的數(shù)據(jù)庫(kù)編程1.7.1SpringJDBC的XML配置1.7.2SpringJDBC的Java配置1.7.3SpringJdbcTemplate的常用方法1.7.4基于@Transactional注解的聲明式事務(wù)管理1.7.5如何在事務(wù)處理中捕獲異常1.7.1SpringJDBC的XML配置<!--配置數(shù)據(jù)源--><beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!--MySQL數(shù)據(jù)庫(kù)驅(qū)動(dòng)--> <propertyname="driverClassName"value="com.mysql.jdbc.Driver"/> <!--連接數(shù)據(jù)庫(kù)的URL--> <propertyname="url"value="jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8"/> <!--連接數(shù)據(jù)庫(kù)的用戶名--> <propertyname="username"value="root"/> <!--連接數(shù)據(jù)庫(kù)的密碼--> <propertyname="password"value="root"/></bean><!--配置JDBC模板--><beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"> <propertyname="dataSource"ref="dataSource"/></bean>1.7.2SpringJDBC的Java配置@Configuration//通過(guò)該注解來(lái)表明該類是一個(gè)Spring的配置,相當(dāng)于一個(gè)xml文件@ComponentScan(basePackages="dao")//配置掃描包@PropertySource(value={"classpath:perties"},ignoreResourceNotFound=true)//配置多個(gè)屬性文件時(shí)value={"classpath:perties","xx","xxx"}publicclassSpringJDBCConfig{ @Value("${jdbc.url}")//注入屬性文件perties中的jdbc.urlprivateStringjdbcUrl;@Value("${jdbc.driverClassName}")privateStringjdbcDriverClassName;@Value("${jdbc.username}")privateStringjdbcUsername;@Value("${jdbc.password}")privateStringjdbcPassword;/***配置數(shù)據(jù)源*/@BeanpublicDriverManagerDataSourcedataSource(){ DriverManagerDataSourcemyDataSource=newDriverManagerDataSource();//數(shù)據(jù)庫(kù)驅(qū)動(dòng)myDataSource.setDriverClassName(jdbcDriverCla

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論