廖雪峰javaee企業(yè)級(jí)分布式高級(jí)架構(gòu)師第一期開課吧java06課spring5講義_第1頁(yè)
廖雪峰javaee企業(yè)級(jí)分布式高級(jí)架構(gòu)師第一期開課吧java06課spring5講義_第2頁(yè)
廖雪峰javaee企業(yè)級(jí)分布式高級(jí)架構(gòu)師第一期開課吧java06課spring5講義_第3頁(yè)
廖雪峰javaee企業(yè)級(jí)分布式高級(jí)架構(gòu)師第一期開課吧java06課spring5講義_第4頁(yè)
廖雪峰javaee企業(yè)級(jí)分布式高級(jí)架構(gòu)師第一期開課吧java06課spring5講義_第5頁(yè)
已閱讀5頁(yè),還剩67頁(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、1 知識(shí)點(diǎn)大綱IoC 原理分析l基于 XML 的 IoC 實(shí)現(xiàn)l基于 XML 的 DI 使用l基于注解的 IoC 實(shí)現(xiàn)lSpring 純注解實(shí)現(xiàn)方式(無(wú) XML 配置)lSpring 整合 JunitlSpring 分模塊開發(fā)lSpring AOP 原理分析lSpring AOP 基于 XML 和注解的實(shí)現(xiàn)lSpring 應(yīng)用之 Spring JDBC 實(shí)現(xiàn)lSpring 應(yīng)用之 JdbcDaoSupportlSpring 應(yīng)用之事務(wù)支持lSpring 與 Mybatis 整合l2 Spring 介紹什么是 Spring?百科中的介紹ll Spring:l 我們經(jīng)常說(shuō)的 Spring 其實(shí)指的

2、是 Spring Framework(spring框架)。為什么學(xué)習(xí) Spring?l 好處:耦合和內(nèi)聚介紹Spring 版本介紹l spring 的官網(wǎng):l spring framework 的:*耦合性(Coupling),也叫耦合度,是對(duì)模塊間關(guān)聯(lián)程度的度量。*在軟件工程中,耦合指的就是就是對(duì)象之間的依賴性。對(duì)象之間的耦合越高,維護(hù)成本越高。因此對(duì)象的設(shè)計(jì)應(yīng)使類和構(gòu)件之間的耦合最小。軟件設(shè)計(jì)中通常用耦合度和內(nèi)聚度作為衡量模塊 程度的標(biāo)準(zhǔn)。劃分模塊的一個(gè)準(zhǔn)則就是高內(nèi)聚低耦合。*內(nèi)聚標(biāo)志一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度,它是信息隱蔽和局部化概念的自然擴(kuò)展。內(nèi)聚是從功能角度來(lái)度量模塊內(nèi)的

3、,一個(gè)好的內(nèi)聚模塊應(yīng)當(dāng)恰好做一件事。*內(nèi)聚和耦合是密切相關(guān)的,同其他模塊存在高耦合的模塊意味著低內(nèi)聚,而高內(nèi)聚的模塊意味著該模塊同其他模塊之間是低耦合。在進(jìn)行軟件設(shè)計(jì)時(shí),應(yīng)力爭(zhēng)做到高內(nèi)聚,低耦合。l jar 包地址:Spring 體系結(jié)構(gòu)Spring概念介紹給 Spring 框架。l AOP:Aspect Oriented Programming,面向切面編程。在不修改目標(biāo)對(duì)象的源代碼情況下,增強(qiáng) IoC 容器中 Bean 的功能。l DI:Dependency Injection,依賴注入。在 Spring 框架負(fù)責(zé)創(chuàng)建 Bean 對(duì)象時(shí),動(dòng)態(tài)的將依賴對(duì)象注入到 Bean 組件中!l Spr

4、ing 容器:指的就是 IoC 容器。l IoC(中的):Inverse of Control,控制反轉(zhuǎn)。對(duì)象的創(chuàng)建權(quán)力由程序反轉(zhuǎn)3 Spring IoC 原理分析什么是 IoC 容器?l 什么是 IoC 容器?l Spring 框架中的工廠有哪些?l ApplicationContext 和 BeanFactory 的區(qū)別?*創(chuàng)建 Bean 對(duì)象的時(shí)機(jī)不同:*ApplicationContext 接口()* 實(shí)現(xiàn)了 BeanFactory 接口* 實(shí)現(xiàn) ApplicationContext 接口的工廠,可以獲取到容器中具體的 Bean 對(duì)象*BeanFactory 工廠(是 Spring 框

5、架早期的創(chuàng)建 Bean 對(duì)象的工廠接口)* 實(shí)現(xiàn) BeanFactory 接口的工廠也可以獲取到 Bean 對(duì)象*其實(shí)通過(guò)源碼分析,不管是 BeanFactory 還是 ApplicationContext,其實(shí)最終的底層BeanFactory 都是 DefaultListableBeanFactory實(shí)例)。*所謂的 IoC 容器就是指的 Spring 中 Bean 工廠里面的 Map結(jié)構(gòu)(了 Bean 的*要想使用 Spring IoC,必須要?jiǎng)?chuàng)建 Spring IoC 容器。*那么什么是 IoC 容器呢?*如何創(chuàng)建 IoC 容器呢?*IoC 容器是如何初始化 Bean 實(shí)例的呢?*Bea

