1. 程式人生 > >22-撩課-Java面試寶典-第二十二篇

22-撩課-Java面試寶典-第二十二篇

141.Spring AOP是什麼?

AOP:面向切面程式設計
AOP技術利用一種稱為“橫切”的技術,
解剖封裝的物件內部,
並將那些影響了多個類的公共行為
封裝到一個可重用模組,
這樣就能減少系統的重複程式碼,
降低模組間的耦合度,
並有利於未來的可操作性和可維護性。
AOP把軟體系統分為兩個部分:
核心關注點
和橫切關注點。
業務處理的主要流程是核心關注點,
與之關係不大的部分是橫切關注點。
橫切關注點的一個特點是,
他們經常發生在核心關注點的多處,
而各處都基本相似。
比如許可權認證、日誌、事務處理。

142.說說AOP實現原理

AOP:
這裡的AOP指的是面向切面程式設計思想,
而不是Spring AOP
主要的的實現技術主要有
Spring AOP和AspectJ。
1、AspectJ的底層技術。
 AspectJ的底層技術是靜態代理,
即用一種AspectJ支援的特定語言編寫切面,
通過一個命令來編譯,
生成一個新的代理類,
該代理類增強了業務類,
這是在編譯時增強,
相對於下面說的執行時增強,
編譯時增強的效能更好。

Spring AOP

Spring AOP採用的是動態代理,
在執行期間對業務方法進行增強,
所以不會生成新類,
對於動態代理技術,
Spring AOP提供了對
JDK動態代理的支援以及CGLib的支援。

JDK動態代理只能為介面建立動態代理例項,
而不能對類建立動態代理。
需要獲得被目標類的介面資訊(應用Java的反射技術),
生成一個實現了代理介面的動態代理類(位元組碼),
再通過反射機制獲得動態代理類的建構函式,
利用建構函式生成動態代理類的例項物件,
在呼叫具體方法前呼叫invokeHandler方法來處理。

CGLib動態代理需要依賴asm包,
把被代理物件類的class檔案載入進來,
修改其位元組碼生成子類。

但是Spring AOP基於註解配置的情況下,
需要依賴於AspectJ包的標準註解,
但是不需要額外的編譯以及AspectJ的織入器,
而基於XML配置不需要。


143. 請描述JDK動態代理和CGLI代理的區別?

1.JDK動態代理
此時代理物件和目標物件實現了相同的介面,
目標物件作為代理物件的一個屬性,
具體介面實現中,
可以在呼叫目標物件相應方法前後
加上其他業務處理邏輯。

代理模式在實際使用時
需要指定具體的目標物件,
如果為每個類都新增一個代理類的話,
會導致類很多,
同時如果不知道具體類的話,
怎樣實現代理模式呢?
這就引出動態代理。
JDK動態代理只能
針對實現了介面的類生成代理。

2.CGLIB代理
CGLIB(CODE GENERLIZE LIBRARY)
代理是針對類實現代理,
主要是對指定的類生成一個子類,
覆蓋其中的所有方法,
所以該類或方法不能宣告稱final的。

如果目標物件沒有實現介面,
則預設會採用CGLIB代理;

如果目標物件實現了介面,
可以強制使用CGLIB實現代理
新增CGLIB庫,
並在spring配置中加入
<aop:aspectj-autoproxy proxy-target-class="true"/>)
 

144.怎樣用註解的方式配置Spring?

Spring在2.5版本以後
開始支援用註解的方式來配置依賴注入。
可以用註解的方式
來替代XML方式的bean描述,
可以將bean描述轉移到元件類的內部,
只需要在相關類上、
方法上或者欄位宣告上使用註解即可。
註解注入將會被容器在XML注入之前被處理,
所以後者會覆蓋掉前者
對於同一個屬性的處理結果。
註解裝配在Spring中是預設關閉的。
所以需要在Spring檔案中
配置一下才能使用基於註解的裝配模式。
如果你想要在你的應用程式中
使用關於註解的方法的話,
參考如下的配置。
<beans>
   <context:annotation-config/>
</beans>
在 <context:annotation-config/>
標籤配置完成以後,
就可以用註解的方式在Spring中向屬性、
方法和構造方法中自動裝配變數。

下面是幾種比較重要的註解型別:
@Required:該註解應用於設值方法。

@Autowired:該註解應用於有值設值方法、
非設值方法、
構造方法和變數。
@Qualifier:該註解和@Autowired註解搭配使用,
用於消除特定bean自動裝配的歧義。
JSR-250 Annotations:
Spring支援基於JSR-250 
註解的以下註解,
@Resource、
@PostConstruct 
和 @PreDestroy。


145.如何在Spring中注入一個Java Collection?

•	<list> :   
該標籤用來裝配可重複的list值。
 <!-- java.util.List -->
      <property name="customList">
        <list>
           <value>INDIA</value>
           <value>Pakistan</value>
           <value>USA</value>
           <value>UK</value>
        </list>
      </property>

•	<set> :   
 該標籤用來裝配沒有重複的set值。
     <!-- java.util.Set -->
     <property name="customSet">
        <set>
           <value>INDIA</value>
           <value>Pakistan</value>
           <value>USA</value>
           <value>UK</value>
        </set>
      </property>


•	<map>:  
 該標籤可用來注入鍵和值可以為任何型別的鍵值對。
    <!-- java.util.Map -->
     <property name="customMap">
        <map>
           <entry key="1" value="INDIA"/>
           <entry key="2" value="Pakistan"/>
           <entry key="3" value="USA"/>
           <entry key="4" value="UK"/>
        </map>
      </property>


•	<props> : 
該標籤支援注入鍵和值都是字串型別的鍵值對。
      <!-- java.util.Properties -->
    <property name="customProperies">
        <props>
            <prop key="admin">[email protected]</prop>
            <prop key="support">[email protected]</prop>
        </props>
    </property>