spring:spring再總結(ioc、aop、DI等)

IOC(Inversion of Control),即「控制反轉」,不是一種技術而是一種思想

1、IOC的理解

  Ioc意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。

  控制:在使用spring之前,我們直接在對象內部通過new進行創建對象,是程式主動去創建依賴對象;而IoC是由專門一個容器來創建這些對象,即由Ioc容器來控制對象的創建,IoC 容器控制了對象,那就是主要控制了外部資源獲取(不只是對象包括比如文件等)。對於某個具體的對象而言,以前是程式控制其他對象,現在是所有對象都被spring控制,所以這叫控制反轉。

  反轉:傳統應用程式是由我們自己在對象中主動控制去直接獲取依賴對象,而反轉則是由容器來幫忙創建及注入依賴對象;為何是反轉,因為由容器幫我們查找及注入依賴對象,對象只是被動的接受依賴對象,控制對象生存周期的不再是引用它的對象,而是spring。

  優點:實現資源的可配置和易管理、降低了程式的耦合度

  缺點:ioc使用反射來創建對象,在效率上會有些損耗。但相對於程式的靈活性和可維護性來說,這點損耗是微不足道的。

  

Dependency Injection,即「依賴注入」

2、DI的理解

 你不在程式碼里直接組裝你的組件和服務,但是要在配置文件里描述哪些組件需要哪些服務, 之後一個容器( IOC 容器) 負責把他們組裝起來。

依賴:應用程式依賴於IOC容器來獲取外部資源

注入:注入某個對象所需要的外部資源(包括對象、資源、常量數據),下面的程式碼中,注入的既可以是值類型的數據也可以是對象

  性能方面:在使用spring框架之前,我們在web開發中,如果service層的A類需要調用dao層的B類的方法,那麼就需要在A類中創建B類的對象,對象的創建是由我們自己決定的,而使用了spring之後,spring從容器中取出A類需要的對象並將其給A類,具體的實現細節我們不需要知道(是通過反射機制來產生對象的)

<!--將連接池放入Spring容器-->
    <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql:///stu_mangement"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
<!--將JDBCTemplate放入Spring容器-->
    <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
<!--將StudentDao放入Spring容器中-->
    <bean name="studentDao" class="pers.zhb.jdbc.StudentDaoImp">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>

參考部落格://www.cnblogs.com/xdp-gacl/p/4249939.html

 

3、spring的AOP及其運用

spring的aop思想://www.cnblogs.com/zhai1997/p/12300652.html

spring的aop編程://www.cnblogs.com/zhai1997/p/12707702.html

spring的應用(事務處理)://www.cnblogs.com/zhai1997/p/12309824.html

動態代理://www.cnblogs.com/zhai1997/p/12257150.html

 

4、spring的常用註解

//www.cnblogs.com/zhai1997/p/12696197.html

//www.cnblogs.com/zhai1997/p/12294391.html

 

5、解釋 Spring 支援的幾種 bean 的作用域(五種)
//www.cnblogs.com/zhai1997/p/12696197.html

 

6、spring框架的優點

//www.cnblogs.com/zhai1997/p/12590815.html

7、 Spring 由哪些模組組成
//www.cnblogs.com/zhai1997/p/12590815.html


8、什麼是 Spring IOC 容器
Spring IOC 負責創建對象, 管理對象( 通過依賴注入、 裝配對象、 配置對象,並且管理這些對象的整個生命周期)

9、ApplicationContext 通常的實現是什麼//www.cnblogs.com/zhai1997/p/12287054.html

FileSystemXmlApplicationContext : 此容器從一個 XML 文件中載入 beans的定義, 是讀取的文件系統的xml文件

ClassPathXmlApplicationContext: 從XML 文件中載入 beans的定義, 容器將在 classpath 里找bean 配置

WebXmlApplicationContext:從Web系統中的XML文件來載入Bean定義的資訊

 

10、spring的單元測試

//www.cnblogs.com/zhai1997/p/12736327.html

 

11、bean的生命周期

//www.cnblogs.com/zhai1997/p/13539410.html

 

