什么是spring
Spring 是個開發(fā)java企業(yè)級應(yīng)用的開源框架,Spring 框架目標(biāo)是簡化Java企業(yè)級應(yīng)用開發(fā)
Spring的好處
- 輕量:Spring 是輕量的,基本的版本大約2MB
- IOC+DI:降低了組件之間的耦合性
- AOP
- MVC框架:springmvc提供了對web更好的支持
- 事務(wù)管理:Spring 提供一個持續(xù)的事務(wù)管理接口
靜態(tài)織入
什么是織入:允許我們向現(xiàn)有的類添加新的方法或?qū)傩?br>
原理:在編譯期,切面直接以字節(jié)碼形式編譯到目標(biāo)字節(jié)碼文件中
優(yōu)點:對系統(tǒng)性能無影響
缺點:不夠靈活
Spring IOC的一些知識點補充
IOC:控制反轉(zhuǎn);是指容器控制程序?qū)ο笾g的關(guān)系,而不是傳統(tǒng)實現(xiàn)中,由程序代碼直接操控??刂茩?quán)由應(yīng)用代碼中轉(zhuǎn)到了外部容器,控制權(quán)的轉(zhuǎn)移是所謂反轉(zhuǎn)。對于Spring而言,就是由Spring來控制對象之間的關(guān)系;控制反轉(zhuǎn)是為了降低類與類之間的耦合度
DI:依賴注入
簡單的來說就是IOC是目的,DI是實現(xiàn)IOC的手段
spring中依賴注入的三種實現(xiàn)方式
- 構(gòu)造器注入:將被依賴對象通過構(gòu)造函數(shù)參數(shù)注入給依賴對象,并且在初始化對象的時候注入。優(yōu)點:對象初始化完成后便可以獲得可使用的對象;缺點:1.當(dāng)需要注入的對象很多時,構(gòu)造器的參數(shù)列表將會很長,2.不夠靈活,若有多種注入方式,每種方式只需注入指定幾個依賴,那么需要提供多個重載的構(gòu)造函數(shù)。
- setter方法注入:通過調(diào)用成員變量提供的setter函數(shù)將被依賴對象注入給依賴類;優(yōu)點:靈活,可以選擇性的注入依賴的對象。缺點:依賴對象初始化完成后尚未注入被依賴對象,因此還不能使用。
- 接口注入:依賴類必須實現(xiàn)指定的接口,實現(xiàn)接口中的函數(shù),該函數(shù)用于依賴注入,該函數(shù)的參數(shù)就是要注入的對象。缺點:侵入性太強,不建議使用
什么是AOP
分布于應(yīng)用多處的功能稱為橫切關(guān)注點,他們與業(yè)務(wù)邏輯是相分離的,卻被多個業(yè)務(wù)代碼調(diào)用。AOP可以實現(xiàn)橫切關(guān)注點和它們所影響對象之間的解耦
spring事務(wù)
Spring支持兩種類型的事務(wù)管理:
- 編程式事務(wù)管理:通過編程的方式管理事務(wù),靈活性高,難以維護
- 聲明式事務(wù)管理:可以將業(yè)務(wù)代碼和事務(wù)管理分離,你只需用注解和XML配置來管理事務(wù)
Spring事務(wù)的優(yōu)點
為不同的事務(wù)API 如 JTA,JDBC,JPA 提供了一致的編程模型
cglib動態(tài)代理的實現(xiàn)過程
- 定義業(yè)務(wù)類
- 實現(xiàn)MethodInterceptor接口創(chuàng)建代理類
- 調(diào)用代理類的getInstance方法返回一個動態(tài)代理對象(它是業(yè)務(wù)類的子類),通過動態(tài)代理對象調(diào)用各種方法
Spring Bean的實例化過程
- 調(diào)用Bean的默認(rèn)構(gòu)造方法生成bean實例:bean1
- 檢查Bean配置文件中是否注入了Bean的屬性,如果有注入,則在bean1實例的基礎(chǔ)上對其屬性進行注入,把原來的bean1給覆蓋掉生成新的實例:bean2
- 檢查Bean是否實現(xiàn)了InitializingBean接口,如果實現(xiàn)了此接口,則調(diào)用afterPropertiesSet()方法把bean2覆蓋形成新的bean實例:bean3
- 檢查Bean配置文件中是否指定了init-method屬性,如果已指定,則調(diào)用此屬性對應(yīng)方法并對把bean3覆蓋形成新的實例:bean4。
Spring Bean的生命周期
- Spring對Bean進行實例化(相當(dāng)于程序中的new Class())
- Spring將值和Bean的引用注入進Bean對應(yīng)的屬性中
- 如果Bean實現(xiàn)了BeanNameAware接口,Spring將調(diào)用setBeanName()方法并將Bean的ID作為參數(shù)傳入
- 如果Bean實現(xiàn)了BeanFactoryAware接口,Spring將調(diào)用setBeanFactory()方法并把BeanFactory容器實例作為參數(shù)傳入
- 如果Bean實現(xiàn)了ApplicationContextAware接口,Spring容器將調(diào)用setApplicationContext()方法,把應(yīng)用上下文作為參數(shù)傳入
- .如果Bean實現(xiàn)了BeanPostProcess接口,Spring將調(diào)用它們的postProcessBeforeInitialization(預(yù)初始化)方法,對Bean進行修改,增加某個功能
- 如果Bean實現(xiàn)了InitializingBean接口,Spring將調(diào)用它們的afterPropertiesSet方法,是在Bean的全部屬性設(shè)置成功后執(zhí)行的初始化方法
- 如果Bean實現(xiàn)了BeanPostProcess接口,Spring將調(diào)用它們的postProcessAfterInitialization(后初始化)方法
- 如果Bean實現(xiàn)了DispostbleBean接口,Spring將調(diào)用它的destory方法,是在Bean實例銷毀前執(zhí)行的方法