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

zhai_1997發表於2020-10-03

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>

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

 

3、spring的AOP及其運用

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

spring的aop程式設計:https://www.cnblogs.com/zhai1997/p/12707702.html

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

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

 

4、spring的常用註解

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

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

 

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

 

6、spring框架的優點

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

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


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

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

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

ClassPathXmlApplicationContext: 從XML 檔案中載入 beans的定義, 容器將在 classpath 裡找bean 配置

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

 

10、spring的單元測試

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

 

11、bean的生命週期

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

 

12、spring怎麼避免迴圈依賴

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

 

13、Beanfactory和ApplicationContext、BeanFactory和FactoryBean

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

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

摘自部落格園:https://www.cnblogs.com/joemsu/p/7688307.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 集合https://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: 如果有預設建構函式,則按照建構函式注入,若沒有建構函式則以“按型別自動裝配”
autodetect: 首先嚐試使用 constructor 來自動裝配, 如果無法工作, 則使用 byType方式。

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


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

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

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

@Bean 註解, 它表示此方法將要返回一個物件, 作為一個 bean 註冊進 Spring 應用上下文,相當於bean標籤

@Configuration註解表明這個類是一個配置類。可以啟動元件掃描,用來將帶有@Bean的實體進行例項化bean等

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?(https://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 支援的事務管理型別https://www.cnblogs.com/zhai1997/p/12309824.html
Spring 支援兩種型別的事務管理:
程式設計式事務管理: 這意味你通過程式設計的方式管理事務, 給你帶來極大的靈活性, 但是難維護。
宣告式事務管理: 這意味著你可以將業務程式碼和事務管理分離, 你只需用註解和 XML配置來管理事務。

32、Spring 框架的事務管理有哪些優點?
它為不同的事務 API 如 JTA, JDBC, Hibernate, JPA 和 JDO, 提供一個不變的程式設計模式。
它為程式設計式事務管理提供了一套簡單的 API 而不是一些複雜的事務 API 如它支援宣告式事務管理。
它和 Spring 各種資料訪問抽象層很好得整合。


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

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

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

 

相關文章