Spring
- IOC實作原理
- 1.IOC概述:
- 2.IOC的創建物件的方法
- AOP實作原理
- 1.AOP的概述:
- 2.AOP的原理:
- 3.AOP的實作:
- 方式一:
- 方式二:
- 方式三:
今天聊一聊我自己對Spring的學習總結分析,Spring說白了就兩個點:IOC 和 AOP
這兩個點也是面試官最愛問的兩個點,那么今天我就主要講一下我對這兩個點的理解
IOC實作原理
再說IOC之前,我先給大家看幅圖:

在沒了解IOC之前,我們的程式都是這樣的,用戶需要去查看資料,找到業務層,業務層對應去幫用戶找到用戶想要查看的資料,而我們程式員則是控制著業務層,
那么作為一個程式員,當用戶需求和我們的功能越來越多的時候,用戶每次去查詢不同的功能,我們對應就要修改代碼,如果代碼量過于龐大,修改一次的成本代價是很昂貴的!

而我們把主動權交給了用戶以后,用戶自己需要什么功能,由用戶自己去呼叫
這樣系統的耦合性大大降低,程式員可以更加專注的在業務的實作上!這就是IOC的原型!
1.IOC概述:
控制反轉loC(Inversion ofControl),是一種設計思想,DI(依賴注入)是實作IoC的一種方法,也有人認為DI只是loC的另一種說法,沒有loC的程式中,我們使用面向物件編程,物件的創建與物件間的依賴關系完全硬編碼在程式中,物件的創建由程式自己控制,控制反轉后將物件的創建轉移給第三方,個人認為所謂控制反轉就是:獲得依賴物件的方式反轉了,
采用XML方式配置Bean的時候,Bean的定義資訊是和實作分離的,而采用注解的方式可以把兩者合為一體,Bean的定義資訊直接以注解的形式定義在實作類中,從而達到了零配置的目的,
2.IOC的創建物件的方法
1.使用無參構造創建物件,默認!
2.假設我們要使用有參構造創建物件
- 1.下標注入:
<bean id="user" class="com.zjd.pojo.User">
<constructor-arg index="0" value="喬治"/>
</bean>
- 2.型別賦值:
<!-- 第二種:有參構造,型別賦值-->
<bean id="user" class="com.zjd.pojo.User">
<constructor-arg type="java.lang.String" value="哈登"/>
</bean>
- 3.直接通過引數名賦值
<bean id="user" class="com.zjd.pojo.User">
<constructor-arg name="name" value="歐文"/>
</bean>
總結:
在組態檔加載的時候,容器中的管理物件就已經初始化了!
AOP實作原理
1.AOP的概述:

大家看這幅圖,如果我們一個已經完整的專案,突然想去加一些新功能,比如實作日志,那我們需要去重新破壞掉原有的結構嘛?如果是那樣,我們的損失會很大!
但是如果我們采用面切切面,在需要加的地方,橫切進去,這樣不就最大化的解決了問題,這也就是我們要說的AOP面向切面編程
2.AOP的原理:
AOP的實作原理也就是我們熟知的動態代理
在說動態代理之前,我先說一下代理模式,為什么要有代理模式?

就要我們最常見的例子來說,比如用戶要租房,但是作業很忙沒時間去看房子,這時就找到了我們的房屋中介,房屋中介和房東有一種關系,房屋中介和房東都可以向外出租房子,這也就是我們的說的代理模式,這種也是我們最初的靜態代理
靜態代理有什么問題呢?
靜態代理幫我們把功能直接寫死在代碼中,一個真實角色就會產生一個代理角色;代碼量翻倍,開發效率變低
如果用戶向實作多種功能,就要多個代理,代碼量會冗余

那接下來就引出我們的動態代理模式:

如果我們變成這樣,用戶需要實作什么功能,而我們的代理則動態的生成
- 可以使真實角色的操作更加純粹!
- 公共業務就交給了代理角色!實作了業務的分工
- 公共業務發生擴展的時候,方便集中管理!
- 一個動態代理類代理的是一個介面,一般就是對應的一類業務
- 一個動態代理類可以代理多個類
3.AOP的實作:
方式一:
使用Spring的API介面 【 主要是Spring介面】
方式一:原生Spring API介面
配置aop 匯入約束
<aop:config>
<!-- 切入點 expression=execution(要執行的位置)-->
<aop:pointcut id="pointcut" expression="execution(* com.zjd.service.UserServiceImpl.*(..))"/>
<!--執行環繞增加-->
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>
方式二:
使用自定義類來實作【主要是切面】
方式二:自定義類實作
<bean id="diy" class="com.wdit.diy.diyPointCut"/>
<aop:config>
<!--自定義切面,ref 要參考的類-->
<aop:aspect ref="diy">
<!--切入點-->
<aop:pointcut id="pointcut" expression="execution(* com.zjd.service.UserServiceImpl.*(..))"/>
<!--通知-->
<aop:before method="before" pointcut-ref="pointcut"/>
<aop:after method="after" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
方式三:
使用注解實作
<!--方式三:注解-->
<bean id="annopointcut" class="com.zjd.diy.AnnotationPointCut"/>
<!--注解支持-->
<aop:aspectj-autoproxy/>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/255333.html
標籤:其他