6、nFactory 采取延遲加載,第一次 getBean 時(shí)才會(huì)初始化 Bean。*ApplicationContext 是加載完 applicationContext.xml 時(shí),就創(chuàng)建具體的 Bean對(duì)象的實(shí)例。(只對(duì) BeanDefition 中描述為是單例的 bean,才進(jìn)行餓漢式加載)如何創(chuàng)建 Web 環(huán)境中的 IoC 容器?創(chuàng)建方式l ApplicationContext 接口常用實(shí)現(xiàn)類*ClassPathXmlApplicationContext:它是從類的根路徑下加載配置文件推薦使用這種*FileSystemXmlApplicationContext:它是從磁盤路徑上加載配置文件

7、,配置文件可以在磁盤的任意位置。*AnnotationConfigApplicationContext:l Java 應(yīng)用中創(chuàng)建 IoC 容器:(了解)l Web 應(yīng)用中創(chuàng)建 IoC 容器:(重點(diǎn))web.xml 中配置 ContextLoaderListener 接口,并配置 ContextConfigLocation 參數(shù)*web 容器啟動(dòng)之后加載 web.xml,此時(shí)加載 ContextLoaderListener器(實(shí)現(xiàn)了ServletContextListener 接口,該接口的描述請(qǐng)見下面三類八種器)*ContextLoaderListener器會(huì)在 web 容器啟動(dòng)的時(shí)候,觸發(fā)

8、contextInitialized()方法。*contextInitialized()方調(diào)用 initWebApplicationContext()方法,該方法負(fù)責(zé)創(chuàng)建Spring 容器(DefaultListableBeanFactory)。【W(wǎng)eb 三類八種器】:*域?qū)ο蟮纳芷冢?ServletContextListener:*創(chuàng)建:服務(wù)器啟動(dòng)*銷毀:服務(wù)器正常關(guān)閉*spring ContextLoaderListener(服務(wù)器啟動(dòng)時(shí)負(fù)責(zé)加載 Spring 配置文件)*HttpSessionListener*創(chuàng)建:第一次request.getHttpSession();*銷毀:調(diào)用

9、 invalidate();關(guān)閉;過(guò)期*ServletRequestListenerApplicationContext context = new ClassPathXmlApplicationContext(xml 路徑);當(dāng)我們使用注解配置容器對(duì)象時(shí),需要使用此類來(lái)創(chuàng)建 spring 容器。它用來(lái)注解。源碼分析參考資料中的源碼工程spring-sourcecode1.web 服務(wù)器(tomcat)啟動(dòng)會(huì)加載 web.xm(l 啟動(dòng) ContextLoaderListener器):2.創(chuàng)建 Web 環(huán)境中的 Spring 容器*創(chuàng)建:每一次*銷毀:響應(yīng)結(jié)束*域?qū)ο蟮膶傩裕海ㄌ砑印h除、替換

