Spring的AOP
為什么會(huì)出現(xiàn)AOP呢
- 這就不能不說OOP 面向?qū)ο缶幊?允許開發(fā)者定義縱向的關(guān)系 并且適用于定義橫向的關(guān)系 這樣導(dǎo)致了大量的代碼重用 而且不利于大量代碼的重用 但是代碼最好不要出現(xiàn)大量的代碼的重用
- AOP 面向切面編程 將那些跟業(yè)務(wù)關(guān)系無關(guān)的 但確實(shí)對(duì)多個(gè)對(duì)象產(chǎn)生影響的公共行為和邏輯衷笋,抽取出來并且封裝成可以重用的模塊 常見的模塊有 權(quán)限認(rèn)證 日志管理 事物管理等 我們將這個(gè)模塊命名為切面(作用是減少系統(tǒng)中重用的代碼 降低了模塊之間的耦合度)
- 常見的實(shí)現(xiàn)方式 代理模式 AOP的代理模式分為靜態(tài)代理和動(dòng)態(tài)代理 靜態(tài)代理的代表有AspectJ 動(dòng)態(tài)代理有jdk和cglib 這兩種
- 靜態(tài)代理的實(shí)現(xiàn) AspectJ是靜態(tài)代理的增強(qiáng)敦锌,所謂靜態(tài)代理兼犯,就是AOP框架會(huì)在編譯階段生成AOP代理類,因此也稱為編譯時(shí)增強(qiáng)冀泻,他會(huì)在編譯階段將AspectJ(切面)織入到Java字節(jié)碼中醉者,運(yùn)行的時(shí)候就是增強(qiáng)之后的AOP對(duì)象峻黍。
- 動(dòng)態(tài)代理的實(shí)現(xiàn) Spring AOP使用的動(dòng)態(tài)代理躁劣,所謂的動(dòng)態(tài)代理就是說AOP框架不會(huì)去修改字節(jié)碼,而是每次運(yùn)行時(shí)在內(nèi)存中臨時(shí)為方法生成一個(gè)AOP對(duì)象邮屁,這個(gè)AOP對(duì)象包含了目標(biāo)對(duì)象的全部方法胸蛛,并且在特定的切點(diǎn)做了增強(qiáng)處理,并回調(diào)原對(duì)象的方法樱报。
Spring的ioc(控制反轉(zhuǎn) 依賴注入 DI)
為什么出現(xiàn)IOC 代碼的耦合度變得過高,不利于項(xiàng)目的開發(fā)
- IOC就是控制反轉(zhuǎn)葬项,是指創(chuàng)建對(duì)象的控制權(quán)的轉(zhuǎn)移,以前創(chuàng)建對(duì)象的主動(dòng)權(quán)和時(shí)機(jī)是由自己把控的迹蛤,而現(xiàn)在這種權(quán)力轉(zhuǎn)移到Spring容器中民珍,并由容器根據(jù)配置文件去創(chuàng)建實(shí)例和管理各個(gè)實(shí)例之間的依賴關(guān)系,對(duì)象與對(duì)象之間松散耦合盗飒,也利于功能的復(fù)用嚷量。DI依賴注入,和控制反轉(zhuǎn)是同一個(gè)概念的不同角度的描述逆趣,即 應(yīng)用程序在運(yùn)行時(shí)依賴IoC容器來動(dòng)態(tài)注入對(duì)象需要的外部資源蝶溶。
- 最直觀的表達(dá)就是,IOC讓對(duì)象的創(chuàng)建不用去new了,可以由spring自動(dòng)生產(chǎn)抖所,使用java的反射機(jī)制梨州,根據(jù)配置文件在運(yùn)行時(shí)動(dòng)態(tài)的去創(chuàng)建對(duì)象以及管理對(duì)象,并調(diào)用對(duì)象的方法的田轧。
- 實(shí)現(xiàn)方式 pring的IOC有三種注入方式 :構(gòu)造器注入暴匠、setter方法注入、根據(jù)注解注入傻粘。
- IoC讓相互協(xié)作的組件保持松散的耦合每窖,而AOP編程允許你把遍布于應(yīng)用各層的功能分離出來形成可重用的功能組件。