版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第1章初識Spring框架《JavaEE企業(yè)級應用開發(fā)教程(Spring+SpringMVC+MyBatis)(第3版)》學習目標/Target了解框架的相關(guān)概念了解Spring框架的概念,能夠簡述Spring框架的優(yōu)點熟悉Spring框架的體系結(jié)構(gòu)和核心概念,能夠簡述Spring框架的體系結(jié)構(gòu)中各模塊的作用掌握Spring入門程序,能夠在項目中通過Spring框架實現(xiàn)控制反轉(zhuǎn)章節(jié)概述/Summary在現(xiàn)代的軟件開發(fā)領域中,構(gòu)建健壯、高效地應用程序是每個開發(fā)者的追求。然而,隨著項目規(guī)模的擴大和技術(shù)的日新月異,開發(fā)過程中面臨著代碼耦合度高、配置繁瑣、事務管理復雜等諸多挑戰(zhàn)?;诖薙pring框架應運而生,Spring框架以其IoC容器、AOP支持、聲明式事務管理等諸多功能為開發(fā)者提供了靈活、強大的開發(fā)支持,使得項目開發(fā)變得更加簡潔、高效。本章將對Spring框架的基礎知識進行詳細地講解。目錄/Contents1.11.2框架概述Spring框架簡介1.3Spring入門程序框架概述1.11.1
框架概述先定一個小目標!
先定一個小目標!了解框架的的相關(guān)概念1.1
框架概述框架(Framework)一詞最早出現(xiàn)在建筑領域,指的是在建造房屋前期構(gòu)建的建筑骨架。在編程領域中,框架指的是一種預先設計好的軟件架構(gòu),它提供了通用的解決方案和功能模塊,以便開發(fā)人員能夠在其基礎上構(gòu)建應用程序??蚣芡ǔ0ㄒ幌盗蓄A定義的類、接口、函數(shù)和工具,旨在簡化開發(fā)過程、提高效率并確保代碼的可維護性和可擴展性。通過使用框架,開發(fā)人員可以專注于業(yè)務邏輯的實現(xiàn),而無需重復編寫通用的代碼,從而加速開發(fā)并提高代碼質(zhì)量。1.1
框架概述Hibernate是一個優(yōu)秀的ORM(ObjectRelationalMapping,對象關(guān)系映射)框架,它允許開發(fā)人員使用面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù)庫,而不必編寫傳統(tǒng)的SQL查詢語句。通過在Java類和數(shù)據(jù)庫表之間建立映射關(guān)系,Hibernate可以自動執(zhí)行數(shù)據(jù)庫操作,包括存儲、更新、檢索和刪除數(shù)據(jù)。Hibernate還提供了緩存、事務管理、延遲加載等高級功能,使得數(shù)據(jù)持久化變得更加簡單和高效。Hibernate框架當前JavaEE開發(fā)中較為常見的主流框架。1.1
框架概述MyBatis是流行的持久層框架,它使用XML配置文件或注解來定義SQL映射,將Java對象與數(shù)據(jù)庫記錄之間進行映射。相對于Hibernate,MyBatis更加靈活,可以直接編寫原生的SQL查詢語句,同時保留了對象關(guān)系映射的優(yōu)勢。MyBatis提供了強大的SQL控制能力,而且其輕量級的特性使得它易于上手和學習,為用戶提供了高效且靈活的數(shù)據(jù)庫交互體驗。MyBatis框架1.1
框架概述Spring是一個開源框架,旨在解決企業(yè)應用程序開發(fā)中的復雜性,它可以將應用程序中的單層框架(只為應用程序中某一層提供解決方案的框架)以最佳方式整合在一起。這種設計使得開發(fā)人員能夠更專注于每個層的具體實現(xiàn),而無需過多關(guān)注層與層之間的交互細節(jié),從而構(gòu)建出一個連貫且強大的體系。Spring不僅簡化了開發(fā)流程,還提供了更為完善的開發(fā)環(huán)境,使得POJO(PlainOldJavaObject,普通Java對象)能夠輕松獲得企業(yè)級服務支持。Spring框架1.1
框架概述SpringMVC是Spring框架中的一個模塊,用于構(gòu)建基于MVC(ModelViewController,模型視圖控制)模式的Web應用程序。通過將請求映射到相應的處理程序、支持多種視圖技術(shù)和提供靈活的請求處理機制,SpringMVC可以幫助開發(fā)人員構(gòu)建靈活、易于維護的Web應用程序。SpringMVC框架1.1
框架概述SpringBoot是一個旨在簡化Spring應用程序初始搭建和開發(fā)過程的框架。SpringBoot提供了自動配置、嵌入式Web服務器、健康檢查、外部化配置等功能,使得開發(fā)人員可以快速搭建生產(chǎn)就緒的Spring應用程序,而無須煩瑣的配置。SpringBoot框架1.1
框架概述SpringCloud是一套用于構(gòu)建分布式系統(tǒng)的微服務架構(gòu)工具集合。它提供了多個子項目,如服務發(fā)現(xiàn)、負載均衡、斷路器、分布式配置等,幫助開發(fā)人員構(gòu)建可擴展、彈性和高可用的微服務架構(gòu)。SpringCloud與SpringBoot結(jié)合使用,能夠更好地支持微服務應用程序的開發(fā)和部署。SpringCloud框架Spring框架簡介1.21.2.1
Spring框架概述先定一個小目標!
先定一個小目標!了解Spring框架的概念,能夠簡述Spring框架的優(yōu)點1.2.1
Spring框架概述JavaEE的早期開發(fā)開發(fā)人員被鼓勵使用EJB作為主要的開發(fā)方式。暴露出了許多問題:使用復雜性高、代碼冗余、代碼侵入性強、開發(fā)周期長以及移植性差等。使用Spring框架開發(fā)Spring框架采用了IoC和AOP的概念,通過依賴注入、面向切面編程等機制,大大簡化了開發(fā)過程。Spring框架代碼簡潔、靈活性高、可測試性強、可重用性好,并且更易于集成到不同的環(huán)境中1.2.1
Spring框架概述Spring框架提供了對SpringMVC、Struts2等框架的整合,幫助開發(fā)人員構(gòu)建靈活可擴展的Web應用程序在表現(xiàn)層方面Spring框架提供了管理事務和日志記錄等功能,幫助開發(fā)人員編寫清晰、可維護的業(yè)務邏輯在業(yè)務邏輯層方面Spring框架可以整合MyBatis、Hibernate、JdbcTemplate等技術(shù),幫助開發(fā)人員與數(shù)據(jù)庫進行高效交互,實現(xiàn)數(shù)據(jù)持久化在持久層方面Spring框架為三層體系架構(gòu)的每個層次提供的技術(shù)支持1.2.1
Spring框架概述Spring框架的優(yōu)點:1.
非侵入式設計2.
降低耦合度,方便開發(fā)3.
支持AOP編程4.
支持聲明式事務5.
方便程序的測試6.
方便集成各種優(yōu)秀框架7.
降低JavaEEAPI的使用難度1.2.2Spring框架的體系結(jié)構(gòu)和核心概念先定一個小目標!
先定一個小目標!熟悉Spring框架的體系結(jié)構(gòu)和核心概念,能夠簡述Spring框架的體系中各模塊的作用1.2.2Spring框架的體系結(jié)構(gòu)和核心概念Spring框架的體系結(jié)構(gòu)1.2.2Spring框架的體系結(jié)構(gòu)和核心概念Context模塊Context模塊構(gòu)建于Beans模塊和Core模塊之上,提供了更豐富的應用上下文信息管理功能Beans模塊Beans模塊提供了對BeanFactory等工廠模式的實現(xiàn),Beans模塊的主要作用是創(chuàng)建和管理BeanSpEL模塊SpEL模塊是Spring3.0后新增的模塊,提供了對SpEL表達式語言Core模塊Core模塊提供了Spring框架的基礎功能,包括IoC(控制反轉(zhuǎn))和DI(依賴注入)功能,是整個Spring框架的核心所在核心容器(CoreContainer)1.2.2Spring框架的體系結(jié)構(gòu)和核心概念0102030405JDBC模塊簡化了JDBC編碼的過程,同時還可以處理那些數(shù)據(jù)庫供應商特有的錯誤代碼ORM模塊提供了對主流的對象關(guān)系映射(ORM)框架的集成支持OXM模塊提供了對XML映射的抽象支持,可以與各種XML綁定框架(如JAXB、Castor、XMLBeans等)進行集成JMS模塊主要用于處理消息傳遞,包括消息的生產(chǎn)和消費Transactions模塊負責事務管理,通過注解或配置文件可以實現(xiàn)聲明式事務管理JDBC模塊ORM模塊OXM模塊JMS模塊數(shù)據(jù)訪問及集成(DataAccess/Integration)Transactions模塊1.2.2Spring框架的體系結(jié)構(gòu)和核心概念WebSocket模塊WebSocket模塊提供了對WebSocket和SockJS的支持,以及對STOMP協(xié)議的實現(xiàn)SpringWeb模塊SpringWeb模塊提供了Web開發(fā)的基本支持,包括處理文件上傳、HTTP客戶端、Spring遠程處理支持等功能Portlet模塊Portlet模塊是專門為Portlet環(huán)境設計的模塊,提供了針對Portlet環(huán)境下的MVC實現(xiàn)Servlet模塊Servlet模塊用于構(gòu)建Web應用程序的RESTful服務Web1.2.2Spring框架的體系結(jié)構(gòu)和核心概念0102030405AOP模塊提供了對面向切面編程的支持,允許開發(fā)者定義切面(Aspect)來截取應用程序的流程,并在切入點上執(zhí)行額外的行為Aspects
模塊提供了與AspectJ集成的支持,AspectJ是一個功能強大且成熟的AOP框架Instrumentation模塊提供了對類工具的支持,并且實現(xiàn)了類加載器Messaging模塊提供了對消息傳遞體系結(jié)構(gòu)和協(xié)議的支持Test模塊提供了對程序單元測試和集成測試的支持AOP模塊Aspects
模塊Instrumentation
模塊Messaging模塊其他模塊Test模塊IoC(InversionofControl,控制反轉(zhuǎn))是Spring框架的核心理念之一,旨在構(gòu)建低耦合的應用程序,降低代碼的復雜度。控制反轉(zhuǎn)的思想倡導將對象的創(chuàng)建和管理交給容器,容器負責實例化對象、管理對象的生命周期以及注入依賴關(guān)系。這樣對象的控制權(quán)就從應用程序轉(zhuǎn)移到了容器,因此稱為控制反轉(zhuǎn)。Spring框架提供了實現(xiàn)IoC思想的IoC容器,通常談及Spring容器時,指的就是Spring框架中的IoC容器。Spring框架的IoC容器主要包括BeanFactory和ApplicationContext,這些IoC容器負責對象的實例化、裝配、配置和管理。IoCSpring框架的核心概念1.2.2Spring框架的體系結(jié)構(gòu)和核心概念DI(DependencyInjection,依賴注入)是IoC的一種實現(xiàn)方式,它通過外部配置(如IoC容器)在對象創(chuàng)建時自動將其所依賴的其他對象注入到該對象中,而不是讓對象內(nèi)部自行創(chuàng)建和管理這些依賴。依賴注入可以通過構(gòu)造函數(shù)、setter方法或接口等多種方式實現(xiàn),從而提高了代碼的可測試性、可維護性和可重用性。DI1.2.2Spring框架的體系結(jié)構(gòu)和核心概念在Spring框架中,Bean是指由Spring容器管理的對象實例,由Spring的IoC容器創(chuàng)建和管理。開發(fā)者可以通過在配置文件或配置類中定義Bean的屬性和依賴關(guān)系,IoC容器會根據(jù)配置信息實例化Bean,并將其加入到容器中進行管理。通過Bean的定義和配置,可以實現(xiàn)對象的控制反轉(zhuǎn)和依賴注入,實現(xiàn)低耦合的組件化開發(fā)。Bean1.2.2Spring框架的體系結(jié)構(gòu)和核心概念Spring入門程序1.31.3Spring入門程序先定一個小目標!
先定一個小目標!掌握Spring入門程序,能夠在項目中通過Spring框架實現(xiàn)控制反轉(zhuǎn)(1)創(chuàng)建項目并引入依賴文件1-1pom.xml源代碼在IDEA中創(chuàng)建名稱為chapter01的Maven項目,入門程序需要使用Spring框架的功能對此在項目的pom.xml文件中引入Spring框架相關(guān)的依賴,具體如文件1-1所示。1.3Spring入門程序(2)自定義接口和實現(xiàn)類文件1-2
UserDao.java文件1-3UserDaoImpl.java源代碼在chapter01項目的src/main/java目錄下創(chuàng)建com.itheima.dao包,并在該包下自定義接口UserDao和接口對應的實現(xiàn)類UserDaoImpl,具體代碼如文件1-2和文件1-3所示。1.3Spring入門程序(3)創(chuàng)建配置文件并定義Bean文件1-4applicationContext.xml源代碼在chapter01項目的src/main/resources目錄下創(chuàng)建applicationContext.xml文件作為Spring入門程序的配置文件,并在applicationContext.xml配置文件中定義Bean,具體代碼如文件1-4所示。1.3Spring入門程序(4)定義測試類文件1-5TestHelloSpring.java源代碼在chapter01項目的com.itheima文件夾下創(chuàng)建測試類TestHelloSpring,具體代碼如文件1-5所示。1.3Spring入門程序(5)測試效果在IDEA中啟動測試類TestHelloSpring,控制臺的輸出結(jié)果如下圖所示。1.3Spring入門程序本章小結(jié)本章主要講解了Spring框架的基礎知識,首先介紹了框架的相關(guān)知識;然后講解了Spring框架的概念、體系結(jié)構(gòu)和核心概念;最后編寫了Spring入門程序。通過本章的學習,讀者可以對Spring框架的基礎有個大致的了解,為框架開發(fā)打下堅實基礎。本章小結(jié)第2章Spring中Bean的管理《JavaEE企業(yè)級應用開發(fā)教程(Spring+SpringMVC+MyBatis)(第3版)》學習目標/Target了解Spring的IoC容器,能夠簡述兩個常見的IoC容器熟悉Bean的作用域,能夠簡述Bean的5種作用域的特點,以及作用域的配置方式掌握Bean的配置,能夠基于XML文件、基于注解和基于Java類實現(xiàn)Bean的配置學習目標/Target掌握Bean的實例化,能夠使用構(gòu)造方法、靜態(tài)工廠、實例工廠的方式實例化Bean掌握Bean的裝配方式,能夠基于XML的裝配、基于注解的裝配和自動裝配實現(xiàn)Bean的裝配掌握Bean的生命周期方法的使用,能夠定義Bean的初始化方法和銷毀方法章節(jié)概述/Summary在Spring框架中,控制反轉(zhuǎn)和依賴注入的實現(xiàn)都基于Spring的Bean管理。Spring的Bean管理是指Spring框架通過IoC容器來管理應用程序中的Bean,主要包括Bean的配置、實例化、注入等。本章對Spring中Bean的管理進行詳細講解。目錄/Contents2.12.2Spring的IoC容器Bean的配置2.3Bean的作用域目錄/Contents2.42.5Bean的實例化Bean的裝配方式2.6Bean的生命周期Spring的IoC容器2.12.1
Spring的IoC容器先定一個小目標!
先定一個小目標!了解Spring的IoC容器,能夠簡述兩個常見的IoC容器Spring框架的IoC容器在Bean的管理中扮演著不可或缺的角色,IoC容器為應用程序提供了便利的Bean管理機制。常見的IoC容器有BeanFactory和ApplicationContext,下面將對這兩個IoC容器進行講解。2.1
Spring的IoC容器BeanFactory是Spring框架中最基礎的IoC容器之一,BeanFactory采用延遲加載的方式創(chuàng)建Bean的實例,即只有在首次請求某個Bean時才會創(chuàng)建該Bean的實例。BeanFactory是一個接口,它定義了管理和獲取Bean對象的基本功能。BeanFactory2.1
Spring的IoC容器2.1
Spring的IoC容器方法描述ObjectgetBean(Stringname)根據(jù)指定的名稱name獲取Bean<T>TgetBean(Stringname,Class<T>type)根據(jù)指定的名稱name和類型type獲取Bean<T>TgetBean(Class<T>requiredType)根據(jù)指定的類型requiredType獲取BeanObjectgetBean(Stringname,Object...args)根據(jù)指定的名稱name和參數(shù)args獲取BeanbooleanisTypeMatch(Stringname,
ResolvabletypeToMatch)判斷是否有與指定名稱name和類型typeToMatch相匹配的BeanClass<?>getType(Stringname)根據(jù)指定的名稱name獲取Bean的類型String[]getAliases(Stringname)根據(jù)指定的名稱name獲取與之對應的別名數(shù)組booleancontainsBean(Stringname)根據(jù)名稱name判斷Spring容器是否含有指定的BeanBeanFactory常用的方法ApplicationContext是BeanFactory接口的子接口,它繼承了BeanFactory接口的所有功能,并且提供了比BeanFactory更豐富的功能和擴展點,是Spring應用程序開發(fā)中經(jīng)常使用的組件之一。ApplicationContext在啟動時會自動加載和初始化所有定義的Bean,這意味著在應用程序運行時,所有需要的Bean都已經(jīng)準備就緒。Spring為了滿足開發(fā)人員不同的需求提供了多個ApplicationContext接口的實現(xiàn)類,讓開發(fā)人員可以根據(jù)項目的特點和需要選擇合適的實現(xiàn)方式。ApplicationContext2.1
Spring的IoC容器2.1
Spring的IoC容器用于從類路徑下的XML文件加載Bean的定義和配置信息,并解析配置文件中的信息初始化其中定義的BeanClassPathXmlApplicationContext用于從文件系統(tǒng)路徑下的XML文件加載Bean定義FileSystemXmlApplicationContext基于Java類和注解加載定義的BeanAnnotationConfigApplicationContextApplicationContext常用的實現(xiàn)類Bean的配置2.22.2Bean的配置先定一個小目標!
先定一個小目標!掌握Bean的配置,能夠基于XML文件、基于注解和基于Java類實現(xiàn)Bean的配置在Spring中,Bean的配置是指定義和配置應用程序中Bean的信息,以便IoC容器能夠管理這些Bean。Spring中Bean的配置方式有基于XML文件的配置、基于注解的配置和基于Java類的配置。下面分別對這三種方式的配置進行講解。2.2Bean的配置2.2Bean的配置1.基于XML文件配置BeanXML(ExtensibleMarkupLanguage,可擴展標記語言)是一種標準的數(shù)據(jù)傳輸和存儲格式,廣泛應用于各種領域,包括配置文件、數(shù)據(jù)交換、Web服務等。在Spring中,基于XML文件配置Bean是一種常見且傳統(tǒng)的方式,通過使用<bean>標簽來定義和配置應用程序中的Bean。每個<bean>標簽可以定義一個Bean。2.2Bean的配置屬性描述id用于指定Bean在容器中的唯一標注name用于指定Bean在容器中的名稱class用于指定Bean的具體類型,即Bean的全限定類名,讓IoC容器要實例化的類scope用于指定Bean的作用域,常見的值有singleton(單例)、prototype(原型)、request(請求)、session(會話)init-method指定Bean初始化時調(diào)用的方法destroy-method指定Bean銷毀時調(diào)用的方法<bean>標簽的常用屬性<constructor-arg>標簽用于設置Bean的構(gòu)造方法參數(shù),當Bean的類有多個構(gòu)造方法,或者構(gòu)造方法需要參數(shù)時,可以使用此標簽來明確指定要使用的構(gòu)造方法及其參數(shù)。<constructor-arg>標簽的常用屬性如下。①index:用于指定構(gòu)造方法的參數(shù)索引,參數(shù)索引從0開始依次遞增1。②type:用于指定構(gòu)造方法的參數(shù)類型。③name:用于指定構(gòu)造方法的參數(shù)名稱。④value:用于指定要注入的常量值。⑤ref:用于引用另一個Bean。2.2Bean的配置(1)<constructor-arg>標簽2.2Bean的配置(1)<constructor-arg>標簽<constructor-arg>標簽的使用示例如下。<beanid="person"class="com.itheima.Person">
<constructor-argindex="0"value="張三"/>
<constructor-argindex="1"value="男"/>
<constructor-argname="age"value="30"/>
<constructor-argname="address"
ref="addressBean"/></bean><property>標簽用于設置Bean的屬性值,對應的Bean需要具有屬性相應的getter方法和setter方法。<property>標簽的常用屬性如下。①name:用于指定屬性的名稱。②value:用于指定要注入的常量值。③ref:用于指定引用的另一個Bean。2.2Bean的配置(2)<property>標簽2.2Bean的配置(2)<property>標簽<property>標簽的使用示例如下。<beanid="person"class="com.itheima.Person"><propertyname="name"value="張三"/><propertyname="address"ref="addressBean"/></bean>2.2Bean的配置(3)<list>標簽<list>標簽用于設置Bean中List類型的屬性值,通常嵌套在<property>標簽中使用,<list>標簽中可以包含<value>標簽或<ref>標簽來指定List集合中的元素值,示例如下。<beanid="person"class="com.itheima.Person"><propertyname="hobbies"><list><value>Reading</value><value>Writing</value><refbean="hobbyBean"/></list></property></bean>2.2Bean的配置(4)<set>標簽<set>標簽用于設置Bean中Set類型的屬性值,其使用方式與<list>類似。2.2Bean的配置(5)<map>標簽<map>標簽用于設置Bean中Map類型的屬性值,Map中每個鍵值對通過<entry>標簽設置,示例如下。<beanid="person"class="com.itheima.Person"><propertyname="OrderInfo"><map><entrykey="id"value="1"/><entrykey="amount"value="100"/></map></property></bean>2.2Bean的配置2.基于注解配置Bean基于XML配置Bean時,需要手動編寫大量的XML代碼來定義和配置Bean,這使得配置過程變得煩瑣且容易出錯。同時XML配置文件與代碼分離,使得配置信息與代碼邏輯不緊密耦合,隨著項目規(guī)模的擴大,XML配置文件的數(shù)量和復雜度也會增加,導致代碼的可讀性差,維護變得困難。為了解決上述問題,Spring引入了基于注解的方式配置Bean。2.2Bean的配置從Spring2.5開始,開發(fā)者可以在Bean的實現(xiàn)類上使用@Component注解或其派生注解(如@Service、@Repository、@Controller等)來標注這些類作為Spring容器管理的Bean。被這些注解標注的類會被視為Spring容器中的一個組件,并由Spring進行管理。當使用注解配置Bean的時候,通常需要在Spring程序的配置文件中配置組件掃描。組件掃描可以指定Spring在什么位置進行掃描,掃描的過程如果發(fā)現(xiàn)標記了@Component注解或其派生注解的類后,會將這些類注冊為Spring的Bean。在Spring配置文件中,開發(fā)者可以通過<context:component-scan>標簽指定組件掃描的路徑<context:component-scanbase-package="com.itheima"/>2.2Bean的配置3.基于Java類配置Bean基于注解的方式配置Bean可以實現(xiàn)簡潔的聲明式配置Bean,當如果需要在Bean的初始化過程中調(diào)用其他Bean的方法、執(zhí)行額外的設置步驟等操作時,基于注解的配置方式則顯得有些局限。對此,Spring提供了基于Java類的方式配置Bean。基于Java類配置Bean是指通過編寫Java類并使用特定的注解來定義和注冊Bean,這種方式提供了更加靈活、明確和強大的配置能力,尤其適用于需要復雜邏輯或條件判斷的場景。2.2Bean的配置3.基于Java類配置Bean在Spring中提供了@Configuration注解用于將一個Java類標記為配置類,在配置類中定義用于創(chuàng)建和初始化Bean的方法可以實現(xiàn)Bean的定義和配置。配置類中創(chuàng)建和初始化Bean的方法需要返回一個實例對象并在方法上添加@Bean注解標注,這樣配置類加載成功后方法返回的實例對象將會由Spring容器管理,Bean的名稱默認為方法名。2.2Bean的配置3.基于Java類配置Bean在配置類上可以使用@ComponentScan注解指定加載該配置類時需要掃描的包或者類,示例如下。1@Configuration2@ComponentScan("com.itheima")3publicclassAppConfig{4@Bean5publicMyBeanmyBean(){6returnnewMyBean();7}8}Bean的作用域2.32.3Bean的作用域先定一個小目標!
先定一個小目標!熟悉Bean的作用域,能夠簡述Bean的5種作用域的特點,以及作用域的配置方式2.3Bean的作用域Spring容器創(chuàng)建一個Bean時,還可以為該Bean指定作用域,Bean的作用域就是指Bean的有效范圍。Spring容器為Bean指定了5種作用域,具體如下表所示。作用域說明singletonsingleton(單例)是Spring框架的默認作用域,當將Bean的作用域設置為singleton時,在Spring容器中只會創(chuàng)建一個Bean,該單一的Bean將在整個應用程序的生命周期內(nèi)被共享prototype當將Bean的作用域設置為prototype(原型)時,每次從容器中請求Bean都會創(chuàng)建一個新的Bean。這意味著每個請求都有自己的Bean,Bean的狀態(tài)不會在不同的請求之間共享2.3Bean的作用域作用域說明request當將Bean的作用域設置為request(請求)時,在Web應用中,每個HTTP請求都有其自己的Bean,并且該實例僅在當前HTTP請求內(nèi)有效,這意味著Bean的生命周期與單個HTTP請求的生命周期相同session當將Bean的作用域設置為session(會話)時,在Web應用中,每個HTTP會話都有其自己的Bean,并且該實例僅在當前HTTP會話內(nèi)有效,這意味著Bean的生命周期與單個HTTP會話的生命周期相同application當將Bean的作用域設置為application(應用)時,在Web應用中,整個Web應用的生命周期內(nèi)只存在一個Bean,該Bean在整個Web應用中都有效(1)通過XML配置文件設置Bean的作用域2.3Bean的作用域(2)通過注解設置Bean的作用域<beanid="userService"class="com.itheima.UserService"scope="singleton"></bean>@Component@Scope("prototype")publicclassMyBean{}(1)創(chuàng)建項目在IDEA中創(chuàng)建名稱為chapter02的Maven項目,并在項目的pom.xml文件中引入Spring框架相關(guān)的依賴。2.3Bean的作用域下面通過案例以基于注解的方式設置Bean的singleton作用域和prototype作用域為例,演示Bean作用域的設置和效果。(2)自定義類文件2-1User.java源代碼在chapter02項目的src/main/java目錄下創(chuàng)建com.itheima.pojo包,并在該包下自定義User類,具體代碼如文件2-1所示。2.3Bean的作用域(3)創(chuàng)建配置類文件2-2AppConfig.java源代碼在chapter02項目的src/main/java目錄下創(chuàng)建com.itheima.config包,并在該包下創(chuàng)建配置類AppConfig,在該配置類定義方法注冊Bean,具體代碼如文件2-2所示。2.3Bean的作用域(4)定義測試類文件2-3SpringApp.java源代碼在chapter02項目的com.itheima文件夾下創(chuàng)建測試類SpringApp,在測試類中定義main()方法,在main()方法中加載AppConfig配置文件初始化IoC容器,并在容器中獲取2次User實例進行輸出和比較,具體代碼如文件2-3所示。2.3Bean的作用域(5)測試效果在IDEA中運行文件2-3,運行結(jié)果如下圖所示。2.3Bean的作用域(5)測試效果將文件2-2第8行的@Scope("singleton")修改為@Scope("prototype"),再次運行運行文件2-3,運行結(jié)果如下圖所示。2.3Bean的作用域Bean的實例化2.4在面向?qū)ο蟪绦蛑?,如要使用某個對象,就需要先實例化出這個對象。同樣地,在Spring中,要想使用容器中的Bean對象,也需要實例化Bean。實例化Bean有3種方式,分別是構(gòu)造方法實例化、靜態(tài)工廠實例化、實例工廠實例化。本節(jié)將這3種Bean的實例化的方式進行講解。2.4Bean的實例化2.4.1
構(gòu)造方法實例化先定一個小目標!
先定一個小目標!掌握構(gòu)造方法實例化,能夠使用構(gòu)造方法的方式實例化Bean2.4.1
構(gòu)造方法實例化Spring的構(gòu)造方法實例化是指在Spring容器啟動時,通過調(diào)用Bean對應類的構(gòu)造方法來創(chuàng)建和實例化Bean的過程。默認情況Spring會調(diào)用類的無參構(gòu)造方法實例化Bean,開發(fā)者也可以在配置Bean的時候,指定使用類的哪個構(gòu)造方法實例化Bean。(1)創(chuàng)建配置文件并定義Bean文件2-4applicationContext.xml源代碼在chapter02項目的src/main/resources目錄下創(chuàng)建applicationContext.xml配置文件,并在applicationContext.xml配置文件中定義Bean,具體代碼如文件2-4所示。2.4.1
構(gòu)造方法實例化下面使用XML配置文件的方式演示基于構(gòu)造方法實例化Bean。(2)定義測試類文件2-5InstantiationTest.java源代碼在chapter02項目的com.itheima文件夾下創(chuàng)建測試類InstantiationTest,在測試類中定義main()方法,在main()方法中加載applicationContext.xml配置文件初始化IoC容器,并在容器中獲取User實例進行輸出,具體代碼如文件2-5所示。2.4.1
構(gòu)造方法實例化(3)測試效果在IDEA中運行文件2-5,運行結(jié)果如下圖。2.4.1
構(gòu)造方法實例化(4)指定Bean的構(gòu)造方法文件2-6applicationContext.xml源代碼User類中包含2個構(gòu)造方法,下面對指定構(gòu)造方法的方式配置Bean。修改文件2-4中<bean>標簽中Bean的信息,修改后如文件2-6所示。2.4.1
構(gòu)造方法實例化(5)測試指定構(gòu)造方法實例化的效果在IDEA中運行文件2-5,運行結(jié)果如下圖。2.4.1
構(gòu)造方法實例化2.4.2靜態(tài)工廠實例化先定一個小目標!
先定一個小目標!掌握靜態(tài)工廠實例化,能夠使用靜態(tài)工廠的方式實例化Bean2.4.2靜態(tài)工廠實例化靜態(tài)工廠是一種創(chuàng)建對象實例的設計模式,它通過在一個類中定義靜態(tài)方法來生成對象實例。在靜態(tài)工廠中,用戶可以根據(jù)需要在方法內(nèi)部進行邏輯判斷,實現(xiàn)定制化的對象創(chuàng)建方式,從而具有更大的靈活性和控制力。另外,靜態(tài)工廠的設計還能夠隱藏對象的具體實現(xiàn)細節(jié),使外部調(diào)用者只需要關(guān)注如何獲取對象實例,而無需了解實現(xiàn)細節(jié)。這種封裝的特性有助于降低耦合度,提高代碼的可維護性和可讀性。使用靜態(tài)工廠方式實例化Bean時,需要開發(fā)者定義一個靜態(tài)工廠類,并在其中編寫靜態(tài)方法來創(chuàng)建Bean的實例。Bean配置文件中的<bean>標簽的class屬性應該指定的是靜態(tài)工廠類,使用<bean>標簽的factory-method屬性指定靜態(tài)工廠類中用于創(chuàng)建Bean的具體靜態(tài)方法。(1)定義工廠類文件2-7UserStaticFactory.java源代碼在chapter02項目下創(chuàng)建com.itheima.factory包,在該包中創(chuàng)建一個靜態(tài)工廠類UserStaticFactory,在該類中定義一個靜態(tài)方法createUser(),用于創(chuàng)建User的實例并返回。UserStaticFactory類的代碼如文件2-7所示。2.4.2靜態(tài)工廠實例化下面通過案例演示如何使用靜態(tài)工廠方式實例化Bean。(2)配置靜態(tài)工廠文件2-8applicationContext.xml源代碼在chapter02項目的applicationContext.xml文件中使用<bean>標簽配置實例化Bean的靜態(tài)工廠,具體如文件2-8所示。2.4.2靜態(tài)工廠實例化(3)測試效果在IDEA中運行文件2-5,運行結(jié)果如下圖所示。2.4.2靜態(tài)工廠實例化2.4.3實例工廠實例化先定一個小目標!
先定一個小目標!掌握實例工廠實例化,能夠使用實例靜態(tài)工廠的方式實例化Bean2.4.3實例工廠實例化實例工廠是一種創(chuàng)建對象實例的設計模式,特指在工廠模式中使用實例方法(非靜態(tài)方法)來創(chuàng)建實例的工廠。在實例工廠中,需要先創(chuàng)建工廠實例,然后調(diào)用實例方法來動態(tài)創(chuàng)建所需的對象實例。與靜態(tài)工廠相比,實例工廠更加靈活,能夠根據(jù)具體情況動態(tài)創(chuàng)建對象實例。實例工廠創(chuàng)建Bean的過程是通過實例工廠的方法直接實例化Bean,在XML配置文件中,除了使用class屬性指定Bean所屬的類外,還需要通過factory-bean屬性指定配置的實例工廠Bean的名字,factory-method屬性指定調(diào)用實例工廠中的方法來創(chuàng)建Bean。(1)定義工廠類文件2-9UserInstanceFactory.java源代碼在chapter02項目的com.itheima.factory包中創(chuàng)建一個實例工廠類UserInstanceFactory,在該類中定義一個方法createUser(),用于創(chuàng)建User的實例并返回。UserInstanceFactory類的代碼如文件2-9所示。2.4.3實例工廠實例化下面通過案例演示如何使用實例工廠方式實例化Bean。(2)配置實例工廠文件2-10applicationContext.xml源代碼在chapter02項目的applicationContext.xml文件中使用<bean>標簽配置實例化Bean的靜態(tài)工廠,具體如文件2-10所示。2.4.3實例工廠實例化(3)測試效果在IDEA中運行文件2-5,運行結(jié)果如下圖所示。2.4.3實例工廠實例化Bean的裝配方式2.5Bean的裝配是指將應用程序中的各個Bean之間的依賴關(guān)系進行正確配置和管理的過程,依賴注入是一種常見的實現(xiàn)Bean裝配的方法,通過依賴注入,Spring容器將所需的依賴對象注入Bean中,從而實現(xiàn)Bean之間的解耦和靈活組裝。Spring框架常用的Bean裝配方式包括基于XML的裝配、基于注解的裝配和自動裝配。本節(jié)將對這三種Bean的裝配方式進行講解。2.5Bean的裝配方式2.5.1
基于XML的裝配先定一個小目標!
先定一個小目標!掌握基于XML的裝配,能夠基于XML的裝配實現(xiàn)Bean的裝配2.5.1
基于XML的裝配1.屬性的setter方法注入XML(ExtensibleMarkupLanguage,可擴展標記語言)是一種標準的數(shù)據(jù)傳輸和存儲在Spring實例化Bean的過程中,Spring首先會調(diào)用Bean對應類的無參構(gòu)造方法來實例化Bean,然后通過反射的方式調(diào)用setter方法來注入屬性值。屬性setter方法注入要求一個Bean必須滿足以下兩點要求。①Bean對應的類必須提供一個默認的無參構(gòu)造方法。②Bean對應的類必須為需要注入的屬性提供對應的setter方法。使用屬性的setter方法注入時,在Spring配置文件中需要使用在<bean>標簽中嵌套<property>標簽來為屬性注入值2.5.1
基于XML的裝配(1)自定義類文件2-11UserDao.java文件2-12
UserService.java源代碼在chapter02項目創(chuàng)建com.itheima.dao包和com.itheima.service包,并在這兩個包中依次自定義類UserDao和UserService,具體如文件2-11和文件2-12所示。下面通過案例演示基于XML裝配Bean時,使用屬性的setter方法注入。2.5.1
基于XML的裝配(2)編寫配置文件文件2-13applicationContext.xml源代碼在chapter02項目的applicationContext.xml文件中使用<bean>標簽和<property>標簽配置Bean和屬性注入的信息,具體如文件2-13所示。2.5.1
基于XML的裝配(3)編寫測試類文件2-14DITest.java源代碼在chapter02項目的com.itheima文件夾下創(chuàng)建測試類DITest,在測試類中定義main()方法,在main()方法中加載applicationContext.xml配置文件初始化IoC容器,在容器中獲取UserService實例并執(zhí)行其saveUser()方法,具體代碼如文件2-14所示。2.5.1
基于XML的裝配(4)測試效果在IDEA中運行文件2-14,運行結(jié)果如下圖所示。2.5.1
基于XML的裝配2.構(gòu)造方法注入在使用構(gòu)造方法注入時,在XML配置文件中需要在<bean>標簽中使用<constructor-arg>標簽來指定構(gòu)造方法的參數(shù)。同時,在被注入的類中需要定義包含被注入Bean的參數(shù)的構(gòu)造方法。這樣,在Spring容器實例化Bean時,會根據(jù)配置文件中的<constructor-arg>標簽設置對應構(gòu)造方法的參數(shù)值,并調(diào)用相應的構(gòu)造方法實例化Bean。2.5.1
基于XML的裝配(1)修改UserService類文件2-15UserService.java源代碼在UserService類中注釋UserDao的setter方法,并添加包含UserDao參數(shù)的UserService構(gòu)造方法,具體如文件2-15所示。下面通過案例演示基于XML裝配Bean時,使用構(gòu)造方法注入。2.5.1
基于XML的裝配(2)修改配置文件文件2-16applicationContext.xml源代碼在chapter02項目的applicationContext.xml文件中使用<bean>標簽和<constructor-arg>標簽配置Bean的信息,具體如文件2-16所示。2.5.1
基于XML的裝配(3)測試效果在IDEA中運行文件2-14,運行結(jié)果如下圖所示。2.5.2基于注解的裝配和自動裝配先定一個小目標!
先定一個小目標!掌握基于注解的裝配和自動裝配,能夠基于注解的裝配和自動裝配實現(xiàn)Bean的裝配2.5.2基于注解的裝配和自動裝配1.屬性的setter方法注入在實際開發(fā)中,如果應用程序中存在大量的Bean,通過傳統(tǒng)的XML配置方式來進行Bean的裝配工作將會導致XML文件變得臃腫,不易維護。為了解決這個問題,Spring提供了基于注解的裝配方式。通過使用注解,可以在類和屬性上直接標注所需的裝配信息,使得配置更加簡潔和直觀。Spring基于注解的裝配是一種依賴注入和Bean配置的方式,通過在類定義和屬性上使用特定注解,告訴Spring容器如何實例化這些類為管理的Bean。自動裝配是Spring容器根據(jù)規(guī)則自動識別并注入Bean之間的依賴關(guān)系,無需顯式聲明依賴?;谧⒔獾难b配讓Spring容器知道如何處理特定類,而自動裝配則讓Spring容器自動解決Bean之間的依賴關(guān)系。兩者在功能上有所不同,但通常在實際使用中會結(jié)合起來。2.5.2基于注解的裝配和自動裝配Spring用于裝配的常見注解注解描述@Component用于標注類為Spring中的Bean@Controller指定一個控制器組件Bean,功能上等同于@Component@Service指定一個業(yè)務邏輯組件Bean,用于將業(yè)務邏輯層的類標注為Spring中的Bean,功能上等同于@Component@Repository指定一個數(shù)據(jù)訪問組件Bean,用于將數(shù)據(jù)訪問層的類標注為Spring中的Bean,功能上等同于@Component@Scope指定Bean的作用域@Value指定Bean的注入值2.5.2基于注解的裝配和自動裝配注解描述@Autowired指定要自動裝配的對象@Resource指定要注入的對象@Qualifier指定在自動裝配時明確要注入的Bean,通常與@Autowired聯(lián)合使用@PostConstruct指定Bean完成初始化后調(diào)用的方法@PreDestroy指定Bean銷毀前調(diào)用的方法2.5.2基于注解的裝配和自動裝配(1)應用在成員變量上@Autowired注解可以應用于類的成員變量、setter方法或構(gòu)造方法上,以指示Spring容器在初始化Bean時自動注入依賴,示例如下所示。1@Component2publicclassMyComponent{3@Autowired4privateMyServicemyService;5}2.5.2基于注解的裝配和自動裝配(2)應用在構(gòu)造方法上1@Component2publicclassMyComponent{3privateMyServicemyService;4@Autowired5publicMyComponent(MyServicemyService){6this.myService=myService;7}8}2.5.2基于注解的裝配和自動裝配(3)應用在setter方法上1@Component2publicclassMyComponent{3privateMyServicemyService;4@Autowired5publicvoidsetMyService(MyServicemyService){6this.myService=myService;7}8}2.5.2基于注解的裝配和自動裝配下面通過案例演示基于注解的裝配和自動裝配實現(xiàn)Bean的裝配。(1)使用注解標注UserDao文件2-17UserDao.java源代碼在項目chapter02的UserDao類上使用@Repository注解進行標記,讓UserDao類在Spring應用程序啟動并自動掃描時將其實例化為Bean,并加入Spring容器中,具體代碼如文件2-17所示。2.5.2基于注解的裝配和自動裝配(2)使用注解標注UserService并自動裝配UserDao文件2-18UserService.java源代碼在項目chapter02的UserService類上使用@Service注解進行標記,讓UserService類在Spring應用程序啟動并自動掃描時將其實例化為Bean,并注釋userDao屬性的setter方法,使用@Autowired注解自動注入UserDao對象,具體代碼如文件2-18所示。2.5.2基于注解的裝配和自動裝配(3)編寫測試類文件2-19AutowiredTest.java源代碼在chapter02項目的com.itheima文件夾下創(chuàng)建測試類AutowiredTest,在測試類中定義main()方法,在main()方法中掃描com.itheima包及其子包初始化IoC容器,在容器中獲取UserService實例并執(zhí)行其saveUser()方法,具體代碼如文件2-19所示。2.5.2基于注解的裝配和自動裝配(4)測試效果在IDEA中運行文件2-19,運行結(jié)果如下圖所示。Bean的生命周期2.62.6Bean的生命周期先定一個小目標!
先定一個小目標!掌握Bean的生命周期方法的使用,能夠定義Bean的初始化方法和銷毀方法Bean的生命周期是指Bean從創(chuàng)建到銷毀的整個過程。在Spring中,作用域為singleton和prototype的Bean在生命周期管理上有明顯的差異。singleton作用域的Bean:Spring容器會完全管理其生命周期,包括創(chuàng)建、初始化和銷毀。容器會在啟動時創(chuàng)建Bean,并在容器關(guān)閉時銷毀Bean,確保其生命周期完整。prototype作用域的Bean:Spring容器僅負責創(chuàng)建Bean,不會管理其完整的生命周期,Bean的生命周期和銷毀由調(diào)用方自行控制的,而不是由Spring容器來管理。2.6Bean的生命周期下面對作用域為singleton的Bean的生命周期進行講解。在Bean的初始化階段,由初始化方法負責Bean的初始配置和準備工作;而在Bean的銷毀階段,由銷毀方法負責資源釋放和清理工作。通過這兩個方法,開發(fā)人員可以插入自定義邏輯,實現(xiàn)特定的初始化和清理操作,確保Bean在整個生命周期中的正確性和穩(wěn)定性。2.6Bean的生命周期2.6Bean的生命周期初始化階段中初始化方法的實現(xiàn)和銷毀階段中銷毀方法的實現(xiàn)方式如下。(1)初始化方法的實現(xiàn)①通過<bean>標簽的init-method屬性實現(xiàn)初始化。在Spring的XML配置文件中,開發(fā)者通過<bean>標簽的init-method屬性指定初始化方法的名稱,Spring容器在實例化并注入屬性后,會調(diào)用這個方法,示例如下。<beanid="userDao"class="com.itheima.UserDao"init-method="init"/>2.6Bean的生命周期②通過@Bean注解的initMethod屬性實現(xiàn)初始化。當使用Java配置類定義Bean時,開發(fā)者可以通過@Bean注解的initMethod屬性指定初始化方法,示例如下。1@Configuration2publicclassAppConfig{3@Bean(initMethod="init")4publicMyBeanmyBean(){5returnnewMyBean();6}7}2.6Bean的生命周期③通過重寫InitializingBean接口的afterPropertiesSet()方法實現(xiàn)。任何類實現(xiàn)InitializingBean接口,并重寫其中的afterPropertiesSet()方法后,該方法會在Bean化完成后被調(diào)用,從而實現(xiàn)初始化邏輯,示例如下。1publicclassExampleBeanimplementsInitializingBean{2@Override3publicvoidafterPropertiesSet()throwsException{4//初始化的邏輯代碼5}6}2.6Bean的生命周期④通過@PostConstruct注解實現(xiàn)。@PostConstruct注解是JSR250(JavaSpecificationRequest250,Java規(guī)范請求250)為Java預定義的注解之一,它是用于在依賴注入完成后執(zhí)行初始化方法的一個注解,示例如下。1publicclassExampleBean{2@PostConstruct3publicvoidinit(){4//初始化的邏輯代碼5}6}2.6Bean的生命周期(2)銷毀方法的實現(xiàn)①通過<bean>標簽的destroy-method屬性實現(xiàn)。在Spring的XML配置文件中,開發(fā)者通過<bean>標簽的destroy-method屬性指定銷毀方法的名稱,應用程序在Bean銷毀之前會調(diào)用這個方法,示例如下。<beanid="userDao"class="com.itheima.UserDao"destroy-method="destroy"/>2.6Bean的生命周期②通過@Bean注解的destroyMethod屬性實現(xiàn)。當使用Java配置類定義Bean時,開發(fā)者可以通過@Bean注解的destroyMethod屬性指定銷毀方法,示例如下。1@Configuration2publicclassAppConfig{3@Bean(destroyMethod="destroy")4publicMyBeanmyBean(){5returnnewMyBean();6}7}2.6Bean的生命周期③通過重寫DisposableBean接口的destroy()方法實現(xiàn)。Spring提供了一個名為DisposableBean的接口,該接口定義了一個名為destroy的方法。任何類實現(xiàn)DisposableBean接口,并重寫其中的destroy()方法后,該方法會在Bean銷毀被調(diào)用,示例如下。1publicclassExampleBeanimplementsDisposableBean{2@Override3publicvoiddestroy()throwsException{4//銷毀前的邏輯代碼5}6}2.6Bean的生命周期④通過@PreDestroy注解實現(xiàn)。@PreDestroy注解是JSR250(JavaSpecificationRequest250,Java規(guī)范請求250)為Java預定義的注解之一,用于標記Bean的銷毀方法,被該注解標注的方法會在Bean銷毀之前執(zhí)行,示例如下。1publicclassExampleBean{2@PreDestroy3publicvoiddestroy(){4//銷毀前的邏輯代碼5}6}2.6Bean的生命周期下面通過案例演示作用域為singleton的Bean初始化方法和銷毀方法的使用。(1)引入依賴本案例基于@PostConstruct注解和@PreDestroy注解定義初始化方法和銷毀方法,對此需要在項目的pom.xml文件中引入Java注解的依賴,具體如下。1<dependency>2 <groupId>javax.annotation</groupId>3 <artifactId>javax.annotation-api</artifactId>4 <version>1.3.2</version>5</dependency>2.6Bean的生命周期(2)創(chuàng)建自定義類文件2-20DataInfo.java源代碼在項目chapter02的com.itheima.pojo包下創(chuàng)建自定義類DataInfo,在該類上使用@Component注解標注當前類創(chuàng)建的Bean交于Spring容器管理,并在該類中定義類的構(gòu)造方法、Bean的初始化方法、Bean的銷毀方法,具體代碼如文件2-20所示。2.6Bean的生命周期(3)編寫測試類文件2-21LifecycleTest.java源代碼在chapter02項目的com.itheima文件夾下創(chuàng)建測試類LifecycleTest,在測試類中定義main()方法,在main()方法中掃描com.itheima包及其子包初始化IoC容器,在容器中獲取DataInfo實例后,使用AbstractApplicationContext的registerShutdownHook()方法關(guān)閉Spring應用程序上下文,具體代碼如文件2-21所示。2.6Bean的生命周期(4)測試效果在IDEA中運行文件2-21,運行結(jié)果如下圖所示。本章小結(jié)本章主要講解了Spring對Bean的管理。首先介紹了Spring的IoC容器;接著講解了Bean的配置和Bean的作用域;然后講解了Bean的實例化和Bean的裝配方式;最后講解了Bean的生命周期。通過本章的學習,讀者可以對Spring中Bean的管理有基本的了解,為以后框架開發(fā)奠定基礎。本章小結(jié)第3章SpringAOP《JavaEE企業(yè)級應用開發(fā)教程(Spring+SpringMVC+MyBatis)(第3版)》學習目標/Target了解AOP的概念,能夠簡述AOP的優(yōu)點熟悉JDK動態(tài)代理,并實現(xiàn)JDK動態(tài)代理的案例熟悉CGLIB動態(tài)代理,并實現(xiàn)CGLIB動態(tài)代理的案例掌握基于XML的AOP實現(xiàn)掌握基于注解的AOP實現(xiàn)章節(jié)概述/Summary在JavaEE應用程序開發(fā)中,經(jīng)常需要處理橫跨多個模塊的功能需求,這些需求并非業(yè)務邏輯,而是涉及應用程序運行環(huán)境和共性方面的問題,如日志記錄、安全控制、事務管理和性能監(jiān)控等。如果在每個模塊中都重復實現(xiàn)這些功能,會導致代碼冗余、可維護性降低等問題。為了解決這些問題,開發(fā)者可以利用Spring框架的AOP來管理和復用這些通用的橫切關(guān)注點,從而提高代碼的可重用性和可維護性。本章將對SpringAOP的相關(guān)知識進行講解。目錄/Contents3.13.2AOP概述SpringAOP的實現(xiàn)機制3.3SpringAOP集成AspectJ的實現(xiàn)AOP概述3.13.1
AOP概述先定一個小目標!
先定一個小目標!了解AOP的概念,能夠簡述AOP的優(yōu)點AOP的全稱是AspectOrientedProgramming,即面向切面編程,它是一種編程方法論,是OOP(ObjectOrientedProgramming,面向?qū)ο缶幊蹋┑囊环N補充。AOP可以通過將業(yè)務邏輯與橫切關(guān)注點(如安全控制、日志記錄等在多個模塊或組件中共同存在的功能)分離,從而實現(xiàn)更好的代碼模塊化、可維護性和可復用性。在SpringAOP中,開發(fā)者可以通過定義切面(Aspect)來實現(xiàn)這種分離,并通過在運行時動態(tài)地將切面織入(Weave)到業(yè)務邏輯中,實現(xiàn)將橫切關(guān)注點應用于多個組件、對象或方法中,避免了代碼的重復和低效性。3.1
AOP概述3.1
AOP概述類與切面的關(guān)系3.1
AOP概述AOP的常用術(shù)語如下。1.切面:切面(Aspect)是用于橫向劃分關(guān)注點的模塊化單元,通常用于封裝橫向插入系統(tǒng)的功能。2.連接點:連接點(Joinpoint)是程序執(zhí)行過程中的特定節(jié)點,一個連接點通常代表一個方法的執(zhí)行。3.切點:切點(Pointcut)是指程序執(zhí)行過程中滿足預先指定條件的連接點。4.通知:通知(Advice)是切面中的實際代碼,用于實現(xiàn)切面的具體功能。5.目標對象:目標對象(TargetObject)指的是被切面增強的原始對象。6.織入:織入(Weaving)是指將切面代碼插入到目標對象上,從而生成代理對象的過程。7.代理對象:代理對象(ProxyObject)是織入切面后創(chuàng)建的對象,用于應用通知到目標對象。8.引介:引介(Introduction)是一種特殊的通知,用于為目標對象添加新的屬性和方法。SpringAOP的實現(xiàn)機制3.23.2SpringAOP的實現(xiàn)機制Spring框架中實現(xiàn)AOP時,應用程序在運行期會為目標對象生成一個動態(tài)代理對象,并在代理對象中實現(xiàn)對目標對象的增強。根據(jù)代理對象的創(chuàng)建方式,可以將AOP實現(xiàn)機制分為JDK動態(tài)代理和CGLIB動態(tài)代理,本節(jié)將針對這兩種實現(xiàn)機制進行講解。3.2.1
JDK動態(tài)代理先定一個小目標!
先定一個小目標!熟悉JDK動態(tài)代理,并實現(xiàn)JDK動態(tài)代理的案例AOP中的JDK動態(tài)代理是一種基于接口的代理方式,即只能為接口創(chuàng)建代理實例。JDK動態(tài)代理是SpringAOP的默認的動態(tài)代理機制,它利用Java反射機制在運行時動態(tài)地創(chuàng)建目標對象的代理對象,并將通知與代理對象關(guān)聯(lián)起來,從而實現(xiàn)對目標對象的增強。JDK動態(tài)代理使用Java中的java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口來創(chuàng)建代理對象。首先需要定義一個InvocationHandler實現(xiàn)類,它包含一個invoke()方法,該方法中定義了增強的邏輯。然后通過Proxy類的newProxyInstance()方法創(chuàng)建代理對象,該方法通過接收類加載器、代理實現(xiàn)的接口以及InvocationHandler對象來生成代理對象。3.2.1
JDK動態(tài)代理3.2.1
JDK動態(tài)代理(1)創(chuàng)建項目并依賴在IDEA中創(chuàng)建一個名為chapter03的Maven項目,然后在項目的pom.xml文件中引入Spring的核心依賴。下面通過一個案例演示Spring中JDK動態(tài)代理的實現(xiàn)過程。3.2.1
JDK動態(tài)代理(2)創(chuàng)建接口和實現(xiàn)類文件3-1
UserDao.java文件3-2
UserDaoImpl.java源代碼在chapter03項目下創(chuàng)建com.itheima.dao包,在該包下創(chuàng)建接口UserDao,在該接口中編寫添加和刪除的方法。在com.itheima.dao包下創(chuàng)建UserDao接口的實現(xiàn)類UserDaoImpl,在重寫接口的方法中添加一條輸出語句,具體如文件3-1和文件3
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年寧夏中考數(shù)學真題卷含答案解析
- 2025年西藏中考化學真題卷含答案解析
- 2025年動畫繪制員(高級)職業(yè)技能水平考試題庫及答案
- 營銷部門年度工作總結(jié)
- 2025計算機三級試題及答案
- 2025年安全生產(chǎn)風險辨識與安全風險防范與處理培訓試卷及答案
- 圍堰施工常見問題及應對措施
- 工業(yè)機器人維護保養(yǎng)2025年核心知識培訓試題及答案
- 幼兒園2025年度工作總結(jié)例文
- 基本公共衛(wèi)生服務考試題及答案
- 高壓避雷器課件
- 體檢中心收費與財務一體化管理方案
- 四川省內(nèi)江市2024-2025學年高二上學期期末檢測化學試題
- 廣東省深圳市龍崗區(qū)2024-2025學年二年級上學期學科素養(yǎng)期末綜合數(shù)學試卷(含答案)
- 晝夜明暗圖課件
- 臨床成人吞咽障礙患者口服給藥護理
- 兒童呼吸道合胞病毒感染診斷治療和預防專家共識 4
- 雨課堂在線學堂《大數(shù)據(jù)技術(shù)與應用》作業(yè)單元考核答案
- 全國計算機等級考試一級WPS Office真題題庫及答案
- 養(yǎng)牛場消防知識培訓
- 義警法律知識培訓總結(jié)課件
評論
0/150
提交評論