10、)* ServletContextAttributeListener* HttpSessionAttributeListener* ServletRequestAttributeListener*HttpSession 中 JavaBean 的改變:* HttpSessionBindingListener(HttpSession 和JavaBean 對(duì)象的綁定和解綁)* HttpSessionActivationListener(HttpSession 的序列化,活化、鈍化)3.ContextLoader 類中創(chuàng)建 Spring 容器并初始化容器中的 Bean 實(shí)例4.configureAnd

11、RefreshWebApplicationContext 方法中調(diào)用最終初始化Bean 的refresh 方法圖示該圖示主要是分析上面第三步中【創(chuàng)建 Spring 容器】的圖示IoC 容器如何創(chuàng)建 Bean 對(duì)象?源碼分析源碼來(lái)源于 AbstractApplicationContext 類:Overridepublic void refresh() throws BeansException, IllegalStateException synchronized (this.startupShutdownMonitor) / Prepare this context for refreshin

12、g. prepareRefresh();/1.創(chuàng)建真正的Spring容器(DefaultListableBeanFactory)/2.加載BeanDefition(描述要初始化的Bean的信息)/3.將BeanDefition到BeanDefitionRegistry/ Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();/ Prepare the bean factory for use in

13、 this context. prepareBeanFactory(beanFactory);try / Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory);/執(zhí)行實(shí)現(xiàn)了BeanFactoryPostProcessor接口的Bean/比如PropertyPlaceHolderConfigurer(context:property-placeholer) 就是此處被調(diào)用的,替換掉BeanDefition中的占位符($)中的內(nèi)容/ Invoke f

14、actory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory);/BeanPostProcessor(后置處理器)/比如容器自動(dòng)裝載了一個(gè)AutowiredAnnotationBeanPostProcessor后置處理器(實(shí)現(xiàn)Autowired注解功能)/ Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory);/ Initial

15、ize message source for this context. initMessageSource();/ Initialize event multicaster for this context. initApplicationEventMulticaster();/ Initialize other special beans in specific context subclasses. onRefresh();/ Check for listener beans and register them. registerListeners();/初始化非懶加載方式的單例Bean