12、spring怎麼避免循環依賴

//www.cnblogs.com/zhai1997/p/13568343.html

 

13、Beanfactory和ApplicationContext、BeanFactory和FactoryBean

//www.cnblogs.com/zhai1997/p/13533080.html

14、 有哪些不同類型的 IOC(依賴注入)方式
//www.cnblogs.com/zhai1997/p/12291752.html


15、哪種依賴注入方式你建議使用,構造器注入,還是 Setter 方法注入
兩種依賴方式都可以使用, 構造器注入和 Setter 方法注入。 最好的解決方案是用構造器參數實現強制依賴, setter 方法實現可選依賴。

16、 一個 Spring Bean 定義 包含什麼?
一 個 Spring Bean 的 定 義 包 含 容 器 必 知 的 所 有 配 置 元 數 據 , 包 括 如 何 創 建 一 個bean, 它的生命周期詳情及它的依賴。bean默認是單例的
給Spring容器提供配置元數據的三種方式:XML 配置文件、基於註解的配置、基於 java 的配置

17、Spring 框架中的單例 bean 是執行緒安全的嗎

不, Spring 框架中的單例 bean 不是執行緒安全的


18、 哪些是重要的 bean 生命周期方法? 你能重載它們嗎?
有兩個重要的 bean 生命周期方法, 第一個是 setup , 它是在容器載入 bean 的時候被調用。 第二個方法是 teardown 它是在容器卸載類的時候被調用。
bean 標籤有兩個重要的屬性( init-method 和 destroy-method) 。 用它們可以自己訂製初始化和註銷方法 。 它們 也 有 相 應 的 注 解 ( @PostConstruct 和@PreDestroy) 。

19、 什麼是 Spring 的內部 bean

  當一個 bean 僅被用作另一個 bean 的屬性時, 它能被聲明為一個內部 bean, 為了定義 inner bean, 在 Spring 的 基於 XML 的 配置元數據中, 可以在 <property/>或

<constructor-arg/>元素內使用<bean/> 元素, 內部 bean 通常是匿名的, 它們的 Scope 一般是 prototype。


20、在 Spring 中如何注入一個 java 集合//www.cnblogs.com/zhai1997/p/12291752.html
Spring 提供以下幾種集合的配置元素:
<list>類型用於注入一列值, 允許有相同的值
<set> 類型用於注入一組值, 不允許有相同的值
<map> 類型用於注入一組鍵值對, 鍵和值都可以為任意類型
<props>類型用於注入一組鍵值對, 鍵和值都只能為 String 類型


21、什麼是 bean 裝配?
bean 裝配是指在 Spring 容器中把 bean 組裝到一起, 前提是容器需要知道 bean 的依賴關係, 如何通過依賴注入來把它們裝配到一起。

22、 什麼是 bean 的自動裝配?
Spring 容 器 能 夠 自 動 裝 配 相 互 合 作 的 bean , 這 意 味 著 容 器 不 需 要<constructor-arg>和<property>配置,需要做的僅僅實在<bean>的autowire屬性里指定自動裝配的模式,

能通過 Bean 工廠自動處理 bean 之間的協作。

 有五種自動裝配的方式, 可以用來指導 Spring 容器用自動裝配方式來進行依賴注入

no: 默認的方式是不進行自動裝配, 通過顯式設置 ref 屬性來進行裝配。
byName: 通過參數名 自動裝配, Spring 容器在配置文件中發現 bean 的 autowire屬性被設置成 byname, 之後容器試圖匹配、 裝配和該 bean 的屬性具有相同名字的bean。
byType: 通過參數類型自動裝配, Spring 容器在配置文件中發現 bean 的 autowire屬性被設置成 byType, 之後容器試圖匹配、 裝配和該 bean 的屬性具有相同類型的bean。 如果有多個 bean 符合條件, 則拋出錯誤。
constructor: 這個方式類似於 byType, 但是要提供給構造器參數, 如果沒有確定的帶參數的構造器參數類型, 將會拋出異常。
autodetect: 首先嘗試使用 constructor 來自動裝配, 如果無法工作, 則使用 byType方式。

