學習Spring框架:
??? 1.理解“控制反轉“
??????? 控制反轉,也稱為依賴注入,是面向對象編程中的一種設計理念,用來降低程序代碼之間的耦合度。
?????? 程序的耦合:
??????????? 調用者與被調用者的依賴關系
?????? 比如:程序員A負責編寫A類,程序員B負責B類開發,A類的某些功能需要實例化B類的對象調用其方法才能完成,那么A類就依賴B類,如果程序員B不寫B類 難道程序員A要一直等下去嗎?
??????????? 企業開發的原則:
??????????? "編譯時不依賴,運行時才依賴"
public class PersonServiceBean{
? ? ? private PersonDao personDao=new PersonDaoBean();
? ? ? public void save(Person person){
? ? ? ? ? ? personDao.save(person);
? ? ? }
}
PersonDaoBean 是在應用內部創建及維護的,所謂控制反轉就是應用本身不負責依賴對象的創建及維護,依賴對象的創建及維護是由外部容器負責的。這樣控制權就由應用轉移到了外部容器,控制權的轉移就是所謂的反轉。
2.依賴注入
??? 當我們把依賴對象交給外部容器負責創建,那么PersonServiceBean類可以改成
public class PersonServiceBean{
? ? ? private PersonDao personDao;
? ? //通過構造參數,讓容器把創建好的依賴對象注入進PersonServiceBean,當然也可以使用setter方法進行注入
? ? ? public PersonServiceBean(PersonDao personDao ){
? ? ? ? this.personDao=personDao ;
? ? ? }
? ? ? public void save(Person person){
? ? ? ? ? ? personDao.save(person);
? ? ? }
}
所謂依賴注入就是指:在運行期,由外部容器動態地將依賴對象注入到組件中。
Spring AOP
??? 理解“面向切面編程”
??? 那么什么是面向切面編程呢?
比如在兩個類中,可能都需要在每個方法中記錄日志。按照面向對象的設計方法,我們就必須在兩個類的方法中都加入日志的內容。也許他們是完全相同的,但就是因為面向對象的設計讓類與類之間無法聯系,而不能將這些重復的代碼統一起來。
? ?也許有人會說,那好辦啊,我們可以將這段代碼寫在一個獨立的類獨立的方法里,然后再在這兩個類中調用。但是,這樣一來,這兩個類跟我們上面提到的獨立的類就有耦合了,它的改變會影響這兩個類。那么,有沒有什么辦法,能讓我們在需要的時候,隨意地加入代碼呢?這種在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。
??? 簡單的說就是在不改變原程序的基礎上為代碼增加新的功能,對代碼進行增強處理。
常用增強處理類型
Before 前置增強處理,在目標方法前織入增強處理
AfterReturning 后置增強處理,在目標方法正常執行(不出現異常)后織入處理
AfterThrowing 異常增強處理,在目標方法拋出異常后織入增強處理
After 最終增強處理,無論方法是否拋出異常,都會在目標方法最后織入增強處理
Around 環繞增強處理,在目標方法的前后都可以織入增強處理
Spring AOP配置元素
<aop:config> AOP配置的頂層元素,大多數的<aop:*>元素必須包含在<aop:config>元素內
? <aop:pointcut> 定義切點
? <aop:aspect> 定義切面
??? <aop:after> 定義最終增強(不管被通知的方法是否執行成功)
??? <aop:after-returning>定義after-returning增強
??? <aop:after-throwing>定義after-throwing增強
??? <aop:around> 定義環繞增強
??? <aop:before> 定義前置增強
<aop:aspectj-autoproxy> 啟動@AspectJ注解驅動的切面
使用注解的方式實現IOC
1、@Controller 控制器(注入服務)
2、@Service 服務(業務層)
3、@Repository dao(實現dao訪問)
4、@Component (把普通pojo實例化到spring容器中,相當于配置文件中的<bean id="" class=""/>)
? @Component,@Service,@Controller,@Repository注解的類,并把這些類納入進spring容器中管理。?
在配置文件中添加引入component的掃描組件?
<context:component-scan base-package=”com.mmnc”>
?注意:使用注解方式注入的bean 默認id為類的首字母小寫。
使用注解的方式實現AOP
1、@Aspect 定義切面
2、@Before 前置增強 @AfterReturning 后置增強 @AfterThrowing 異常拋出增強 @After 最終增強 @Around 環繞增強
3、@Pointcut 切點表達式
在配置文件首先要導入aop命名空間 然后添加
?? <aop:aspectj-autoproxy/>元素就可以啟用注解。
原文鏈接:https://blog.csdn.net/qq_38006047/article/details/80797386