1.IOC/DI:對象控制權(quán)的轉(zhuǎn)移物遇,從程序代碼本身轉(zhuǎn)移到了外部容器。
通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例,在Spring里,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成勉耀,這叫做控制反轉(zhuǎn),依賴注入(Dependency injection)創(chuàng)建被調(diào)用者的工作由 Spring容器完成,然后注入調(diào)用者,因此也稱依賴注入翔脱。控制反轉(zhuǎn)和依賴注入是同一個概念媒鼓。
常用依賴注入:
@Autowire默認(rèn)按照類型裝配届吁,默認(rèn)情況下它要求依賴對象必須存在如果允許為null,可以設(shè)置它required屬性為false绿鸣,如果我們想使用按照名稱裝配疚沐,可以結(jié)合@Qualifier注解一起使用;?
@Resource默認(rèn)按照名稱裝配,當(dāng)找不到與名稱匹配的bean才會按照類型裝配潮模,可以通過name屬性指定亮蛔,如果沒有指定name屬性,當(dāng)注解標(biāo)注在字段上擎厢,即默認(rèn)取字段的名稱作為bean名稱尋找依賴對象究流,當(dāng)注解標(biāo)注在屬性的setter方法上,即默認(rèn)取屬性名作為bean名稱尋找依賴對象.?
注意:如果沒有指定name屬性动遭,并且按照默認(rèn)的名稱仍然找不到依賴的對象時候芬探,會回退到按照類型裝配,但一旦指定了name屬性厘惦,就只能按照名稱裝配了----建議使用@Resource偷仿。?
2.AOP是OOP的延續(xù),是Aspect Oriented Programming的縮寫,意思是面向方面編程酝静。將通用需求功能從不相關(guān)類之中分離出來节榜;同時,能夠使得很多類共享一個行為别智,一旦行為發(fā)生變化全跨,不必修改很多類,只要修改這個行為就可以亿遂。AOP就是這種實現(xiàn)分散關(guān)注的編程方法浓若,它將“關(guān)注”封裝在“方面”中
aop:將軟件系統(tǒng)分為核心關(guān)注點和橫切關(guān)注點,核心關(guān)注點主要處理的是業(yè)務(wù)邏輯蛇数,橫切關(guān)注點是一般與業(yè)務(wù)邏輯無關(guān)挪钓,但他們經(jīng)常發(fā)生在核心關(guān)注點的周圍并且都是相似的,如日志處理耳舅,事物碌上,安全,異常處理等浦徊,再說下具體的權(quán)限控制
aop代理由ioc容器負(fù)責(zé)生成管理馏予,依賴關(guān)系也是,主要就是定義切入點盔性,定義增強處理霞丧,
例如:自定義注解實現(xiàn)權(quán)限控制
1)自定義一個注解PrivilegeInfo,使用這個注解為service層中的方法進(jìn)行權(quán)限配?
2) 編寫一個注解解析器AnnotationParse冕香。解析注解@PrivilegeInfo(name=” *”)(注解解析器應(yīng)該把@PrivilegeInfo中的name屬性值解析出來)
3)在AOP中根據(jù)PrivilegeInfo注解的值蛹尝,判斷用戶是否擁有訪問目標(biāo)方法的權(quán)限,有則訪問目標(biāo)悉尾,沒有則給 出提示
關(guān)鍵技術(shù):自定義注解+注解解析+封裝需要的權(quán)限信息如滿足的條件+Spring AOP(編寫切面突那,配置哪些類需要代理)
主要步驟:編寫一個切面,在配置切入點
如下圖:
OOP是關(guān)注將需求功能劃分為不同的并且相對獨立构眯,封裝良好的類愕难,并讓它們有著屬于自己的行為,依靠繼承和多態(tài)等來定義彼此的關(guān)系惫霸;AOP是希望能夠?qū)⑼ㄓ眯枨蠊δ軓牟幌嚓P(guān)的類當(dāng)中分離出來猫缭,能夠使得很多類共享一個行為,一旦發(fā)生變化它褪,不必修改很多類饵骨,而只需要修改這個行為即可翘悉。AOP是使用切面(aspect)將橫切關(guān)注點模塊化茫打,OOP是使用類將狀態(tài)和行為模塊化。在OOP的世界中,程序都是通過類和接口組織的老赤,使用它們實現(xiàn)程序的核心業(yè)務(wù)邏輯是十分合適轮洋。但是對于實現(xiàn)橫切關(guān)注點(跨越應(yīng)用程序多個模塊的功能需求)則十分吃力,比如日志記錄抬旺,驗證弊予。
spring的聲明式事務(wù)管理也是aop的一種體現(xiàn),避免了頻繁的開啟和提交事務(wù)开财,回滾事務(wù)的操作
AOP相關(guān)圖: