最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

黑馬程序員Spring視頻教程,深度講解spring5底層原理

2023-10-01 23:32 作者:計(jì)算機(jī)小菜雞11  | 我要投稿

ApplicationContext功能

四個(gè)父接口

MessageSource提供翻譯功能,國際化能力

ResourcePatternResolver提供通配符匹配資源的能力

ApplicationEventPublisher提供發(fā)布事件的能力

EnvironmentCapable提供讀取配置文件能力

BeanFactory實(shí)現(xiàn):DefaultListableBeanFactory,bean的定義

后處理器:

①Bean工廠后處理器:負(fù)責(zé)bean的定義

②Bean后處理器:負(fù)責(zé)Bean的實(shí)例生成

默認(rèn)是延遲創(chuàng)建單例對(duì)象

學(xué)到了什么:

a. beanFactory 不會(huì)做的事

  • 1. 不會(huì)主動(dòng)調(diào)用 BeanFactory 后處理器
  • 2. 不會(huì)主動(dòng)添加 Bean 后處理器
  • 3. 不會(huì)主動(dòng)初始化單例
  • 4. beanFactory 還不會(huì)解析 ${ } 與 #{ }


ApplicationContext實(shí)現(xiàn):

AnnotationApplicationContext:內(nèi)部有工具類,自動(dòng)加載后處理器

AnnotationConfigServletWebServerApplicationContext:較為經(jīng)典的容器,基于java配置類來創(chuàng)建,用于創(chuàng)建web環(huán)境。

①內(nèi)嵌容器Tomcat

②dispatcherService

③DispatcherServletRegistrationBean

Bean的生命周期

1 Spring bean生命周期各個(gè)階段:

構(gòu)造/實(shí)例化->依賴注入->初始化->銷毀

bean工廠后處理器,補(bǔ)充bean,configuration定義

bean后處理器:生命周期各個(gè)階段的擴(kuò)展

@PostConstruct 注解是 Java EE和Spring框架中的一種標(biāo)準(zhǔn)注解,它用于在對(duì)象創(chuàng)建后執(zhí)行特定的初始化操作。具體來說,@PostConstruct 注解的作用是標(biāo)記一個(gè)方法,在對(duì)象構(gòu)造完成后(即依賴注入完成后),容器會(huì)自動(dòng)調(diào)用這個(gè)方法,以執(zhí)行一些初始化任務(wù)。

2 模板方法

并不能確定的部分抽象成接口,在特定的時(shí)機(jī)調(diào)用抽象方法。有靜有動(dòng)

靜:固定的步驟

動(dòng):不確定的邏輯

Bean后處理器

1,AutowiredAnnotationBeanPostProcessor用于解析AutoWired注解和Value注解

CommonAnnotationBeanPostProcessor

用于解析@Resource @PostConstruct @PreDestroy

ConfigurationPropertiesBindingPostProcessor解析@ConfigurationProperties

2,AutowiredAnnotationBeanPostProcessor工作流程

調(diào)用postProcessPropertie方法

①先找到某個(gè)類型中標(biāo)注了Autowired的方法或成員變量,即InjectionMetadata

②調(diào)用InjectionMetadata來進(jìn)行注入,注入時(shí)按照類型查找值。

  • 得到成員變量和方法信息之后,把它們封裝成DependencyDescriptor
  • 調(diào)用beanFactory的doResolveDependcy方法

BeanFactory后處理器:

1,常見后處理器

① ConfigurationClassPostProcessor用于解析@ComponentScan @Bean @Import @ImportResource

②,MapperScanner解析@Mapper

2, 組件掃描后處理器實(shí)現(xiàn)

先找包,后找這個(gè)包里面的類的字節(jié)碼,找到加了Component注解的類,進(jìn)行注冊(cè)。

3,@Bean注解的解析

① 獲取配置類的字節(jié)碼文件

② 獲取配置類中被@Bean標(biāo)注的方法信息

③ 遍歷方法,根據(jù)每個(gè)方法生成BeanDefinition,方法名則是Bean的名字

④ 對(duì)Bean注解的一些屬性進(jìn)行解析

4,MapperScan

① 對(duì)對(duì)應(yīng)的包進(jìn)行篩選出接口

