pytest文件80 - 內建 fixtures 之 cache 寫入中文顯示\u4e2d\u6587問題(用打補丁方式解決)
什麼是 Spring 框架?Spring 框架有哪些主要模組?
Spring是一個輕量級的JavaEE解決方案,整合眾多優秀的設計模式。
spring框架主要包括7個模組:
- Spring AOP 面向切面程式設計
- Spring ORM Hibernate|mybatis|JDO
- Spring Core 提供bean工廠 IOC
- Spring Dao JDBC支援
- Spring Context 提供了關於UI支援,郵件支援等
- Spring Web 提供了web的一些工具類的支援
- Spring MVC 提供了web mvc , webviews , jsp ,pdf ,export
使用 Spring 框架能帶來哪些好處?
- 輕量:Spring 是輕量的,基本的版本大約 2MB
- 控制反轉:Spring 通過控制反轉實現了鬆散耦合,物件們給出它們的依賴,而不是建立或查詢依賴的物件們
- 面向切面的程式設計(AOP):Spring 支援面向切面的程式設計,並且把應用業務邏輯和系統服務分開
- 容器:Spring 包含並管理應用中物件的生命週期和配置
- MVC 框架:Spring 的 WEB 框架是個精心設計的框架,是 Web 框架的一個很好的替代品
- 事務管理:Spring 提供一個持續的事務管理介面,可以擴充套件到上至本地事務下至全域性事務(JTA)
- 異 常 處 理 : Spring 提 供 方 便 的 API 把 具 體 技 術 相 關 的 異 常 ( 比 如 由 JDBC ,Hibernate or JDO 丟擲的)轉化為一致的 unchecked 異常
什麼是控制反轉(IOC)?什麼是依賴注入?
將建立物件的權利由手動建立轉換為Spring自動建立。將物件之間的依賴關係通過配置的方式注入到另一個物件中的過程。
請解釋下 Spring 框架中的 IoC?
IOC 意為控制反轉,普通javaEE建立物件是通過在程式中通過new建立,但是在Spring中,只需將設計好的類通過配置檔案或註解的方式設定好,即可由Spring自動建立,物件的控制權由程式轉移到了Spring,Spring通過工廠+反射生成物件,將物件放置在IOC容器中。
BeanFactory 和 ApplicationContext 有什麼區別?
BeanFactory是Spring的頂級介面,只提供了最基礎的容器功能。通過BeanFactory裝載Bean是延時建立。
ApplicationContext是BeanFactory的高階實現,其中增加了許多資源載入,國際化,AOP,訊息傳送響應機制。通過ApplicationContext裝載Bean是在Spring啟動時立即建立。
Spring 有幾種配置方式?
三種方式:xml,註解,java方式(配置類 @Bean)
如何用基於 XML 配置的方式配置 Spring?
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userService" class="sun.service.ServiceImpl.UserServiceImpl"></bean> </beans>
如何用基於 Java 配置的方式配置 Spring?
@Configuration public class AppConfig{ @Bean public MyService myService() { return new MyServiceImpl(); } }
怎樣用註解的方式配置 Spring?
1、在Spring配置檔案中開啟註解配置。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
</beans>2、通過@Autowired @Component 等註解進行Bean載入和注入
請解釋 Spring Bean 的生命週期?
- 首先是例項化、屬性賦值、初始化、銷燬這 4 個大階段;
- 再是初始化的具體操作,有 Aware 介面的依賴注入、BeanPostProcessor 在初始化前後的處理以及 InitializingBean 和 init-method 的初始化操作;
- 銷燬的具體操作,有註冊相關銷燬回撥介面,最後通過DisposableBean 和 destory-method 進行銷燬。
Spring Bean 的作用域之間有什麼區別?
Spring的 bean有5種作用域分別是:singleton、prototype、request、session和globalSession
singleton
全域性只有一個例項
prototype
每次呼叫產生一個新的例項
在web使用的時候還有三個作用域,但是必須在web.xml中註冊一個RequestContextListener , 目的是為了設定每次請求開始和結束都可以使spring得到相應的事件。
request
每次請求產生一個bean
session
每個使用者session可以產生一個新的bean,不同使用者之間的bean互相不影響
globalSession
作用和session類似,只是使用portlet的時候使用。
什麼是 Spring inner beans?
在Spring 框架中,無論何時bean 被使用時,當僅被呼叫了一個屬性。一個明智的做法是將這個bean宣告為內部bean。內部bean 可以用setter 注入“屬性”和構造方法注入“構造引數”的方式來實現。比如,在我們的應用程式中,一個Customer 類引用了一個Person 類,我們的要做的是建立一個Person的例項,然後在Customer 內部使用。
public class Customer{ private Person person; } public class Person{ private String name; private String address; private int age; }<bean id="CustomerBean" class="com.leon.common.Customer"> <property name="person"> <bean class="com.leon.common.Person"> <property name="name" value="lokesh" /> <property name="address" value="India" /> <property name="age" value="34" /> </bean> </property> </bean>
Spring 框架中的單例 Beans 是執行緒安全的麼?
prototype:每次請求都會建立新的Bean,執行緒之間不存在Bean的共享,因此是執行緒安全的。
singleton: 由於全域性只有一個Bean,因此可能會出現執行緒安全問題。但是由於單例Bean,大都是無狀態的Bean,也就是不會對Bean成員執行查詢以外的操作,因此不會出現執行緒安全問題。
請舉例說明如何在 Spring 中注入一個 Java Collection?
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userService3" class="sun.service.ServiceImpl.UserServiceImpl3"> <property name="strings"> <array> <value>kelvin</value> <value>jack</value> <value>tony</value> </array> </property> <property name="set"> <set> <value>kelvin</value> <value>jack</value> <value>tony</value> </set> </property> <property name="list"> <list> <value>kelvin</value> <value>jack</value> <value>tony</value> </list> </property> <property name="map"> <map> <entry key="kelvin" value="23"></entry> <entry key="jack" value="21"></entry> <entry key="tony"> <value>46</value> </entry> </map> </property> </bean> </beans>
如何向 Spring Bean 中注入一個 Java.util.Properties?
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userService3" class="sun.service.ServiceImpl.UserServiceImpl3"> <property name="prop"> <props> <prop key="kelvin">23</prop> <prop key="jack">45</prop> <prop key="tony">32</prop> </props> </property>
</bean> </beans>
請解釋 Spring Bean 的自動裝配?
是什麼?
spring中提供了向Bean中自動注入依賴的功能,這個過程就是自動裝配,當向bean中注入的內容非常多的時候,自動注入依賴的功能將極大的節省注入程式的時間。
有哪些型別?
基於xml:在<bean>標籤內通過autowire=byType byName constructor 決定注入型別判斷方式
<bean id="userDao“ class="com.spring.springioc.dao.impl.UserDaoImpl”/> <!--byType根據型別自動裝配userDao--> <bean id="userService" autowire="byType" class="com.spring.springioc.service.impl.UserServiceImpl"/><bean id="userDao" class="com.spring.springioc.dao.impl.UserDaoImpl"/> <!--這個bean是userDao型別的,但不是要注入的型別--> <bean id="userDao2" autowire-candidate="false" class="com.spring.springioc.dao.impl.userDaoImpl"/> <bean id="userService" autowire="byType" class="com.spring.springioc.service.impl.userSericeImpl"/>基於註解:@Autowired @Qualifier @Resource @Value
請解釋自動裝配模式的區別?
- no: 這是Spring框架的預設設定,在該設定下自動裝配是關閉的,開發者需要自行在bean定義中用標籤明確的設定依賴關係。
- byName: 該選項可以根據bean名稱設定依賴關係。當向一個bean中自動裝配一個屬性時,容器將根據bean的名稱自動在在配置檔案中查詢一個匹配的bean。如果找到的話,就裝配這個屬性,如果沒找到的話就報錯。
- byType: 該選項可以根據bean型別設定依賴關係。當向一個bean中自動裝配一個屬性時,容器將根據bean的型別自動在在配置檔案中查詢一個匹配的bean。如果找到的話,就裝配這個屬性,如果沒找到的話就報錯。
- constructor: 造器的自動裝配和byType模式類似,但是僅僅適用於與有構造器相同引數的bean,如果在容器中沒有找到與構造器引數型別一致的bean,那麼將會丟擲異常。
- autodetect: 該模式自動探測使用構造器自動裝配或者byType自動裝配。首先,首先會嘗試找合適的帶引數的構造器,如果找到的話就是用構造器自動裝配,如果在bean內部沒有找到相應的構造器或者是無參構造器,容器就會自動選擇byTpe的自動裝配方式。
如何開啟基於註解的自動裝配?
- 引入配置檔案中的
<bean>
下引入<context:annotation-config>
<beans> <context:annotation-config /> </beans>
- 在bean配置檔案中直接引入
AutowiredAnnotationBeanPostProcessor
<beans> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> </beans>
請舉例解釋@Required 註解?請舉例解釋@Autowired 註解?請舉例說明@Qualifier 註解?
@Required
檢查屬性是否被正確設定。
RequiredAnnotationBeanPostProcessor 是 Spring 中的後置處理用來驗證被 @Required 註解的 bean 屬性是否被正確的設定了。在使用 RequiredAnnotationBeanPostProcesso 來驗證 bean 屬性之前,首先要在 IoC 容器中對 其進行註冊:
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotatio nBeanPostProcessor" />但是如果沒有屬性被用 @Required 註解過的話,後置處理器會丟擲一個 BeanInitializationException 異常。
@Autowired
@Autowired 註解對自動裝配何時何處被實現提供了更多細粒度的控制。@Autowired 註解可 以像@Required 註解、構造器一樣被用於在 bean 的設值方法上自動裝配 bean 的屬性,一個引數或者帶有任意名稱或帶有多個引數的方法。
比如,可以在設值方法上使用@Autowired 註解來替代配置檔案中的 元 素。當 Spring 容器在 setter 方法上找到@Autowired 註解時,會嘗試用 byType 自動裝配。
當然我們也可以在構造方法上使用@Autowired 註解。帶有@Autowired 註解的構造方法意味著 在建立一個 bean 時將會被自動裝配,即便在配置檔案中使用 元素。@Qualifier
@Qualifier 註解意味著可以在被標註 bean 的欄位上可以自動裝配。通常和@Autowired配合使用
構造方法注入和設值注入有什麼區別?
設值注入的優勢:
- 設值注入寫法直觀便於理解,使各種關係清晰明瞭。
- 設值注入可以避免因複雜的依賴例項化時所造成的效能問題。
- 設值注入的靈活性較強。
構造方法注入的優勢:
- 構造方法注入可以決定依賴關係的注入順序,有限依賴的優先注入。
- 對於依賴關係無需變化的Bean,構造方法注入使所有的依賴關係全部在構造器內設定,可避免後續程式碼對依賴關係的破壞。
- 構造方法注入中只有組建的建立者才能改變組建的依賴關係,更符合高內聚原則。
建議:
採用設值注入為主,構造注入為輔的注入策略。依賴關係無需變化時,儘量採用構造注入,而其它的依賴關係的注入,則考慮設值注入。
構造器引數實現強制依賴,setter 方法實現可選依賴。
Spring 框架中有哪些不同型別的事件?
- 上下文更新事件(ContextRefreshedEvent):該事件會在ApplicationContext被初始化或者更新時釋出。也可以在呼叫ConfigurableApplicationContext 介面中的refresh()方法時被觸發。
- 上下文開始事件(ContextStartedEvent):當容器呼叫ConfigurableApplicationContext的Start()方法開始/重新開始容器時觸發該事件。
- 上下文停止事件(ContextStoppedEvent):當容器呼叫ConfigurableApplicationContext的Stop()方法停止容器時觸發該事件。
- 上下文關閉事件(ContextClosedEvent):當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的所有單例Bean都被銷燬。
- 請求處理事件(RequestHandledEvent):在Web應用中,當一個http請求(request)結束觸發該事件。
FileSystemResource 和 ClassPathResource 有何區別?
在FileSystemResource 中需要給出spring-config.xml檔案在你專案中的相對路徑或者絕對路徑。在ClassPathResource中spring會在ClassPath中自動搜尋配置檔案,所以要把ClassPathResource 檔案放在ClassPath下。
如果將spring-config.xml儲存在了src資料夾下的話,只需給出配置檔案的名稱即可,因為src資料夾是預設。
簡而言之,ClassPathResource在環境變數中讀取配置檔案,FileSystemResource在配置檔案中讀取配置檔案。
Spring 框架中都用到了哪些設計模式?
- 代理模式—在AOP和remoting中被用的比較多。
- 單例模式—在spring配置檔案中定義的bean預設為單例模式。
- 模板方法—用來解決程式碼重複的問題。
- 前端控制器—Srping提供了DispatcherServlet來對請求進行分發。
- 檢視幫助(View Helper )—Spring提供了一系列的JSP標籤,高效巨集來輔助將分散的程式碼整合在視圖裡。
- 依賴注入—貫穿於BeanFactory / ApplicationContext介面的核心理念。
- 工廠模式—BeanFactory用來建立物件的例項。