16、實(shí)例/ Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory);/ Last step: publish corresponding event. finishRefresh();catch (BeansException ex) if (logger.isWarnEnabled() logger.warn(Exception encountered during context initialization - +cancelling refresh

17、attempt: + ex);/ Destroy already created singletons to avoid dangling resources. destroyBeans();/ Reset active flag. cancelRefresh(ex);/ Propagate exception to caller.throw ex;finally / Reset common introspection caches in Springs core, since we/ might not ever need metadata for singleton beans anym

18、ore. monCaches();圖示4 Spring IoC 基于 XML 的使用創(chuàng)建工程環(huán)境準(zhǔn)備l maven(3.3.9)l JDK(1.8)l spring(5.0.7)l Eclipse(4.7Oxygen)工程搭建l POM 文件4.0.0com.kkbspring0.0.1-SNAPSHOTorg.springframeworkspring-core5.0.7.RELEASEorg.springframeworkspring-context5.0.7.RELEASEorg.springframeworkspring-beans5.0.7.RELEASEorg.springfram

19、eworkspring-expression5.0.7.RELEASEjunitjunit4.12l spring 配置文件(只編寫配置文件頭)具體實(shí)現(xiàn)在 Spring 的 XML 配置文件中配置一個(gè) bean,該最終會(huì)被加載為一個(gè)BeanDefition 對(duì)象(描述對(duì)象信息)org.apache.maven.pluginspiler-pluginUTF-8案例演示l 編寫接口:UserServicel 編寫實(shí)現(xiàn)類:UserServiceImpll 編寫 XML 文件:applicationContext.xmll 編寫單元測(cè)試代碼:TestSpringbean詳解*bean

20、作用:*用于配置對(duì)象讓 spring 來(lái)創(chuàng)建的。*默認(rèn)情況下它調(diào)用的是類中的無(wú)參構(gòu)造函數(shù)。如果沒有無(wú)參構(gòu)造函數(shù)則不能創(chuàng)建成功。*bean屬性:*id:給對(duì)象在容器中提供一個(gè)唯一標(biāo)識(shí)。用于獲取對(duì)象。*class:指定類的全限定類名。用于反射創(chuàng)建對(duì)象。默認(rèn)情況下調(diào)用無(wú)參構(gòu)造函數(shù)。*scope:指定對(duì)象的作用范圍。* singleton :默認(rèn)值,單例的.* prototype :多例的.* request :WEB 項(xiàng)目中,Spring 創(chuàng)建一個(gè) Bean 的對(duì)象, 將對(duì)象存入到request 域中.* session :WEB 項(xiàng)目中,Spring 創(chuàng)建一個(gè) Bean 的對(duì)象, 將對(duì)象存入到se

21、ssion 域中.*global session:WEB 項(xiàng)目中,應(yīng)用在 Portlet 環(huán)境.如果沒有Portlet環(huán)境那么 globalSession 相當(dāng)于 session.*init-method:指定類中的初始化方法名稱。*destroy-method:指定類中銷毀方法名稱。*bean 的作用范圍:*單例對(duì)象:scope=singleton*一個(gè)應(yīng)用只有一個(gè)對(duì)象的實(shí)例。它的作用范圍就是整個(gè)。*生命周期:*對(duì)象出生:當(dāng)應(yīng)用加載,創(chuàng)建容器時(shí),對(duì)象就被創(chuàng)建了。*對(duì)象活著:只要容器在,對(duì)象一直活著。*對(duì)象:當(dāng)應(yīng)用卸載,銷毀容器時(shí),對(duì)象就被銷毀了。*多例對(duì)象:scope=prototype*每

22、次對(duì)象時(shí),都會(huì)重新創(chuàng)建對(duì)象實(shí)例。*生命周期:*對(duì)象出生:當(dāng)使用對(duì)象時(shí),創(chuàng)建新的對(duì)象實(shí)例。*對(duì)象活著:只要對(duì)象在使用中,就一直活著。*對(duì)象:當(dāng)對(duì)象長(zhǎng)時(shí)間不用時(shí),被 java 的回收器回收了。實(shí)例化 bean 的三種方式l 第一種:使用默認(rèn)無(wú)參構(gòu)造函數(shù)(重點(diǎn))l 第二種:靜態(tài)工廠(了解)public class StaticFactory public static UserService createUserService()returnnewUserServiceImpl();l 第三種:實(shí)例工廠(了解)/*/* 模擬一個(gè)靜態(tài)工廠,創(chuàng)建業(yè)務(wù)層實(shí)現(xiàn)類*/*在默認(rèn)情況下:它會(huì)根據(jù)默認(rèn)無(wú)參構(gòu)造函數(shù)來(lái)

23、創(chuàng)建類對(duì)象。*如果 bean 中沒有默認(rèn)無(wú)參構(gòu)造函數(shù),將會(huì)創(chuàng)建失敗。public class InstanceFactory public UserService createUserService()new UserServiceImpl();return5 Spring DI(依賴注入)介紹概述*什么是依賴?*依賴指的就是 Bean 實(shí)例中的屬性*屬性分為:簡(jiǎn)單類型的屬性、POJO 類型的屬性、集合數(shù)組類型的屬性。* 模擬一個(gè)實(shí)例工廠,創(chuàng)建業(yè)務(wù)層實(shí)現(xiàn)類* 此工廠創(chuàng)建對(duì)象,必須現(xiàn)有工廠實(shí)例對(duì)象,再調(diào)用方法*/依賴注入的方式(基于 XML)l 構(gòu)造函數(shù)注入*顧名思義,就是使用類中的構(gòu)造函數(shù),給

24、成員變量賦值。*注意,賦值的操作不是我們自己做的,而是通過(guò)配置的方式,讓 spring框架來(lái)為我們注入。具體代碼如下:public class UserServiceImpl implements UserService private int id;private String name;public UserServiceImpl(int id, String name) this.id = id; = name;Overridepublic void saveUser() System.out.println(保存用戶:id為+id+,name為+name+Servic

25、e實(shí)現(xiàn));*什么是依賴注入?*依賴注入:Dependency Injection。它是 spring 框架ioc 的具體實(shí)現(xiàn)。*為什么要進(jìn)行依賴注入?*我們的程序在編寫時(shí),通過(guò)控制反轉(zhuǎn),把對(duì)象的創(chuàng)建交給了 spring,但是代碼中不可能出現(xiàn)沒有依賴的情況。*ioc 解耦只是降低他們的依賴關(guān)系,但 消除。例如:我們的業(yè)務(wù)層仍會(huì)調(diào)用持久層的方法。那這種業(yè)務(wù)層和持久層的依賴關(guān)系,在使用 spring 之后,就讓 spring 來(lái)維護(hù)了。*簡(jiǎn)單的說(shuō),就是坐等框架把持久層對(duì)象傳入業(yè)務(wù)層,而不用我們自己去獲取。l set 方法注入*set 方法注入又分為手動(dòng)裝配方式注入和自動(dòng)裝配方式注入。*手動(dòng)裝配方式(

26、XML 方式):bean的子property,需要在類中指定set 方法。*自動(dòng)裝配方式(注解方式,后面講解):Autowired 注解、Resource 注解。*Autowired:一部分功能是查找實(shí)例,從 spring 容器中根據(jù)類型(java 類)獲取對(duì)應(yīng)的實(shí)例。另一部分功能就是賦值,將找到的實(shí)例,裝配給另一個(gè)實(shí)例的屬性值。l 使用 p 名稱空間注入數(shù)據(jù)(本質(zhì)上還是調(diào)用 set 方法,自行了解)依賴注入不同類型的屬性(基于 XML)l 簡(jiǎn)單類型1. 步驟一:需要先引入 p 名稱空間* 在schema的名稱空間中加入該行:xmlns:p=2. 步驟二:使用 p 名稱空間的語(yǔ)法* p:屬性名

27、 = * p:屬性名-ref = 3. 步驟三:測(cè)試* (注意事項(xiàng):一個(gè) java 類型在同一個(gè) spring 容器中,只能有一個(gè)實(shí)例)*Resource:一部分功能是查找實(shí)例,從 spring 容器中根據(jù) Bean 的名稱(bean 的名稱)獲取對(duì)應(yīng)的實(shí)例。另一部分功能就是賦值,將找到的實(shí)例,裝配給另一個(gè)實(shí)例的屬性值。類型ll 集合類型(數(shù)組)1. 如果是數(shù)組或者 List 集合,注入配置文件的方式是一樣的美美小風(fēng)2. 如果是 Set 集合,注入的配置文件方式如下:哈哈6 Spring IoC 和DI 基于注解使用呵呵3. 如果是 Map 集合,注入的配置方式如下:4. 如果是 proper

28、ties 屬性文件的方式,注入的配置如下:root123IoC 注解使用*第一步:spring 配置文件中,配置ponent-scan*第二步:類上面加上注解Component,或者它的衍生注解Controller、Service、Repository*學(xué)習(xí)基于注解的 IoC 配置,大家腦海里首先得有一個(gè)認(rèn)知,即注解配置和 xml 配置要實(shí)現(xiàn)的功能都是一樣的,都是要降低程序間的耦合。只是配置的形式不一樣。*關(guān)于實(shí)際的開發(fā)中到底使用 xml 還是注解,每家公司有著不同的使用習(xí)慣。所以這兩種配置方式我們都需要掌握。*我們?cè)谥v解注解配置時(shí),采用上一章節(jié)的案例,把 spring 的 xml 配置內(nèi)容改

