學(xué)習(xí)Spring框架:
??? 1.理解“控制反轉(zhuǎn)“
??????? 控制反轉(zhuǎn)反砌,也稱為依賴注入蛔六,是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)理念费奸,用來降低程序代碼之間的耦合度包雀。
?????? 程序的耦合:
??????????? 調(diào)用者與被調(diào)用者的依賴關(guān)系
?????? 比如:程序員A負(fù)責(zé)編寫A類憋他,程序員B負(fù)責(zé)B類開發(fā)孩饼,A類的某些功能需要實(shí)例化B類的對(duì)象調(diào)用其方法才能完成,那么A類就依賴B類竹挡,如果程序員B不寫B(tài)類 難道程序員A要一直等下去嗎镀娶?
??????????? 企業(yè)開發(fā)的原則:
??????????? "編譯時(shí)不依賴,運(yùn)行時(shí)才依賴"
public class PersonServiceBean{
? ? ? private PersonDao personDao=new PersonDaoBean();
? ? ? public void save(Person person){
? ? ? ? ? ? personDao.save(person);
? ? ? }
}
PersonDaoBean 是在應(yīng)用內(nèi)部創(chuàng)建及維護(hù)的揪罕,所謂控制反轉(zhuǎn)就是應(yīng)用本身不負(fù)責(zé)依賴對(duì)象的創(chuàng)建及維護(hù)梯码,依賴對(duì)象的創(chuàng)建及維護(hù)是由外部容器負(fù)責(zé)的。這樣控制權(quán)就由應(yīng)用轉(zhuǎn)移到了外部容器好啰,控制權(quán)的轉(zhuǎn)移就是所謂的反轉(zhuǎn)轩娶。
2.依賴注入
??? 當(dāng)我們把依賴對(duì)象交給外部容器負(fù)責(zé)創(chuàng)建,那么PersonServiceBean類可以改成
public class PersonServiceBean{
? ? ? private PersonDao personDao;
? ? //通過構(gòu)造參數(shù)框往,讓容器把創(chuàng)建好的依賴對(duì)象注入進(jìn)PersonServiceBean,當(dāng)然也可以使用setter方法進(jìn)行注入
? ? ? public PersonServiceBean(PersonDao personDao ){
? ? ? ? this.personDao=personDao ;
? ? ? }
? ? ? public void save(Person person){
? ? ? ? ? ? personDao.save(person);
? ? ? }
}
所謂依賴注入就是指:在運(yùn)行期鳄抒,由外部容器動(dòng)態(tài)地將依賴對(duì)象注入到組件中。
Spring AOP
??? 理解“面向切面編程”
??? 那么什么是面向切面編程呢椰弊?
比如在兩個(gè)類中许溅,可能都需要在每個(gè)方法中記錄日志。按照面向?qū)ο蟮脑O(shè)計(jì)方法秉版,我們就必須在兩個(gè)類的方法中都加入日志的內(nèi)容贤重。也許他們是完全相同的,但就是因?yàn)槊嫦驅(qū)ο蟮脑O(shè)計(jì)讓類與類之間無法聯(lián)系沐飘,而不能將這些重復(fù)的代碼統(tǒng)一起來游桩。
? ?也許有人會(huì)說,那好辦啊耐朴,我們可以將這段代碼寫在一個(gè)獨(dú)立的類獨(dú)立的方法里借卧,然后再在這兩個(gè)類中調(diào)用。但是筛峭,這樣一來铐刘,這兩個(gè)類跟我們上面提到的獨(dú)立的類就有耦合了,它的改變會(huì)影響這兩個(gè)類影晓。那么镰吵,有沒有什么辦法檩禾,能讓我們?cè)谛枰臅r(shí)候,隨意地加入代碼呢疤祭?這種在運(yùn)行時(shí)盼产,動(dòng)態(tài)地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程勺馆。
??? 簡(jiǎn)單的說就是在不改變?cè)绦虻幕A(chǔ)上為代碼增加新的功能戏售,對(duì)代碼進(jìn)行增強(qiáng)處理。
常用增強(qiáng)處理類型
Before 前置增強(qiáng)處理草穆,在目標(biāo)方法前織入增強(qiáng)處理
AfterReturning 后置增強(qiáng)處理灌灾,在目標(biāo)方法正常執(zhí)行(不出現(xiàn)異常)后織入處理
AfterThrowing 異常增強(qiáng)處理,在目標(biāo)方法拋出異常后織入增強(qiáng)處理
After 最終增強(qiáng)處理悲柱,無論方法是否拋出異常锋喜,都會(huì)在目標(biāo)方法最后織入增強(qiáng)處理
Around 環(huán)繞增強(qiáng)處理,在目標(biāo)方法的前后都可以織入增強(qiáng)處理
Spring AOP配置元素
<aop:config> AOP配置的頂層元素豌鸡,大多數(shù)的<aop:*>元素必須包含在<aop:config>元素內(nèi)
? <aop:pointcut> 定義切點(diǎn)
? <aop:aspect> 定義切面
??? <aop:after> 定義最終增強(qiáng)(不管被通知的方法是否執(zhí)行成功)
??? <aop:after-returning>定義after-returning增強(qiáng)
??? <aop:after-throwing>定義after-throwing增強(qiáng)
??? <aop:around> 定義環(huán)繞增強(qiáng)
??? <aop:before> 定義前置增強(qiáng)
<aop:aspectj-autoproxy> 啟動(dòng)@AspectJ注解驅(qū)動(dòng)的切面
使用注解的方式實(shí)現(xiàn)IOC
1嘿般、@Controller 控制器(注入服務(wù))
2、@Service 服務(wù)(業(yè)務(wù)層)
3直颅、@Repository dao(實(shí)現(xiàn)dao訪問)
4博个、@Component (把普通pojo實(shí)例化到spring容器中,相當(dāng)于配置文件中的<bean id="" class=""/>)
? @Component,@Service,@Controller,@Repository注解的類功偿,并把這些類納入進(jìn)spring容器中管理盆佣。?
在配置文件中添加引入component的掃描組件?
<context:component-scan base-package=”com.mmnc”>
?注意:使用注解方式注入的bean 默認(rèn)id為類的首字母小寫。
使用注解的方式實(shí)現(xiàn)AOP
1械荷、@Aspect 定義切面
2共耍、@Before 前置增強(qiáng) @AfterReturning 后置增強(qiáng) @AfterThrowing 異常拋出增強(qiáng) @After 最終增強(qiáng) @Around 環(huán)繞增強(qiáng)
3、@Pointcut 切點(diǎn)表達(dá)式
在配置文件首先要導(dǎo)入aop命名空間 然后添加
?? <aop:aspectj-autoproxy/>元素就可以啟用注解吨瞎。
原文鏈接:https://blog.csdn.net/qq_38006047/article/details/80797386