23、自動裝配有哪些局限性
自動裝配的局限性是:
重寫: 你仍需用 <constructor-arg>和 <property> 配置來定義依賴, 意味著總要重寫自動裝配。
基本數據類型: 你不能自動裝配簡單的屬性, 如基本數據類型, String 字元串和類
模糊特性: 自動裝配不如顯式裝配精確, 如果有可能, 建議使用顯式裝配


24、你可以在 Spring 中注入一個 null 和一個空字元串嗎?
可以。

25、什麼是基於 Java 的 Spring 註解配置? 給一些註解的例子
基於 Java 的配置, 允許你在少量的 Java 註解的幫助下, 進行你的大部分 Spring配置而非通過 XML 文件。

@Configuration 註解為例, 它用來標記類可以當做一個 bean 的定義, 被 SpringIOC 容器使用。 

@Bean 註解, 它表示此方法將要返回一個對象, 作為一個 bean 註冊進 Spring 應用上下文。

26、什麼是基於註解的容器配置
相對於 XML 文件, 註解型的配置依賴於通過位元組碼元數據裝配組件, 而非尖括弧的聲明。
開發者通過在相應的類, 方法或屬性上使用註解的方式, 直接組件類中進行配置, 而不是使用 xml 表述 bean 的裝配關係。

27、怎樣開啟註解裝配
註解裝配在默認情況下是不開啟的, 為了使用註解裝配, 我們必須在 Spring 配置文件中配置 <context:annotation-config/>元素。

<context:component-scan>除了具有<context:annotation-config>的功能之外,<context:component-scan>還可以在指定的package下掃描以及註冊javabean 。還具有自動將帶有

@component,@service,@Repository等註解的對象註冊到spring容器中的功能。當使用 <context:component-scan> 後,就可以將 <context:annotation-config>移除。

 

28、在 Spring 框架中如何更有效地使用 JDBC?(//www.cnblogs.com/zhai1997/p/12304072.html
使用 SpringJDBC 框架, 資源管理和錯誤處理的代價都會被減輕。 所以開發者只需寫 statements 和 queries 從數據存取數據, JDBC 也可以在 Spring 框架提供的模板類的幫助下更有

效地被使用, 這個模板叫 JdbcTemplate


29、JdbcTemplate
JdbcTemplate 類提供了很多便利的方法解決諸如把資料庫數據轉變成基本數據類型或對象, 執行寫好的或可調用的資料庫操作語句, 提供自定義的數據錯誤處理。

30、Spring 支援的 ORM(對象關係映射)
Hibernate
iBatis
JPA (Java Persistence API)
TopLink
JDO (Java Data Objects)
OJB

 

31、 Spring 支援的事務管理類型//www.cnblogs.com/zhai1997/p/12309824.html
Spring 支援兩種類型的事務管理:
編程式事務管理: 這意味你通過編程的方式管理事務, 給你帶來極大的靈活性, 但是難維護。
聲明式事務管理: 這意味著你可以將業務程式碼和事務管理分離, 你只需用註解和 XML配置來管理事務。

32、Spring 框架的事務管理有哪些優點?
它為不同的事務 API 如 JTA, JDBC, Hibernate, JPA 和 JDO, 提供一個不變的編程模式。
它為編程式事務管理提供了一套簡單的 API 而不是一些複雜的事務 API 如它支援聲明式事務管理。
它和 Spring 各種數據訪問抽象層很好得集成。


33、你更傾向用那種事務管理類型?
  大多數 Spring 框架的用戶選擇聲明式事務管理, 因為它對應用程式碼的影響最小, 因此更符合一個無侵入的輕量級容器的思想。 聲明式事務管理要優於編程式事務管理,雖然比編程式事

務管理( 這種方式允許你通過程式碼控制事務) 少了一點靈活性。

34、解釋基於註解的切面實現//www.cnblogs.com/zhai1997/p/12711155.html
在這種情況下(基於@AspectJ 的實現), 涉及到的切面聲明的風格與帶有 java5 標註的普通 java 類一致。