29、為使用注解逐步實(shí)現(xiàn)。常用注解IoC 注解(創(chuàng)建對(duì)象)相當(dāng)于:l Component 注解l Controller、Service、Repository 注解DI 注解(依賴注入)相當(dāng)于:l Autowired*他們?nèi)齻€(gè)注解都是針對(duì)Component 的衍生注解*他們的作用及屬性都是一模一樣的。他們只不過(guò)是提供了更加明確的語(yǔ)義化。Controller:一般用于表現(xiàn)層的注解。Service:一般用于業(yè)務(wù)層的注解。Repository:一般用于持久層的注解。*細(xì)節(jié):如果注解中有且只有一個(gè)屬性要賦值時(shí),且名稱是 value,value 在賦值是可以不寫。*作用:把讓 spring 來(lái)管理。相當(dāng)于在 x

30、ml 中配置一個(gè) bean。*屬性:value:指定 bean 的 id。如果不指定 value 屬性,默認(rèn) bean 的 id 是當(dāng)前類的類名。首字母小寫。l Qualifierl Resource相當(dāng)于:l Value*給基本類型和 String 類型注入值*可以使用占位符獲取屬性文件中的值。*默認(rèn)按照名稱進(jìn)行裝配,名稱可以通過(guò) name 屬性進(jìn)行指定*這個(gè)注解屬于 J2EE 的*如果沒有指定 name 屬性,當(dāng)注解寫在字段上時(shí),默認(rèn)取字段名進(jìn)行安裝名稱查找,當(dāng)找不到與名稱匹配的 bean 時(shí)才按照類型進(jìn)行裝配。*但是需要注意的是,如果 name 屬性一旦指定,就只會(huì)按照名稱進(jìn)行裝配。推薦

