




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
E6636BC20180234D78A0072836F0BA7012B9B20215E26B50ACD98F3EB1392B551B4EBF38216C3B0222692E0838460BEBE009217A41D02B111BBFC23A765E14D124F449AD6A2784D7348224B76F624F873694ECB77C9D5FC1A8B6E19E00602C88DA962B9CCE3第七章SpringIOC項(xiàng)目需求背景知識(shí)項(xiàng)目介紹經(jīng)典問(wèn)題強(qiáng)化本章小結(jié)0102030405-理解依賴注入的概念-理解IOC與DI的區(qū)別與聯(lián)系-掌握依賴注入的實(shí)現(xiàn)方式-了解SpringBean的常用屬性及其子元素-掌握實(shí)例化SpringBean的三種方式-掌握SpringBean的作用域-熟悉SpringBean的生命周期-掌握SpringBean的四種裝配方式0102030405060708E6636BC20180234D78A0072836F0BA7012B9B20215E26B50ACD98F3EB1392B551B4EBF38216C3B0222692E0838460BEBE009217A41D02B111BBFC23A765E14D124F449AD6A2784D7348224B76F624F873694ECB77C9D5FC1A8B6E19E00602C88DA962B9CCE3項(xiàng)目需求01功能描述1.1為滿足用戶需求,我們需要開(kāi)發(fā)一個(gè)新建用戶的功能,在創(chuàng)建用戶時(shí)可以填寫(xiě)相關(guān)信息,包括用戶名、密碼、聯(lián)系電話等。同時(shí),還需要設(shè)置激活狀態(tài),默認(rèn)為開(kāi)啟。當(dāng)用戶創(chuàng)建完成后,處于激活狀態(tài)的用戶可以直接登錄系統(tǒng)。E6636BC20180234D78A0072836F0BA7012B9B20215E26B50ACD98F3EB1392B551B4EBF38216C3B0222692E0838460BEBE009217A41D02B111BBFC23A765E14D124F449AD6A2784D7348224B76F624F873694ECB77C9D5FC1A8B6E19E00602C88DA962B9CCE3背景知識(shí)02知識(shí)導(dǎo)圖2.1圖1
第7章知識(shí)導(dǎo)圖反射機(jī)制——反射機(jī)制概述2.2Java反射主要通過(guò)包java.lang.reflect.*來(lái)實(shí)現(xiàn),它提供了一組類和接口用于在程序運(yùn)行時(shí)獲取目標(biāo)類、接口、字段、方法及構(gòu)造方法等信息,并可以在程序運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建、操作和銷毀它們。例如:反射機(jī)制——反射機(jī)制的優(yōu)點(diǎn)與缺點(diǎn)2.2優(yōu)點(diǎn):(1)動(dòng)態(tài)性:反射機(jī)制可以在程序運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建對(duì)象、調(diào)用方法和訪問(wèn)屬性,提高程序的靈活性。(2)可擴(kuò)展性:反射機(jī)制允許開(kāi)發(fā)者在運(yùn)行時(shí)加載任意類的任意版本,以實(shí)現(xiàn)程序的動(dòng)態(tài)擴(kuò)展和更新。(3)動(dòng)態(tài)代理:反射機(jī)制可以使程序在運(yùn)行時(shí)動(dòng)態(tài)生成代理類,從而實(shí)現(xiàn)動(dòng)態(tài)代理。(4)框架支持:反射機(jī)制為很多框架(例如Spring、Mybatis)的實(shí)現(xiàn)提供了技術(shù)基礎(chǔ)。缺點(diǎn):(1)性能問(wèn)題:反射需要在程序運(yùn)行時(shí)動(dòng)態(tài)對(duì)代碼進(jìn)行分析和解析,因此通常比直接調(diào)用方法和訪問(wèn)屬性要慢。(2)安全性問(wèn)題:反射機(jī)制可以訪問(wèn)類的私有成員,破壞了面向?qū)ο蟮姆庋b性,因此需要謹(jǐn)慎使用。(3)復(fù)雜性問(wèn)題:Java反射機(jī)制的使用需要調(diào)用大量API,以致程序的可讀性和可維護(hù)性會(huì)受到影響。反射機(jī)制——反射機(jī)制在Spring中的運(yùn)用2.2(1)依賴注入(DependencyInjection):在Spring中,DI是通過(guò)反射機(jī)制實(shí)現(xiàn)的。Spring容器會(huì)掃描應(yīng)用程序中的類,找到需要注入依賴的地方,并使用反射機(jī)制實(shí)例化需要注入的對(duì)象。(2)AOP(Aspect-OrientedProgramming):Spring的AOP模塊使用反射機(jī)制來(lái)攔截方法調(diào)用,并在方法調(diào)用前、調(diào)用后或拋出異常時(shí)執(zhí)行特定操作。(3)動(dòng)態(tài)代理(DynamicProxy):Spring的AOP模塊還使用反射機(jī)制創(chuàng)建動(dòng)態(tài)代理。動(dòng)態(tài)代理是一種在運(yùn)行時(shí)動(dòng)態(tài)生成代理對(duì)象的機(jī)制,它通過(guò)實(shí)現(xiàn)特定的接口來(lái)代理原始對(duì)象的方法調(diào)用。Spring使用反射來(lái)創(chuàng)建這種代理,從而可以在運(yùn)行時(shí)攔截和處理方法調(diào)用。(4)配置文件解析:Spring使用反射機(jī)制來(lái)解析XML或注解配置文件,并根據(jù)配置文件中的信息創(chuàng)建對(duì)應(yīng)的對(duì)象。單例設(shè)計(jì)模式——單例模式概述2.3單例模式(SingletonPattern)是Java中最常用的創(chuàng)建型設(shè)計(jì)模式之一,它提供了一種創(chuàng)建對(duì)象的最佳方式,該模式涉及到一個(gè)單一的類,該類負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建。該類還提供了一種直接訪問(wèn)其唯一對(duì)象的方式,而不需要實(shí)例化該類對(duì)象。
單例設(shè)計(jì)模式——單例模式的應(yīng)用場(chǎng)景2.3(1)日志類:日志類可以使用單例模式實(shí)現(xiàn),通常在應(yīng)用程序的各個(gè)組件中提供全局日志的訪問(wèn)點(diǎn),這樣就無(wú)需在每次執(zhí)行日志操作時(shí)去創(chuàng)建日志對(duì)象。(2)配置類:配置類也可以設(shè)計(jì)為單例實(shí)現(xiàn),例如應(yīng)用程序的配置文件由一個(gè)單例對(duì)象進(jìn)行統(tǒng)一管理,程序的其他組件就可以通過(guò)該對(duì)象讀取配置信息,從而簡(jiǎn)化在復(fù)雜環(huán)境下的配置管理。(3)工廠類:可以將工廠對(duì)象的創(chuàng)建設(shè)計(jì)為單例模式,在全局狀態(tài)下始終只有一個(gè)工廠對(duì)象存在,從而避免高并發(fā)場(chǎng)景下唯一對(duì)象被實(shí)例化多次的情況。(4)以共享模式訪問(wèn)資源的類:在實(shí)際開(kāi)發(fā)中,某些需要共享訪問(wèn)的資源也可以設(shè)計(jì)為單例模式。單例設(shè)計(jì)模式——餓漢式單例2.3餓漢式單例實(shí)現(xiàn)方式是在類加載的時(shí)候就創(chuàng)建實(shí)例,并將實(shí)例保存在一個(gè)靜態(tài)常量中。上述代碼中由于加入了static關(guān)鍵字,根據(jù)JVM特性,該類在加載時(shí)就會(huì)完成Singleton的實(shí)例化,從而保證后面的線程在訪問(wèn)這個(gè)實(shí)例時(shí)得到的都是單例。但由于程序啟動(dòng)時(shí)所有單例就被創(chuàng)建好了,因此當(dāng)單例對(duì)象較多時(shí)會(huì)浪費(fèi)一定的內(nèi)存。單例設(shè)計(jì)模式——懶漢式單例2.3懶漢式單例是另外一種單例實(shí)現(xiàn)方式,它會(huì)延遲創(chuàng)建實(shí)例,直到調(diào)用者第一次訪問(wèn)該實(shí)例時(shí)才會(huì)被創(chuàng)建。當(dāng)程序執(zhí)行時(shí)如果有多個(gè)線程同時(shí)訪問(wèn)getInstance()方法,由于此時(shí)instance實(shí)例為空,因此這些線程都會(huì)執(zhí)行instance=newSingleton2()代碼,從而導(dǎo)致多個(gè)實(shí)例被創(chuàng)建,以致出現(xiàn)線程不安全問(wèn)題。為了解決這個(gè)問(wèn)題,我們可以使用雙重檢測(cè)方式來(lái)創(chuàng)建單例。單例設(shè)計(jì)模式——雙重檢測(cè)2.3雙重檢測(cè)鎖定(Double-checkedlocking)是實(shí)際開(kāi)發(fā)中最常用的一種單例實(shí)現(xiàn)方式,它通過(guò)加鎖的方式保證了線程安全性。當(dāng)程序執(zhí)行時(shí)如果有多個(gè)線程同時(shí)訪問(wèn)getInstance()方法,由于此時(shí)instance實(shí)例為空,因此這些線程都會(huì)執(zhí)行instance=newSingleton2()代碼,從而導(dǎo)致多個(gè)實(shí)例被創(chuàng)建,以致出現(xiàn)線程不安全問(wèn)題。為了解決這個(gè)問(wèn)題,我們可以使用雙重檢測(cè)方式來(lái)創(chuàng)建單例。
單例設(shè)計(jì)模式——優(yōu)缺點(diǎn)2.3優(yōu)點(diǎn):(1)單例模式降低了系統(tǒng)中實(shí)例數(shù)量,提高了系統(tǒng)的可維護(hù)性。(2)單例模式創(chuàng)建出的唯一實(shí)例可以被其他對(duì)象復(fù)用和共享,提高了代碼的復(fù)用性。(3)由于單例模式只會(huì)創(chuàng)建一個(gè)實(shí)例,這樣可以減少不必要的資源消耗,例如在創(chuàng)建和銷毀對(duì)象時(shí)所需的資源與時(shí)間成本。缺點(diǎn):(1)由于單例模式只有一個(gè)實(shí)例,如果該實(shí)例中的狀態(tài)被多個(gè)對(duì)象共享和修改,可能會(huì)導(dǎo)致對(duì)象狀態(tài)的不一致。(2)單例模式需要保證只有一個(gè)實(shí)例,因此在多線程環(huán)境下需要使用特殊的處理方式來(lái)保證實(shí)例的唯一性,這可能會(huì)導(dǎo)致代碼的復(fù)雜性增加。(3)由于單例模式的實(shí)例化過(guò)程是在類內(nèi)部進(jìn)行的,因此可能會(huì)影響系統(tǒng)的擴(kuò)展性,特別是在需要擴(kuò)展單例類時(shí),可能會(huì)需要修改該類的代碼。
控制反轉(zhuǎn)與依賴注入的概念2.4在傳統(tǒng)模式下,當(dāng)某個(gè)Java對(duì)象(調(diào)用者)需要調(diào)用另一個(gè)Java對(duì)象(被調(diào)用者,即被依賴對(duì)象)時(shí),首先會(huì)通過(guò)“new被調(diào)用者”的方式來(lái)創(chuàng)建對(duì)象(如下圖所示),這種方式會(huì)導(dǎo)致調(diào)用者與被調(diào)用者之間的耦合度增加,不利于項(xiàng)目后期的擴(kuò)展和維護(hù)。
控制反轉(zhuǎn)與依賴注入的概念2.4在使用Spring框架之后,對(duì)象的實(shí)例不再由調(diào)用者來(lái)創(chuàng)建,而是由Spring容器來(lái)創(chuàng)建,當(dāng)調(diào)用者需要使用被調(diào)用者時(shí)直接從Spring容器中獲取就可以。這樣對(duì)象的控制權(quán)就由開(kāi)發(fā)者的手動(dòng)創(chuàng)建轉(zhuǎn)移到了Spring容器,控制權(quán)發(fā)生了反轉(zhuǎn),這就是Spring的控制反轉(zhuǎn)。另外,從Spring容器的角度來(lái)看,在調(diào)用者需要使用被調(diào)用者時(shí),Spring容器會(huì)將被調(diào)用者對(duì)象從容器中取出,并賦值給調(diào)用者的成員變量,這相當(dāng)于為調(diào)用者注入了它所依賴的實(shí)例,這就是Spring的依賴注入。依賴注入的實(shí)現(xiàn)方式——屬性setter方法注入2.5屬性setter方法注入是指IOC容器使用setter方法注入被依賴的實(shí)例。通過(guò)調(diào)用無(wú)參構(gòu)造器或無(wú)參靜態(tài)工廠方法實(shí)例化Bean后,調(diào)用該Bean的setter方法,即可實(shí)現(xiàn)基于setter方法的依賴注入。spring配置文件:appIicationContext.xmlUserServiceImpl.java依賴注入的實(shí)現(xiàn)方式——構(gòu)造方法注入2.5構(gòu)造方法注入是指loC容器使用構(gòu)造方法注入被依賴的實(shí)例。此種方式通過(guò)調(diào)用帶參數(shù)的構(gòu)造方法來(lái)實(shí)現(xiàn),每個(gè)參數(shù)都代表一個(gè)依賴。UserServiceImpl.javaspring配置文件:appIicationContext.xmlSpringIOC容器2.52、ApplicationContextApplicationContext是BeanFactory的子接口,也被稱為應(yīng)用上下文,它不僅包含了BeanFactory的所有功能,還添加了對(duì)國(guó)際化、資源訪問(wèn)、事件傳播等方面的支持。與BeanFactory不同的是,ApplicationContext實(shí)例化后會(huì)自動(dòng)對(duì)所有的單例Bean進(jìn)行實(shí)例化并配置它們之間的依賴關(guān)系。由于ApplicationContext接口功能更為強(qiáng)大,因此在絕大多數(shù)場(chǎng)景下,都會(huì)使用ApplicationContext作為SpringIOC容器。ApplicationContext接口可以通過(guò)以下兩種方式完成實(shí)例化:(1)通過(guò)ClassPathXmlApplicationContext類完成實(shí)例化(推薦使用)ClassPathXmlApplicationContext類會(huì)從類路徑classPath中尋找并加載指定的XML配置文件,以完成ApplicationContext的實(shí)例化。SpringIOC容器2.5(2)通過(guò)FileSystemXmlApplicationContext類完成實(shí)例化。FileSystemXmlApplicationContext類會(huì)從指定的文件系統(tǒng)路徑(絕對(duì)路徑)中尋找并加載對(duì)應(yīng)的XML配置文件,以完成ApplicationContext的實(shí)例化如果不指定絕對(duì)路徑,F(xiàn)ileSystemXmlApplicationContext將嘗試在當(dāng)前工作目錄中查找指定的配置文件。然而這種方式可能會(huì)導(dǎo)致程序的靈活性變差,因?yàn)楫?dāng)前工作目錄可能因環(huán)境變化而改變,從而導(dǎo)致無(wú)法正確找到配置文件。因此,推薦使用ClassPathXmlApplicationContext來(lái)從類路徑中加載配置文件,這樣可以確保配置文件始終可以被正確加載。SpringBean的配置及常用屬性2.6Spring的核心組成部分是IOC容器,它可以創(chuàng)建、存儲(chǔ)和管理SpringBean。為了使用IOC容器,開(kāi)發(fā)者需要對(duì)Spring配置文件進(jìn)行配置,其支持XML和Properties兩種格式的配置文件,其中XML格式最為常用,開(kāi)發(fā)者可以通過(guò)編寫(xiě)XML配置文件來(lái)注冊(cè)管理Bean之間的依賴關(guān)系。XML配置文件中,<bean>元素是最重要的元素之一,它用于描述一個(gè)Bean的定義和配置。屬性說(shuō)明idBean的唯一標(biāo)識(shí)符,通過(guò)id屬性來(lái)標(biāo)識(shí)Bean的名稱。在Spring容器中,可以通過(guò)該名稱獲取對(duì)應(yīng)的Bean實(shí)例。id屬性是必須屬性。classBean的類全名,用于告訴Spring容器該Bean的實(shí)現(xiàn)類是什么。在運(yùn)行時(shí),Spring容器會(huì)根據(jù)該類全名來(lái)創(chuàng)建Bean實(shí)例。class屬性是必須屬性。scopeBean的作用范圍,用于指定Bean的生命周期和可見(jiàn)范圍。常用的作用域有singleton、prototype、request、session、globalsession等。默認(rèn)作用域是singleton(單例)。init-methodBean初始化時(shí)調(diào)用的方法。該方法必須是Bean實(shí)現(xiàn)類中的一個(gè)方法,并且不帶任何參數(shù)。destroy-methodBean銷毀時(shí)調(diào)用的方法。該方法必須是Bean實(shí)現(xiàn)類中的一個(gè)方法,并且不帶任何參數(shù)。lazy-init延遲加載,用于指定是否在第一次使用Bean時(shí)才進(jìn)行實(shí)例化。如果將該屬性設(shè)置為true,表示該Bean將在第一次使用時(shí)才被實(shí)例化。autowire自動(dòng)裝配模式,用于指定如何自動(dòng)裝配該Bean的依賴。常用的自動(dòng)裝配模式有byName、byType、constructor等。默認(rèn)情況下,Spring不會(huì)自動(dòng)裝配Bean的依賴。depends-on依賴的Bean名稱,用于指定該Bean依賴的其他Bean。如果該屬性存在,Spring會(huì)先創(chuàng)建指定的Bean,再創(chuàng)建當(dāng)前Bean。factory-method工廠方法名稱,用于通過(guò)工廠方法來(lái)創(chuàng)建Bean。如果Bean的實(shí)例化過(guò)程比較復(fù)雜,可以使用工廠方法來(lái)創(chuàng)建Bean實(shí)例。factory-bean工廠Bean的名稱,用于指定使用哪個(gè)Bean作為工廠來(lái)創(chuàng)建Bean。如果Bean是由其他Bean創(chuàng)建的,可以使用該屬性來(lái)指定使用哪個(gè)Bean作為工廠。SpringBean的實(shí)例化2.7構(gòu)造器實(shí)例化靜態(tài)工廠方式實(shí)例化實(shí)例工廠方式實(shí)例化SpringBean的實(shí)例化——構(gòu)造器實(shí)例化2.7構(gòu)造器實(shí)例化是指Spring容器通過(guò)Bean對(duì)應(yīng)類中默認(rèn)的無(wú)參構(gòu)造方法來(lái)實(shí)例化Bean。如果類中包含含參的構(gòu)造方法,則一定要顯示地聲明無(wú)參構(gòu)造方法,否則會(huì)因?yàn)轭愔袥](méi)有無(wú)參數(shù)構(gòu)造方法而報(bào)錯(cuò)。User.javaspring配置文件:appIicationContext.xmlSpringBean的實(shí)例化——靜態(tài)工廠實(shí)例化2.7靜態(tài)工廠是實(shí)例化SpringBean的另一種方式,該方式要求創(chuàng)建一個(gè)靜態(tài)工廠方法來(lái)實(shí)現(xiàn)Bean的實(shí)例化。配置文件中<bean>元素的class屬性所指定的不再是Bean實(shí)例的實(shí)現(xiàn)類,而是靜態(tài)工廠類,同時(shí)還需要使用factory-method屬性來(lái)指定靜態(tài)工廠中創(chuàng)建Bean的方法。User.java添加含參構(gòu)造方法創(chuàng)建靜態(tài)工廠StaticUserFactory類用來(lái)生成User類的對(duì)象在applicationContext.xml文件中通過(guò)靜態(tài)工廠方法來(lái)配置SpringBeanSpringBean的實(shí)例化——實(shí)例工廠實(shí)例化2.7此種方式的工廠類中,不再使用靜態(tài)方法創(chuàng)建Bean實(shí)例,而是直接創(chuàng)建Bean對(duì)象。同時(shí)在配置文件中,需要實(shí)例化的Bean也不是通過(guò)class屬性直接指向,而是通過(guò)factory-bean屬性指向配置的實(shí)例工廠,然后使用factory-method屬性確定使用工廠中的哪個(gè)方法。創(chuàng)建實(shí)例工廠類UserFactory在applicationContext.xml中配置實(shí)例工廠
SpringBean的作用域2.8SpringBean的作用域(Scope)是指Bean實(shí)例在應(yīng)用中的生命周期和可見(jiàn)范圍。Spring容器提供多種不同的作用域,每種作用域都有不同的生命周期和可見(jiàn)范圍,開(kāi)發(fā)者可以根據(jù)自己的需求選擇適合的作用域。在使用時(shí)只需在<beanscope=”...”>中指定具體的作用域即可作用域描述singleton(單例)Spring容器中只會(huì)創(chuàng)建一個(gè)Bean實(shí)例,所有請(qǐng)求該Bean的對(duì)象都會(huì)共享同一個(gè)實(shí)例。prototype(原型)每次請(qǐng)求Bean時(shí),Spring容器都會(huì)創(chuàng)建一個(gè)新的Bean實(shí)例。每個(gè)請(qǐng)求都會(huì)獲得一個(gè)獨(dú)立的Bean實(shí)例。request(請(qǐng)求)每個(gè)HTTP請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的Bean實(shí)例,該實(shí)例僅在當(dāng)前請(qǐng)求的范圍內(nèi)有效。不同的請(qǐng)求將獲得不同的Bean實(shí)例。session(會(huì)話)每個(gè)HTTP會(huì)話都會(huì)創(chuàng)建一個(gè)新的Bean實(shí)例,該實(shí)例僅在當(dāng)前會(huì)話的范圍內(nèi)有效。同一會(huì)話內(nèi)的不同請(qǐng)求將共享同一個(gè)Bean實(shí)例。globalsession(全局會(huì)話)僅適用于基于portlet的Web應(yīng)用,全局會(huì)話作用域僅在具有多個(gè)portlet的Web應(yīng)用程序中才有意義。通常情況下,它與普通的HTTP會(huì)話作用域相同。
SpringBean的生命周期2.9Spring容器按照自身的方法(doCreateBean方法)將SpringBean的生命周期劃分為實(shí)例化、屬性賦值、初始化、銷毀等四個(gè)階段。
SpringBean的裝配方式2.10SpringBean的裝配可以理解為依賴關(guān)系注入,Bean的裝配方式即Bean依賴注入的方式。Spring容器支持多種形式的裝配方式,主要包括:基于XML的裝配基于JavaConfig配置bean基于注解的裝配自動(dòng)裝配
SpringBean的裝配方式——基于XML的裝配2.10Spring提供兩種基于XML的裝配方式:設(shè)值注入和構(gòu)造注入。在Spring實(shí)例化Bean的過(guò)程中,Spring首先會(huì)調(diào)用Bean的默認(rèn)構(gòu)造方法來(lái)實(shí)例化Bean對(duì)象,然后通過(guò)反射的方式調(diào)用setter方法來(lái)注入屬性值。因此,設(shè)值注入要求一個(gè)Bean必須滿足以下兩點(diǎn)要求:?Bean類必須提供一個(gè)默認(rèn)的無(wú)參構(gòu)造方法。?Bean類必須為需要注入的屬性提供對(duì)應(yīng)的setter方法。使用設(shè)值注入時(shí),需要在Spring配置文件中使用<bean>元素的子元素<property>來(lái)為每個(gè)屬性設(shè)置注入值。而使用構(gòu)造注入時(shí),需要使用<bean>元素的子元素<constructor-arg>來(lái)定義構(gòu)造方法的參數(shù),同時(shí)使用其value屬性(或子元素)設(shè)置該參數(shù)的值。示例:“第7章springIOC\代碼\07基于XML的裝配\spring_ioc”
SpringBean的裝配方式——基于JavaConfig配置bean2.10在Spring框架中,開(kāi)發(fā)者還可以使用JavaConfig方式配置Bean。JavaConfig是從Spring3.0開(kāi)始提供的一種配置Bean的方式,它使用Java代碼定義和配置Bean,以避免配置XML文件而帶來(lái)的繁瑣和復(fù)雜。JavaConfig的應(yīng)用需要使用@Configuration注解標(biāo)記一個(gè)Java配置類(可以替換applicationContext.xml),該類利用@Bean注解聲明SpringBean,被聲明的Bean會(huì)在Spring容器啟動(dòng)時(shí)被自動(dòng)創(chuàng)建并放入容器中,以供其它組件使用。示例:“第7章springIOC\代碼\08通過(guò)JavaConfig配置bean”
SpringBean的裝配方式——基于注解的裝配2.10為了進(jìn)一步簡(jiǎn)化SpringBean的裝配方式,踐行“約定大于配置”的思想,Spring還提供了基于注解的裝配方式。注解(Annotation)是在計(jì)算機(jī)程序中添加的一種元數(shù)據(jù),用于為代碼元素(例如類、方法、變量等)提供補(bǔ)充說(shuō)明或標(biāo)記特定屬性或行為。它們以@符號(hào)開(kāi)頭,通常放置在代碼元素的前面,以便在編譯時(shí)或運(yùn)行時(shí)被解釋和處理。它是Java語(yǔ)言的一個(gè)強(qiáng)大特性,可以用于很多場(chǎng)景,如為代碼添加文檔、進(jìn)行代碼檢查、指定依賴項(xiàng)、標(biāo)記測(cè)試用例等。在Spring框架中,注解可以使開(kāi)發(fā)者無(wú)需手動(dòng)配置每個(gè)Bean之間的依賴關(guān)系,而是通過(guò)在類、字段、構(gòu)造函數(shù)等位置添加特定的注解,Spring框架就可以自動(dòng)掃描并創(chuàng)建和裝配Bean,從而避免手動(dòng)編寫(xiě)大量配置文件帶來(lái)的麻煩。
SpringBean的裝配方式——基于注解的裝配2.10注解作用@Autowired自動(dòng)裝配Bean依賴@Component通用組件掃描注解@Controller聲明控制器類@Repository聲明數(shù)據(jù)訪問(wèn)層類@Service聲明服務(wù)層類@Configuration定義配置類@Bean定義Bean對(duì)象@Value注入配置屬性值@Qualifier指定Bean名稱@Scope指定Bean作用域@PostConstruct在Bean初始化后執(zhí)行方法@PreDestroy在Bean銷毀前執(zhí)行方法@RequestMapping定義控制器請(qǐng)求映射@PathVariable獲取請(qǐng)求路徑中的參數(shù)@RequestParam獲取請(qǐng)求參數(shù)@ResponseBody響應(yīng)請(qǐng)求結(jié)果@ResponseStatus定義響應(yīng)狀態(tài)碼@ExceptionHandler處理控制器方法中的異常@Transactional聲明事務(wù)示例:“第7章springIOC\代碼\09基于注解的裝配\spring_ioc”
SpringBean的裝配方式——自動(dòng)裝配2.10在Spring框架中,自動(dòng)裝配(autowiring)是指將一個(gè)Bean自動(dòng)注入到其他Bean的屬性中,以實(shí)現(xiàn)它們之間的依賴關(guān)系。Spring框架提供了多種自動(dòng)裝配的方式,例如:在XML配置文件中,可以使用<bean>元素的autowire屬性來(lái)指定自動(dòng)裝配的方式,如byName、byType等。在注解方式中,可以使用@Autowired、@Resource等注解來(lái)實(shí)現(xiàn)自動(dòng)裝配。在JavaConfig配置中,可以使用@Configuration和@Bean注解來(lái)指定自動(dòng)裝配的方式。自動(dòng)裝配的好處在于它可以讓開(kāi)發(fā)人員更加便捷地組合Bean,以減少手動(dòng)配置的工作量,同時(shí)也避免因配置錯(cuò)誤而引起的潛在問(wèn)題。然而需要注意的是,在使用自動(dòng)裝配時(shí),應(yīng)注意Bean的命名規(guī)范和類型匹配,以避免出現(xiàn)不必要的錯(cuò)誤。
SpringBean的裝配方式——Spring自動(dòng)裝配的方式2.10自動(dòng)裝配方式特點(diǎn)byName根據(jù)依賴項(xiàng)的名稱進(jìn)行自動(dòng)裝配。需要依賴項(xiàng)的名稱和屬性名匹配。byType根據(jù)依賴項(xiàng)的類型進(jìn)行自動(dòng)裝配。如果容器中存在多個(gè)與屬性類型匹配的bean,則會(huì)拋出異常。constructor通過(guò)構(gòu)造函數(shù)進(jìn)行自動(dòng)裝配。會(huì)根據(jù)構(gòu)造函數(shù)參數(shù)的類型和名稱來(lái)匹配依賴項(xiàng)。autodetect默認(rèn)方式,先嘗試按byType自動(dòng)裝配,如果找不到再嘗試按byName自動(dòng)裝配。需要注意的是,在使用byName和byType進(jìn)行自動(dòng)裝配時(shí),需要在依賴項(xiàng)上添加@Autowired注解,而使用constructor自動(dòng)裝配時(shí),則不需要添加注解。此外,還可以使用@Qualifier注解來(lái)指定具體的依賴項(xiàng)名稱,以避免裝配時(shí)的歧義。E6636BC20180234D78A0072836F0BA7012B9B20215E26B50ACD98F3EB1392B551B4EBF38216C3B0222692E0838460BEBE009217A41D02B111BBFC23A765E14D124F449AD6A2784D7348224B76F624F873694ECB77C9D5FC1A8B6E19E00602C88DA962B9CCE3項(xiàng)目實(shí)現(xiàn)——用戶新建功能03項(xiàng)目整體結(jié)構(gòu)3.1mapper目錄:該目錄下存放了DAO層實(shí)現(xiàn),包含了UserMapper接口以及對(duì)應(yīng)的UserMapper.xml文件,用于實(shí)現(xiàn)對(duì)用戶數(shù)據(jù)的增刪改查等操作。pojo目錄:該目錄下存放了實(shí)體類,主要有User用戶類,用于描述用戶的各個(gè)屬性。service目錄:該目錄下包含了業(yè)務(wù)層接口及其實(shí)現(xiàn)類,分別為IUserService和IUserServiceImpl,用于定義和實(shí)現(xiàn)與用戶相關(guān)的業(yè)務(wù)邏輯。resources目錄:該目錄下包含了配置文件,這里包含了MyBatis和Spring的配置文件,用于配置數(shù)據(jù)庫(kù)連接、Mapper掃描等相關(guān)信息。test目錄:該目錄下包含了DAO層和Service層的測(cè)試類,這些測(cè)試類都繼承了BaseTest類,用于測(cè)試相關(guān)類的正確性和可靠性。pom.xml:是Maven項(xiàng)目的核心配置文件,用于管理項(xiàng)目所需的依賴包和其他配置信息項(xiàng)目實(shí)現(xiàn)步驟3.2導(dǎo)入項(xiàng)目依賴包創(chuàng)建User類配置MybatisSpring整合Mybatis配置業(yè)務(wù)層Springbean的包掃描路徑數(shù)據(jù)訪問(wèn)接口層(Dao)接口及實(shí)現(xiàn)業(yè)務(wù)層(Service)接口及實(shí)現(xiàn)測(cè)試類編寫(xiě)E6636BC20180234D78A0072836F0BA7012B9B20215E26B50ACD98F3EB1392B551B4EBF38216C3B0222692E0838460BEBE009217A41D02B111BBFC23A765E14D124F449AD6A2784D7348224B76F624F873694ECB77C9D5FC1A8B6E19E00602C88DA962B9CCE3經(jīng)典問(wèn)題強(qiáng)化04經(jīng)典問(wèn)題強(qiáng)化4.11、哪種依賴注入方式建議使用,是構(gòu)造器注入,還是Setter方法注入?對(duì)于選擇使用哪種依賴注入方式,可以根據(jù)具體的需求和場(chǎng)景進(jìn)行選擇。一般來(lái)說(shuō),如果依賴項(xiàng)是必需的,或者對(duì)于一個(gè)對(duì)象只需要進(jìn)行一次性注入,那么構(gòu)造方法注入可能是更好的選擇。如果依賴項(xiàng)是可選的,或者需要在對(duì)象實(shí)例化后動(dòng)態(tài)更改依賴項(xiàng),那么Setter方法注入可能更合適。同時(shí),也可以混合使用兩種方式來(lái)實(shí)現(xiàn)依賴注入,以達(dá)到更好的靈活性和可維護(hù)性。經(jīng)典問(wèn)題強(qiáng)化4.12、Spring框架中的單例Bean是線程安全的么?在Spring框架中,單例Bean是線程安全的,這是因?yàn)镾pring容器會(huì)為每個(gè)單例Bean創(chuàng)建
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)貼劑行業(yè)發(fā)展現(xiàn)狀及前景規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)稀土冶煉分離市場(chǎng)運(yùn)行動(dòng)態(tài)及發(fā)展前景分析報(bào)告
- 2025甘肅省安全員考試題庫(kù)附答案
- 南京醫(yī)科大學(xué)《課程論文寫(xiě)作與學(xué)術(shù)規(guī)范》2023-2024學(xué)年第二學(xué)期期末試卷
- 黔西南民族職業(yè)技術(shù)學(xué)院《外國(guó)建筑史》2023-2024學(xué)年第二學(xué)期期末試卷
- 青海交通職業(yè)技術(shù)學(xué)院《傳感檢測(cè)技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 天津商業(yè)大學(xué)《學(xué)術(shù)論文選題與寫(xiě)作》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖北大學(xué)《財(cái)務(wù)會(huì)計(jì)一》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025上海市建筑安全員考試題庫(kù)及答案
- 西藏大學(xué)《軟件交互設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 小學(xué)四年級(jí)英語(yǔ)教學(xué)反思3篇
- DB1509T 0025-2024 肉牛舍設(shè)計(jì)與建筑技術(shù)規(guī)范
- 上海室內(nèi)裝飾施工合同示范文本2024年
- 2024版2024年《汽車文化》全套教案
- 房地產(chǎn) -中建科工五大類型項(xiàng)目成本指標(biāo)庫(kù)
- 2024小紅書(shū)保健品行業(yè)營(yíng)銷通案
- 未來(lái)網(wǎng)絡(luò)支撐下的數(shù)字身份體系:產(chǎn)業(yè)和技術(shù)發(fā)展趨勢(shì)(2024年)定稿版本
- 新《卷煙營(yíng)銷》理論知識(shí)考試題庫(kù)(附答案)
- 中考英語(yǔ)688高頻詞大綱詞頻表
- 知識(shí)產(chǎn)權(quán)保護(hù)與跨境執(zhí)法合作
- 肉類食品配送服務(wù)投標(biāo)方案(技術(shù)方案)
評(píng)論
0/150
提交評(píng)論