② 根據(jù)接口類名,SqlsessionFactory 來創(chuàng)建一個(gè)個(gè)MapperFactoryBean

③ 再往容器里注冊(cè)這個(gè)MapperFactoryBean

Aware接口,Innitialzing

1,Aware接口,Innitialzing初始化接口屬于內(nèi)置功能,不會(huì)失效Aware可以注入名字例如容器名或者bean名字,Innitialzing則可以進(jìn)行初始化。

2,Autowired,PostConstructor功能失效

refresh執(zhí)行順序:

1,找到所有BeanFactory后處理器,

2 添加Bean后處理器

3 初始化所有單例

3.1 依賴注入擴(kuò)展

3.2 初始化擴(kuò)展

失效原因總結(jié):在執(zhí)行第一步時(shí),這個(gè)配置類中有BeanFactory后處理器工廠方法,需要優(yōu)先創(chuàng)建這個(gè)配置類,再執(zhí)行工廠方法,添加這個(gè)后處理器,但此時(shí)還沒有創(chuàng)建Bean后處理器,無法解析這個(gè)類的Autowired,Value注解。這個(gè)配置類已經(jīng)在添加Bean后處理器前被初始化,后續(xù)也不會(huì)再初始化。

Spring bean的初始化和銷毀順序

擴(kuò)展功能即PostContruct的初始化

接口方式的初始化

@Bean注解指定的初始化

銷毀順序也是一樣的

Scope

1,Request域:請(qǐng)求來了創(chuàng)建bean,請(qǐng)求結(jié)束銷毀bean

Session域:當(dāng)過了一段時(shí)間,瀏覽器沒有發(fā)來請(qǐng)求,session的bean對(duì)象銷毀。

application域:

2,@prototype失效

解決方案:

① 使用@Lazy注解,生成代理對(duì)象每次調(diào)用對(duì)象的任意方法,都會(huì)創(chuàng)建新的對(duì)象

② 注入ObjectFactory對(duì)象

③通過容器來獲取對(duì)象


aop實(shí)現(xiàn)原理:

aop之proxy增強(qiáng),通過方法重寫的方式,

在運(yùn)行期間直接生成代理類的字節(jié)碼,

  • aop之jdk增強(qiáng):生成的代理類和目標(biāo)類屬于同級(jí)別關(guān)系,實(shí)現(xiàn)了同一個(gè)接口,不能強(qiáng)制轉(zhuǎn)換
  • aop之cglib增強(qiáng):生成的代理類和目標(biāo)類是父子關(guān)系,就要求不能有final


aop之a(chǎn)jc增強(qiáng),class被改寫,和Spring沒什么關(guān)系,通過aspect編譯器,在編譯階段改寫類

aop之a(chǎn)gent增強(qiáng) 在類加載階段改寫類


jdk代理內(nèi)部實(shí)現(xiàn)原理:

①設(shè)計(jì)一個(gè)接口Invokationhandler回調(diào)抽象操作

②將接口的方法對(duì)象作為參數(shù)傳給invoke,知道目標(biāo)對(duì)象要調(diào)用哪個(gè)方法

③ invoke內(nèi)部根據(jù)這個(gè)方法參數(shù)再來反射調(diào)用

jdk代理源碼:

直接生成字節(jié)碼,利用asm技術(shù)

jdk反射優(yōu)化:生成一個(gè)方法的代理類來優(yōu)化反射直接調(diào)用

cglib代理

通過methodInterceptor接口來進(jìn)行回調(diào),不同點(diǎn),生成方法代理。

方法代理methodProxy.invoke(target,args):

結(jié)合目標(biāo)類使用,內(nèi)部沒有反射。

methodProxy,invokeSuper(proxy,args)

結(jié)合代理使用,內(nèi)部無反射。

內(nèi)部會(huì)生成一個(gè)FastClass

記錄目標(biāo)類的方法或者代理類原始方法編號(hào)

根據(jù)index知道它調(diào)用的是哪個(gè)方法,用目標(biāo)類直接正常調(diào)用,避免反射調(diào)用。

與jdk對(duì)比,jdk代理一開始沒用反射優(yōu)化

②一個(gè)代理類會(huì)用兩個(gè)FastClass來消除反射,一個(gè)是配合目標(biāo)類,一個(gè)是配合代理類

