AOP
面向切面編程能夠?qū)⒛切┡c業(yè)務(wù)無(wú)關(guān)抢韭,卻被業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來(lái)替裆,便于減少系統(tǒng)重復(fù)的代碼囚玫,降低模塊間的耦合度(模塊間關(guān)聯(lián)程度的度量),并有利于未來(lái)的可擴(kuò)展性和可維護(hù)性辈挂。
動(dòng)態(tài)代理
SpringAOP是基于動(dòng)態(tài)代理實(shí)現(xiàn)的,如果要代理的對(duì)象實(shí)現(xiàn)了某個(gè)接口裹粤,那么Spring AOP就會(huì)使用JDK動(dòng)態(tài)代理去創(chuàng)建代理對(duì)象终蒂;而沒(méi)有實(shí)現(xiàn)接口的對(duì)象,就無(wú)法使用JDK Proxy去進(jìn)行動(dòng)態(tài)代理,而是使用Cglib來(lái)生成一個(gè)被代理對(duì)象的子類(lèi)來(lái)作為代理拇泣。
cglib代理也叫子類(lèi)代理悉尾,從內(nèi)存中構(gòu)建出一個(gè)子類(lèi)來(lái)擴(kuò)展對(duì)象目標(biāo)的功能。
AspectJ AOP
AspectJ AOP是一個(gè)AOP框架挫酿,Spring AOP屬于運(yùn)行時(shí)增強(qiáng)构眯,AspectJ是編譯時(shí)增強(qiáng),Spring AOP基于代理操作早龟,而AspectJ AOP基于字節(jié)碼操作惫霸。切面太多的話(huà),最好選擇AspectJ葱弟,它比Spring AOP快很多壹店。
IOC
IOC(控制反轉(zhuǎn))是一種設(shè)計(jì)思想,把對(duì)象的創(chuàng)建交給外部容器來(lái)完成芝加。解決了對(duì)象處理問(wèn)題硅卢,對(duì)象不用來(lái)程序中寫(xiě)死。通過(guò)DI(依賴(lài)注入)的方式來(lái)實(shí)現(xiàn)對(duì)象和對(duì)象的依賴(lài)關(guān)系藏杖。IOC容器是Spring用來(lái)實(shí)現(xiàn)IOC的載體将塑,IOC容器實(shí)際上就是一個(gè)Map(key,value),Map中存放的是各種對(duì)象蝌麸。無(wú)論是創(chuàng)建對(duì)象点寥,處理對(duì)象間的依賴(lài)關(guān)系,我們只需要在Spring為我們提供的IOC容器上配置信息就好了来吩。
ioc的思想最核?的地?在于敢辩,資源不由使?資源的雙?管理,?由不使?資源的第三?管理弟疆,這可以帶來(lái)很多好處戚长。 第?,資源集中管理怠苔,實(shí)現(xiàn)資源的可配置和易管理同廉。 第?,降低了使?資源雙?的依賴(lài)程度嘀略,也就是我們說(shuō)的耦合度恤溶。
來(lái)?知乎: https://www.zhihu.com/question/23277575/answer/24259844
- 依賴(lài)注入
不用創(chuàng)建對(duì)象,只需要描述它如何被創(chuàng)建帜羊。例如在代碼中不需要直接組裝我的組件和服務(wù)咒程,但要在配置文件中描述哪些組件需要哪些服務(wù),然后再用IOC容器裝起來(lái) - IOC的優(yōu)點(diǎn)
把代碼量降到最低讼育,使應(yīng)用容易測(cè)試帐姻,最小的代價(jià)和最小的侵入性使松散耦合得以實(shí)現(xiàn)稠集。
Bean
在 Spring 中,構(gòu)成應(yīng)用程序主干并由Spring IoC容器管理的對(duì)象稱(chēng)為bean饥瓷。bean是一個(gè)由Spring IoC容器實(shí)例化剥纷、組裝和管理的對(duì)象。
Bean的生命周期
- Spring啟動(dòng)呢铆,加載需要被Spring管理的bean晦鞋,進(jìn)行Bean的實(shí)例化
- 將bean的引用和值注入到bean的屬性中
- 如果實(shí)現(xiàn)了BeanNameAware接口,將Bean的id傳給setBeanName()方法
- 如果實(shí)現(xiàn)了BeanFactoryAware接口棺克,將調(diào)用setBeanFactory()方法悠垛,將BeanFactory容器實(shí)例傳入
- 如果實(shí)現(xiàn)了ApplicationContextAware接口,將調(diào)用setApplicationContext()方法娜谊,將bean所在應(yīng)用上下文引用傳入
- 如果實(shí)現(xiàn)了BeanPostProcessor接口确买,Spring就將調(diào)用他們的postProcessBeforeInitialization()方法
- 如果實(shí)現(xiàn)了InitializingBean接口,將調(diào)用afterPropertiesSet()方法纱皆。
- 如果實(shí)現(xiàn)了BeanPostProcessor接口湾趾,將調(diào)用postProcessAfterInitialization()方法
- bean就緒,駐留在應(yīng)用上下文中派草,直到應(yīng)用上下文被銷(xiāo)毀
- 當(dāng)要銷(xiāo)毀bean時(shí)搀缠,如果實(shí)現(xiàn)了DisposableBean接口,Spring將調(diào)用他的destory()接口方法
Bean作用域
- singleton:在IOC容器中僅存在一個(gè)Bean實(shí)例澳眷,Bean以單例方式存在胡嘿。
- prototype:每次從容器中調(diào)用Bean時(shí),都返回一個(gè)新的實(shí)例钳踊。
- request:每次HTTP請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的bean,該作用域僅適用于WebApplicationContext環(huán)境
- session:同一個(gè)HTTP Session共享一個(gè)Bean勿侯,不同Session使用不同Bean拓瞪,僅適用于WebApplicationContext環(huán)境
- globalSession:一般用于Portlet應(yīng)用環(huán)境,僅適用于WebApplicationContext環(huán)境