31、使用Resource 注解,因?yàn)檫@個(gè)注解是屬于 J2EE 的,減少了與 spring 的耦合。這樣代碼看起就比較優(yōu)雅。*在自動(dòng)按照類型注入的基礎(chǔ)之上,再按照 Bean 的 id 注入。*它在給字段注入時(shí)不能使用,必須和Autowire 一起使用;但是給方法參數(shù)注入時(shí),可以使用。*默認(rèn)按類型裝配(byType)*這個(gè)注解是 spring 自身的*默認(rèn)情況下必須要求依賴對(duì)象必須存在,如果要允許 null 值,可以設(shè)置它的 required 屬性為 false,如:Autowired(required=false)*如果我們想使用名稱裝配可以結(jié)合Qualifier 注解進(jìn)行使用改變作用范圍l Sco

32、pe和生命周期相關(guān)關(guān)于注解和 XML 的選擇問題*注解的優(yōu)勢(shì):配置簡(jiǎn)單,維護(hù)方便(我們找到類,就相當(dāng)于找到了對(duì)應(yīng)的配置)。*XML 的優(yōu)勢(shì):修改時(shí),不用改源碼。不涉及重新編譯和部署。*Spring 管理 Bean 方式的比較:相當(dāng)于:PostConstruct 和PreDestroy相當(dāng)于*作用:指定 bean 的作用范圍。*屬性:value:指定范圍的值。取值:singleton prototype request session globalsessionValue(“$name”)/name 是 properties 文件中的 keyprivate String name;7 Sprin

33、g 的純注解配置*寫到此處,基于注解的 IoC 配置已經(jīng)完成,但是大家都發(fā)現(xiàn)了一個(gè)問題:我們依然離不開 spring 的 xml 配置文件,那么能不能不寫這個(gè) applicationContext.xml,所有配置都用注解來(lái)實(shí)現(xiàn)呢?*當(dāng)然,同學(xué)們也需要注意一下,我們選擇哪種配置的原則是簡(jiǎn)化開發(fā)和配置方便,而待改造的問題*想能不能將以下這些 bean 的配置都從 xml 中去掉,并且最終將 XML 也去掉。*如果可以,那么我們就可以脫離 xml 配置了。l 注解掃描配置(能不能去掉)l 非自定義的 Bean 配置(比如:SqlSessionFactory 和 BasicDataSource 配置

34、)id=sqlSessionFactory class=org.mybatis.spring.SqlSessionFactoryBeanl 去掉 XML 后,如何創(chuàng)建 ApplicationContext新的注解Configurationbeanl 介紹:*從 Spring3.0,Configuration 用于定義配置類,可替換 xml 配置文件*相當(dāng)于根之前創(chuàng)建 ApplicationContext 都是通過(guò)XML 文件進(jìn)行創(chuàng)建的。ApplicationContext context =new ClassPathXmlApplicationContext(“beans.xml”);非追求某