Spring選擇代理

設(shè)置切點(diǎn)

設(shè)置通知

1,創(chuàng)建代理對(duì)象的選擇:

  • proxyTargetClass=False,目標(biāo)實(shí)現(xiàn)了接口,代理用jdk實(shí)現(xiàn)
  • proxyTargetClass=False,目標(biāo)沒有實(shí)現(xiàn)接口,代理用cglib實(shí)現(xiàn)
  • proxyTargetClass=True,總是使用cglib實(shí)現(xiàn)

切點(diǎn)實(shí)現(xiàn)

①,aspectj的匹配方法,切點(diǎn)表達(dá)式只能匹配方法,如果注解加在類上,則沒有辦法找到。

②MethodMatcher接口,用來執(zhí)行方法匹配。

Aspect切面(高級(jí)切面)和Advisor切面

AnnotationAwareAspectJAutoProxyCreator:后處理器

依賴注入之前會(huì)調(diào)用它的功能,初始化之后。

1,findEnableAdvisors方法作用:根據(jù)目標(biāo)類型去找到這個(gè)目標(biāo)類型相匹配的所有切面,返回切面集合

2,WrapIfnecessary()用于判斷是否有必要為這個(gè)類創(chuàng)建代理,并且返回這個(gè)代理

3,代理創(chuàng)建時(shí)機(jī)

  • 初始化之后(沒有循環(huán)依賴)例如Bean1不依賴Bean2,但是Bean2依賴Bean1,Bean1代理創(chuàng)建時(shí)機(jī)就是在初始化之后
  • 依賴注入之前(存在循環(huán)依賴),Bean1,Bean2相互依賴
  • 依賴注入和初始化不應(yīng)該增強(qiáng),作用于原始對(duì)象,而非代理對(duì)象

4, 切面順序控制@Order

order注解加在切面類上,不能加在方法上

5,高級(jí)切面轉(zhuǎn)換為低級(jí)切面(創(chuàng)建代理時(shí))

  • 對(duì)切面類所有方法進(jìn)行解析
  • 遍歷方法,檢查所有方法對(duì)應(yīng)的注解
  • 從注解中拿到切點(diǎn)表達(dá)式,利用切點(diǎn)表達(dá)式創(chuàng)建切點(diǎn)對(duì)象
  • 根據(jù)注解類型的不同選擇不同的通知實(shí)現(xiàn)
  • 根據(jù)切點(diǎn)和通知?jiǎng)?chuàng)建低級(jí)的切面advisor

統(tǒng)一轉(zhuǎn)換成環(huán)繞通知(代理類執(zhí)行方法時(shí))

1適配器設(shè)計(jì)模式:把一套接口轉(zhuǎn)換成另一套接口。

創(chuàng)建Methodinvocation

最外層創(chuàng)建一個(gè)環(huán)繞通知

2,調(diào)用鏈Methodinvocation實(shí)現(xiàn),在通知類里面調(diào)用invocation的proceed方法,責(zé)任鏈模式

動(dòng)態(tài)通知調(diào)用

帶了參數(shù)綁定

DispatcherServlet

1,AnnotationConfigServletWebServiceApplication 支持內(nèi)置Tomcat容器

2,DispatcherServlet創(chuàng)建是由Spring框架創(chuàng)建,初始化是由Tomcat服務(wù)器初始化,默認(rèn)是在第一次請(qǐng)求時(shí)初始化。

3,通過將一些值寫入配置文件解決硬編碼問題。

DispatcherServlet初始化做了什么事

  • 初始化了一堆組件,如果沒有提供組件那么有默認(rèn)的實(shí)現(xiàn)。

DispatcherServlet組件

1,RequestMappingHandlerMapping:先到當(dāng)前容器找到所有控制器類,記錄下所有的方法

初始化時(shí)記錄路徑和方法的映射關(guān)系

2,RequestMappingHandlerAdapter

  • 調(diào)用控制器方法,需要參數(shù)解析器。
  • 各種不同的注解,像RequestBody等,需要不同類型的參數(shù)解析器
  • 返回值類型解析器

3,自定義參數(shù)解析器

4,自定義返回值解析器

參數(shù)解析器

