[Java複習] Spring 常見面試問題

1. 什麼是 Spring 框架?Spring 框架有哪些主要模塊?web

輕量級實現IoC和AOP的JavaEE框架。算法

Core模塊:spring

bean(bean定義建立解析), context(環境, IoC容器), core(核心組件, util, 定義資源訪問方式)。數據庫

Data模塊:JDBC, ORM, OXM, JMS, Transactions設計模式

Web模塊:WebMVC, WebFlux緩存

AOP模塊,Messaging模塊(集成messaging API和消息協議提供支持)安全

 

2.使用 Spring 框架能帶來哪些好處?websocket

IoC,DI,AOP,MVC, 解耦,非入侵session

 

3. 什麼是控制反轉(IOC)?什麼是依賴注入?app

IOC:Spring負責bean的生命週期管理。

DI: bean之間的依賴關係由Spring管理。

三種注入方式:

  • 構造器注入
  • Setter 方法注入
  • 接口注入

 

4.請解釋下 Spring 框架中的 IoC?

IOC:Spring負責bean的生命週期管理。

主要是指BeanFactory和ApplicationContext。

 

5.BeanFactory 和 ApplicationContext 有什麼區別?

BeanFactory,Spring工廠方法的頂級接口。

ApplicationContext繼承BeanFactory,包括所有功能,還擴展國際化,支持AOP, Web, 事件監聽等。

 

6.Spring 有幾種配置方式?

  • XML
  • 註解
  • JavaConfig

 

7. 如何用基於 XML 配置的方式配置 Spring?

經過bean.xml配置文件。例如,XML中配置一個user bean。

<bean id=「user」class=」com.xxx.User」>

代碼裏經過applicatoinContext是建立bean,獲取bean。

ApplicationContext context = new ClasspathApplicationContext(「bean.xml」);
User user = context.getBean(「user」);

 

8.如何用基於 Java 配置的方式配置 Spring?

定義一個Config組件類,類標註@Configuration,相等於XML, 裏面方法標註@bean表示該返回對象是一個bean放入Spring IoC。

@ComponentScan組件掃描配置的Config類。

 

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

@Component,@Controller @Repository, @Service 標識類。

 

10.請解釋 Spring Bean 的生命週期?

1. 實例化Bean(new)

2. 填充屬性

3.檢測該對象是否實現了xxxAware接口,並將相關的xxxAware實例注入給bean。

4.是否實現BeanPostProcessor接口, 前置處理方法postProcessBeforeInitialization

5. 檢查是否實現InitializatingBean接口,實現調用afterPropertiesSet()方法,與在XML配置init-method做用一致。

6.後置方法postProcessAfterinitialzation()。
Bean將駐留在應用上下文給應用使用。
銷燬流程1. 若是實現DisposableBean,調用destroy方法,和XML配置destroy-method一致。

 

11. Spring Bean 的做用域之間有什麼區別?

singleton, prototype, request, session

spring5: application, websocket分別保證在一個ServletContext和一個WebSocket中只建立一個實例。

 

12. 什麼是 Spring inner beans?

有點像Java內部類。若是一個bean只在另外一個bean中依賴,在能夠定義爲spring inner bean。
例如:peson是customer的spring inner bean.
<?xml version="1.0"?>

<bean id="CustomerBean" class="com.mkyong.common.Customer">
<property name="person">
<bean class="com.mkyong.common.Person">
<property name="name" value="mkyong" />
<property name="address" value="address1" />
<property name="age" value="28" />
</bean>
</property>
</bean>
</beans>
注意,id和name在inner bean中不是必須的,由於會被spring容器忽略。

 

13. Spring 框架中的單例 Beans 是線程安全的麼?

不是線程安全的。須要開發者本身解決線程安全問題。Spring管理大多數對手是無狀態對象。單例的無狀態對象是線程安全的。

 

14.請舉例說明如何在 Spring 中注入一個 Java Collection?

1. Spring提供4種集合類的配置元素:<list>,<set>,<map>,<props>
XML:注入list
<property>
<list>
<value>A</value>
<value>B</value>

</list>
</property>
2. 用@Value讀取propeties做爲map或list注入。

 

16.請解釋 Spring Bean 的自動裝配?自動裝配好處?

