1. 程式人生 > 其它 >pytest文件80 - 內建 fixtures 之 cache 寫入中文顯示\u4e2d\u6587問題(用打補丁方式解決)

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 框架能帶來哪些好處?

  1. 輕量:Spring 是輕量的,基本的版本大約 2MB
  2. 控制反轉:Spring 通過控制反轉實現了鬆散耦合,物件們給出它們的依賴,而不是建立或查詢依賴的物件們
  3. 面向切面的程式設計(AOP):Spring 支援面向切面的程式設計,並且把應用業務邏輯和系統服務分開
  4. 容器:Spring 包含並管理應用中物件的生命週期和配置
  5. MVC 框架:Spring 的 WEB 框架是個精心設計的框架,是 Web 框架的一個很好的替代品
  6. 事務管理:Spring 提供一個持續的事務管理介面,可以擴充套件到上至本地事務下至全域性事務(JTA)
  7. 異 常 處 理 : 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配合使用

構造方法注入和設值注入有什麼區別?

設值注入的優勢:

  1. 設值注入寫法直觀便於理解,使各種關係清晰明瞭。
  2. 設值注入可以避免因複雜的依賴例項化時所造成的效能問題。
  3. 設值注入的靈活性較強。

構造方法注入的優勢:

  1. 構造方法注入可以決定依賴關係的注入順序,有限依賴的優先注入。
  2. 對於依賴關係無需變化的Bean,構造方法注入使所有的依賴關係全部在構造器內設定,可避免後續程式碼對依賴關係的破壞。
  3. 構造方法注入中只有組建的建立者才能改變組建的依賴關係,更符合高內聚原則。

建議:

採用設值注入為主,構造注入為輔的注入策略。依賴關係無需變化時,儘量採用構造注入,而其它的依賴關係的注入,則考慮設值注入。

構造器引數實現強制依賴,setter 方法實現可選依賴。

Spring 框架中有哪些不同型別的事件?

  1. 上下文更新事件(ContextRefreshedEvent):該事件會在ApplicationContext被初始化或者更新時釋出。也可以在呼叫ConfigurableApplicationContext 介面中的refresh()方法時被觸發。
  2. 上下文開始事件(ContextStartedEvent):當容器呼叫ConfigurableApplicationContext的Start()方法開始/重新開始容器時觸發該事件。
  3. 上下文停止事件(ContextStoppedEvent):當容器呼叫ConfigurableApplicationContext的Stop()方法停止容器時觸發該事件。
  4. 上下文關閉事件(ContextClosedEvent):當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的所有單例Bean都被銷燬。
  5. 請求處理事件(RequestHandledEvent):在Web應用中,當一個http請求(request)結束觸發該事件。

FileSystemResource 和 ClassPathResource 有何區別?

在FileSystemResource 中需要給出spring-config.xml檔案在你專案中的相對路徑或者絕對路徑。在ClassPathResource中spring會在ClassPath中自動搜尋配置檔案,所以要把ClassPathResource 檔案放在ClassPath下。

如果將spring-config.xml儲存在了src資料夾下的話,只需給出配置檔案的名稱即可,因為src資料夾是預設。

簡而言之,ClassPathResource在環境變數中讀取配置檔案,FileSystemResource在配置檔案中讀取配置檔案。

Spring 框架中都用到了哪些設計模式?

  1. 代理模式—在AOP和remoting中被用的比較多。
  2. 單例模式—在spring配置檔案中定義的bean預設為單例模式。
  3. 模板方法—用來解決程式碼重複的問題。
  4. 前端控制器—Srping提供了DispatcherServlet來對請求進行分發。
  5. 檢視幫助(View Helper )—Spring提供了一系列的JSP標籤,高效巨集來輔助將分散的程式碼整合在視圖裡。
  6. 依賴注入—貫穿於BeanFactory / ApplicationContext介面的核心理念。
  7. 工廠模式—BeanFactory用來建立物件的例項。