獲取方法參數(shù)的信息,例如注解,還有參數(shù)名,參數(shù)類型

  • a. 每個(gè)參數(shù)處理器能干啥

1) 看是否支持某種參數(shù)

2) 獲取參數(shù)的值

  • b. 組合模式在 Spring 中的體現(xiàn)
  • c. @RequestParam, @CookieValue 等注解中的參數(shù)名、默認(rèn)值, 都可以寫成活的, 即從 ${ } #{ }中獲取

組合模式:逐一調(diào)用每個(gè)參數(shù)解析器,直到找到合適的解析器

對(duì)象綁定和類型轉(zhuǎn)換

兩套偏底層的類型轉(zhuǎn)換接口

Spring實(shí)現(xiàn)

jdk自帶 Formatter

1,高層接口實(shí)現(xiàn):

TypeConverter:類型轉(zhuǎn)換

SimpleTypeConverter(轉(zhuǎn)換目標(biāo),轉(zhuǎn)換目標(biāo)類型)

BeanWrapperImpl給類屬性賦值,并且可以進(jìn)行類型轉(zhuǎn)換

DirectFieldAcessor,跟上一個(gè)一樣,但是直接走的成員變量。

DataBinder:類屬性綁定,支持兩種綁定方式,默認(rèn)情況走get,Set方法

2,網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)綁定

ServletRequestDataBinder:網(wǎng)絡(luò)情況下的數(shù)據(jù)綁定。

ServletRequestParameterPropertyValues封裝請(qǐng)求數(shù)據(jù)。

3,綁定器工廠,擴(kuò)展功能

字符串“1996|11|01”轉(zhuǎn)換成日期需要轉(zhuǎn)換器

流程:

①通過initBinder注解

  • 收集InitBinde方法信息,包括方法對(duì)象,方法本身
  • 綁定工廠,創(chuàng)建binder的時(shí)候會(huì)回調(diào)這個(gè)方法,補(bǔ)充:底層調(diào)用的是PropertyEditor接口

用ConversationService轉(zhuǎn)換

當(dāng)兩種都有的情況下,會(huì)優(yōu)先采用initBinder的方式,后面采用ConversationService方式,最后采用默認(rèn)的方式

@ControllerAdvice增強(qiáng)功能

@ExcetionHandler:處理異常

@ModelAttribute:補(bǔ)充模型數(shù)據(jù)

Initbinder初始化時(shí)機(jī):

@InitBinder 的來源有兩個(gè)

1. @ControllerAdvice 中 @InitBinder 標(biāo)注的方法,由 RequestMappingHandlerAdapter 在初始化時(shí)解析并記錄

2. @Controller 中 @InitBinder 標(biāo)注的方法,由 RequestMappingHandlerAdapter 會(huì)在控制器方法首次執(zhí)行時(shí)解析并記錄

a. Method 對(duì)象的獲取利用了緩存來進(jìn)行加速

b. 綁定器工廠的擴(kuò)展點(diǎn)(advice 之一), 通過 @InitBinder 擴(kuò)展類型轉(zhuǎn)換器

控制器方法執(zhí)行流程

HandlerAdapter最重要的功能:執(zhí)行控制器方法

HandlerMethod需要

Bean是哪個(gè)Controller


HandlerMethod需要

. bean即是哪個(gè)Controller

. method即是Controller 中的哪個(gè)方法ServletlnvocableHandlerMethod需要

. WebDataBinderFactory負(fù)責(zé)對(duì)象綁定、類型轉(zhuǎn)換

. ParameterNameDiscoverer負(fù)責(zé)參數(shù)名解析,模型數(shù)據(jù)加入ModelAndViewContainer,如果指定未名稱,那么將對(duì)象首字母小寫作為名稱放入容器

·HandlerMethodArgumentResolverComposite負(fù)責(zé)解析參數(shù)· HandlerMethodReturnValueHandlerComposite負(fù)責(zé)處理返回值

@ModelAttribute

加在方法上,默認(rèn)名字是返回類型的第一個(gè)字母小寫,值是返回值,那么需要RequestMappingHandlerAdapter,ModelFactory對(duì)@ModelAttribute進(jìn)行額外解析

返回值處理器

解析返回值,加入ModelAndViewContainer

MessageConverter

將對(duì)象轉(zhuǎn)換為json,或者將json轉(zhuǎn)換為對(duì)象