裝配就是建立對象之間的依賴,注入依賴的屬性。

自動裝配就是自動注入依賴,是相對於以前用XML文件來手動注入。

好處是減小消除<property>,<constructor-arg>元素,減小XML配置。

1.組件掃描,Spring會自動發現應用上下文中所建立的bean。2.Spring知足bean直接的依賴關係。

 

17.請解釋自動裝配模式的區別?

5種。

no: 默認設置,自動裝配是關閉的,開發者自行設置依賴關係。

byName:根據bean的名字和當前bean 的setter風格的屬性名進行自動裝配,如有匹配的,則進行自動裝配,若沒有,則不匹配

byType:根據bean 的類型和當前bean的屬性的類型進行自動裝配,若IOC容器中有一個以上的類型匹配的bean,則拋異常

constructor:適用於與有構造器相同參數的bean,若是在容器中沒有找到與構造器參數類型一致的bean,那麼將會拋出異常。

autodetect:自動探測使用構造器自動裝配或者byType自動裝配。

 

18.如何開啓基於註解的自動裝配?

XML配置文件狀況下:

<beans>
<context:annotation-config />
</beans>

Springboot,直接用:

@Autowired、@Qualifier、@Resource

@Resource爲sun公司提供的註解,也可使用與屬性和方法上,在自動裝配時默認使用裝配類的首字母小寫的字符串去容器中查找實例進行裝配。

 

19. 請舉例解釋@Required 註解?

@Required註解做用於Bean的setter方法上,用於檢查一個Bean的屬性的值在配置期間是否被賦予或設置(populated)

 

20.請舉例解釋@Autowired 註解?

@Autowired在默認狀況下是必須進行裝配,若是沒有裝配成功會報錯能夠經過設置

@Autowired(required = false)來讓自動裝配沒有成功時不進行自動裝配

 

21. 請舉例說明@Qualifier 註解?

@Qualifier通常與@Autowired搭配使用,做用爲在spring容器中經過類進行查找的同時會經過spring中配置的bean的id進行查找

 

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

XML配置中:在xml文件下對應使用property和constructor-arg屬性。

構造:適用於強依賴關聯。

設值:適用於弱依賴。(Spring能夠解決循環依賴)

 

23.Spring 框架中有哪些不一樣類型的事件?

Spring 的 ApplicationContext 提供了支持事件和代碼中監聽器的功能。

能夠建立 bean 用來監聽在 ApplicationContext 中發佈的事件。ApplicationEvent 類和在 ApplicationContext 接口中處理的事件,若是一個 bean 實現了 ApplicationListener 接口,當一個 ApplicationEvent 被髮布之後,bean 會自動被通知。

Spring 提供瞭如下 5 中標準的事件:

1.上下文更新事件(ContextRefreshedEvent):該事件會在 ApplicationContext 被初始化或者更新時發佈。也能夠在調用 ConfigurableApplicationContext 接口中的 refresh()方法時被觸發。

2.上下文開始事件(ContextStartedEvent):當容器調用 ConfigurableApplicationContext的 Start()方法開始/從新開始容器時觸發該事件。

3.上下文中止事件(ContextStoppedEvent):當容器調用 ConfigurableApplicationContext的 Stop()方法中止容器時觸發該事件。

4.上下文關閉事件(ContextClosedEvent):當 ApplicationContext 被關閉時觸發該事件。容器被關閉時,其管理的全部單例 Bean 都被銷燬。

5.請求處理事件(RequestHandledEvent):在 Web 應用中,當一個 http 請求(request)結束觸發該事件。

除了上面介紹的事件之外,還能夠經過擴展 ApplicationEvent 類來開發自定義的事件。

Spring 的事件流程總結:

定義一個事件: 實現一個繼承自 ApplicationEvent,而且寫相應的構造函數;

定義一個事件監聽者:實現 ApplicationListener 接口,重寫 onApplicationEvent() 方法;

使用事件發佈者發佈消息: 能夠經過 ApplicationEventPublisher 的 publishEvent() 方法發佈消息。

 

24.FileSystemResource 和 ClassPathResource 有何區別?

ClassPathResource在環境變量中讀取配置文件,FileSystemResource在配置文件中讀取配置文件

5種獲取資源類的區別:

ClassPathResource:從系統的類路徑中加載

FileSystemResource:從文件系統加載,好比說本身指定配置文件的全路徑

InputStreamResource:從輸入流中加載

ServletContextResource:從Servlet 上下文環境中加載

UrlResource:從指定的Url加載

 

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

工廠模式:

BeanFactory和ApplicationContext:簡單工廠模式,實質是由一個工廠類根據傳入的參數(beanId),動態決定應該建立哪個產品類。

FactoryBean:工廠方法模式,工廠方法模式就是一個工廠接口和多個工廠實現類,要增長一個新的產品,增長一個新的工廠實現類便可,針對以前的老的工廠實現類也不須要修改。

單例模式:

Spring 中 bean 的默認做用域就是 singleton(單例)。

Spring 經過 ConcurrentHashMap 實現單例註冊表的特殊方式實現單例模式。

代理設計模式:

Spring AOP 就是基於動態代理的,若是要代理的對象,實現了某個接口,那麼Spring AOP會使用JDK Proxy,去建立代理對象,而對於沒有實現接口的對象,就沒法使用 JDK Proxy 去進行代理了,這時候Spring AOP會使用Cglib ,這時候Spring AOP會使用 Cglib 生成一個被代理對象的子類來做爲代理。

模板方法模式:

模板方法模式是一種行爲設計模式,它定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。 模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟的實現方式。

Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 結尾的對數據庫操做的類,它們就使用到了模板模式。

觀察者模式:

觀察者模式是一種對象行爲型模式。它表示的是一種對象與對象之間具備依賴關係,當一個對象發生改變的時候,這個對象所依賴的對象也會作出反應。

Spring 事件驅動模型就是觀察者模式很經典的一個應用。Spring 事件驅動模型很是有用,在不少場景均可以解耦咱們的代碼。好比咱們每次添加商品的時候都須要從新更新商品索引,這個時候就能夠利用觀察者模式來解決這個問題。

適配器模式:

適配器模式(Adapter Pattern) 將一個接口轉換成客戶但願的另外一個接口,適配器模式使接口不兼容的那些類能夠一塊兒工做,其別名爲包裝器(Wrapper)。

SpringAOP:

Spring AOP 的加強或通知(Advice)使用到了適配器模式,與之相關的接口是AdvisorAdapter 。Advice 經常使用的類型有:BeforeAdvice(目標方法調用前,前置通知)、AfterAdvice(目標方法調用後,後置通知)、AfterReturningAdvice(目標方法執行結束後,return以前)等等。每一個類型Advice(通知)都有對應的攔截器:MethodBeforeAdviceInterceptor、AfterReturningAdviceAdapter、AfterReturningAdviceInterceptor。Spring預約義的通知要經過對應的適配器,適配成 MethodInterceptor接口(方法攔截器)類型的對象(如:MethodBeforeAdviceInterceptor 負責適配 MethodBeforeAdvice)。

SpringMVC:

DispatcherServlet 根據請求信息調用 HandlerMapping,解析請求對應的 Handler。解析到對應的 Handler(也就是咱們日常說的 Controller 控制器)後,開始由HandlerAdapter 適配器處理。HandlerAdapter 做爲指望接口,具體的適配器實現類用於對目標類進行適配,Controller 做爲須要適配的類。

裝飾者模式:

裝飾者模式能夠動態地給對象添加一些額外的屬性或行爲。相比於使用繼承,裝飾者模式更加靈活。簡單點兒說就是當咱們須要修改原有的功能,但咱們又不肯直接去修改原有的代碼時,設計一個Decorator套在原有代碼外面。

其實在 JDK 中就有不少地方用到了裝飾者模式,好比 InputStream家族,InputStream 類下有 FileInputStream (讀取文件)、BufferedInputStream (增長緩存,使讀取文件速度大大提高)等子類都在不修改InputStream 代碼的狀況下擴展了它的功能。

Spring 中配置 DataSource 的時候,DataSource 多是不一樣的數據庫和數據源。Spring 中用到的包裝器模式在類名上含有 Wrapper或者 Decorator。這些類基本上都是動態地給一個對象添加一些額外的職責。

 

參考:

https://zhuanlan.zhihu.com/p/38484238

相關文章
相關標籤/搜索