35、種技術(shù)。Beanl 介紹:*Bean 標(biāo)注在方法上(返回某個(gè)實(shí)例的方法),等價(jià)于 spring 配置文件中的*作用為:bean 對(duì)象*主要用來(lái)配置非自定義的 bean,比如 DruidDataSource、SqlSessionFactoryl 屬性:*name:給當(dāng)前Bean 注解方法創(chuàng)建的對(duì)象指定一個(gè)名稱(即 bean 的 id)。* 配置類 內(nèi)部包含有一個(gè)或多個(gè)被Bean 注解的方法, 這些方法將會(huì)被AnnotationConfigApplicationContext 或 AnnotationConfigWebApplicationContext 類進(jìn)行掃描,并用于構(gòu)建 bean 定義,初

36、始化 Spring 容器。l 屬性:value:用于指定配置類的字節(jié)碼l 示例代碼:Configurationpublic class SpringConfiguration /spring 容器初始化時(shí),會(huì)調(diào)用配置類的無(wú)參構(gòu)造函數(shù)public SpringConfiguration() System.out.println(“容器啟動(dòng)初始化?!?;ComponentScanl 介紹:*相當(dāng)于ponent-scan*組件掃描器,掃描Component、Controller、Service、Repository 注解的類。*如果不指定,默認(rèn)與標(biāo)注的方法名相同*Bean注 解 默 認(rèn) 作 用 域

37、為 單 例singleton作 用 域 , 可 通 過(guò)Scope(“prototype”)設(shè)置為原型作用域;l 示例代碼:Configurationpublic class SpringConfiguration /spring 容器初始化時(shí),會(huì)調(diào)用配置類的無(wú)參構(gòu)造函數(shù)public SpringConfiguration()System.out.println(“容器啟動(dòng)初始化?!?;BeanScope(“prototype”)public UserService userService()return new UserServiceImpl(1,“張三”);配置類:Configuration

38、 ComponentScan(basePackages=com.kkb.spring.service) public class SpringConfiguration public SpringConfiguration() System.out.println(容器初始化.);/Bean/Scope(prototype)/public UserService userService() /return new UserServiceImpl(1,張三);/*該注解是編寫在類上面的,一般配合Configuration 注解一起使用。l 屬性:*basePackages:用于指定要掃描的包。*

39、value:和 basePackages 作用一樣。l 示例代碼:Bean 類(Service 類):Servicepublic class UserServiceImpl implements UserService Overridepublic void saveUser() System.out.println(保存用戶Service實(shí)現(xiàn));PropertySourcel 介紹*加載properties 配置文件*編寫在類上面*相當(dāng)于 context:property-placeholderl 屬性value:用于指定 properties 文件路徑,如果在類路徑下,需要寫上 class

40、pathl 示例代碼配置類:Configuration PropertySource(“classpath:perties”) public class JdbcConfig Value($jdbc.driver) private String driver; Value($jdbc.url) private String url; Value($jdbc.username) private String username; Value($jdbc.password) private String password;/* 創(chuàng)建一個(gè)數(shù)據(jù)源,并存入 spring容器中* retur

41、n*/ Bean(name=dataSource)public DataSource createDataSource() l 問題:*當(dāng)系統(tǒng)中有多個(gè)配置類時(shí)怎么辦呢?想之前使用 XML 配置的時(shí)候是如何解決該問題的。properties 文件:.mysql.jdbc.Driver jdbc.url=jdbc:mysql:/spring jdbc.username=rootjdbc.password=roottry ComboPooledDataSource ds = new ComboPooledDataSource(); ds.setDriverClass(driver); ds.setJ

42、dbcUrl(url);ds.setUser(usern ame); ds.setPassword( password); return ds; catch (Exception e) throw new RuntimeException(e);Import通過(guò)注解獲取容器l Java 應(yīng)用(AnnotationConfigApplicationContext)l 介紹*用來(lái)組合多個(gè)配置類*相當(dāng)于 spring 配置文件中的 import*在引入其他配置類時(shí),可以不用再寫Configuration 注解。當(dāng)然,寫上也沒問題。l 屬性value:用來(lái)指定其他配置類的字節(jié)碼文件l 示例代碼:ConfigurationComponentScan(basePackages = com.kkb.spring) Import( JdbcConfig.class

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論