多個(gè)MessageConverter

先看響應(yīng)要求

再看request要求

如果沒有特殊要求,則根據(jù)列表順序

ControllerAdvice之ResponsebodyAdvice

返回點(diǎn)擴(kuò)展

Tomcat異常處理

@ExceptionHandler注解,處理控制器方法出現(xiàn)的異常,加一些返回值處理器。

學(xué)到了什么

a. ExceptionHandlerExceptionResolver 能夠重用參數(shù)解析器、返回值處理器,實(shí)現(xiàn)組件重用

b. 能夠支持嵌套異常

BsiicErrorController

MVC處理流程


Boot啟動(dòng)流程

SpringApplication構(gòu)造方法做了哪些事:

  • 獲取Bean Definition源

xml文

配置文件

  • 演示推斷應(yīng)用類型

非Web應(yīng)用程序

Web的reactive程序

Web的Servlet程序

  • 演示ApplicationContext初始化器

做擴(kuò)展,補(bǔ)充BeanDefiniton

  • 演示監(jiān)聽器與事件
  • 演示主類推斷

main方法運(yùn)行所在類

run方法執(zhí)行流程

1,發(fā)布事件

run 方法內(nèi)獲取事件發(fā)布器 (得到 SpringApplicationRunListeners) 的過程, 對(duì)應(yīng)步驟中

1.獲取事件發(fā)布器

發(fā)布 application starting 事件1??

發(fā)布 application environment 已準(zhǔn)備事件2??

發(fā)布 application context 已初始化事件3??

發(fā)布 application prepared 事件4??

發(fā)布 application started 事件5??

發(fā)布 application ready 事件6??

這其中有異常,發(fā)布 application failed 事件7??

*/

兩種runner,都是在Springboot啟動(dòng)的最后流程進(jìn)行回調(diào)。

commandlineRunner:來自main方法的參數(shù),

ApplicationRunner:經(jīng)過封裝的參數(shù)。

3

準(zhǔn)備好環(huán)境對(duì)象,配置環(huán)境來源,把命令行的來源加入

4

往EnvironmentPropertiesSoure中加入ConfigurationPropertiesSource,統(tǒng)一下劃線,駝峰命名等風(fēng)格。

5,

增加EnvironmentPostProcessor接口,增加來源環(huán)境

6,

數(shù)據(jù)綁定,將配置文件的值綁定到特定的類中


8,創(chuàng)建Spring容器

9,調(diào)用一些初始化器對(duì)Spring容器進(jìn)行功能增強(qiáng),發(fā)布事件。

10,得到所有beandefiniton源

發(fā)布事件

11,調(diào)用applicationContext的bean后處理器,bean工廠后處理器,初始化每個(gè)單例。

12,調(diào)用runner,調(diào)用所有實(shí)現(xiàn)了ApplicationRunner接口或CommandlineRunner接口的bean

發(fā)布running事件

Tomcat內(nèi)嵌容器

1,創(chuàng)建Tomcat對(duì)象

2,創(chuàng)建項(xiàng)目文件夾

3,創(chuàng)建Tomcat項(xiàng)目,在Tomcat中稱為Context

4,編程添加Servlet

5,啟動(dòng)Tomcat

6,創(chuàng)建連接器,設(shè)置監(jiān)聽接口

自動(dòng)配置類

1, @Import:導(dǎo)入第三方配置類

本項(xiàng)目配置類優(yōu)先

@ConditionalOnmissingbean

2,AopAutoConfiguration

通過注解的方式進(jìn)行嵌套判斷

黑馬程序員Spring視頻教程,深度講解spring5底層原理的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
临汾市| 瑞昌市| 双江| 通榆县| 宕昌县| 汝南县| 滦南县| 项城市| 花莲市| 涡阳县| 肥乡县| 镇原县| 桦南县| 寿光市| 多伦县| 邹城市| 平陆县| 福鼎市| 新建县| 阳新县| 南汇区| 长春市| 吉林省| 桑日县| 麻城市| 通州市| 云霄县| 乃东县| 泾川县| 错那县| 惠州市| 巴东县| 余干县| 克山县| 石柱| 富宁县| 民权县| 周口市| 横山县| 连州市| 南京市|