歡迎你的閱讀,本文整理了JAVA面試SSM框架常考的面試題,大家一起學習共同進步。
- JAVA基礎面試問題請參考:JAVA基礎問題彙集
小編按:Spring-SpringMVC-Mybatis 順序整理
文章目錄
1. 簡述什麼是 IoC 和 DI ?
- IoC 叫控制反轉,是 Inversion of Control 的縮寫,DI(Dependency Injection)叫依賴注入,是對 IoC 更簡單的詮釋。
控制反轉是把傳統上由程序代碼直接操控的對象的調用權交給容器,通過容器來實現對象組件的裝配和管理。所謂的"控制反轉"就是對組件對象控制權的轉移,從程序代碼本身轉移到了外部容器,由容器來創建對象並管理對象之間的依賴關係。
IoC 體現了好萊塢原則 - “Don’t call me, we will call you”。依賴注入的基本原則是應用組件不應該負責查找資源或者其他依賴的協作對象。配置對象的工作應該由容器負責,查找資源的邏輯應該從應用組件的代碼中抽取出來,交給容器來完成。
DI 是對 IoC 更準確的描述,即組件之間的依賴關係由容器在運行期決定,形象的來說,即由容器動態的將某種依賴關係注入到組件之中。
2. DI 是如何實現的?
- ①依賴注入可以通過 setter 方法注入(設值注入)
<property name="id" value="1314"></property>
- ②構造器注入:通過構造方法初始化
<constructor-arg index="0" type="java.lang.String" value="辰兮"></constructor-arg>
- ③接口注入三種方式來實現
Spring 支持 setter注入和構造器注入,通常使用構造器注入來注入必須的依賴關係,對於可選的依賴關係,則 setter注入是更好的選擇,setter注入需要類提供無參構造器或者無參的靜態工廠方法來創建對象。
- 小結::IoC解決對象之間的依賴問題,把所有Bean的依賴關係通過配置文件或註解關聯起來,降低了耦合度。
3. 解釋一下什麼叫 AOP (面向切面編程)?
- AOP(Aspect-Oriented Programming)指一種程序設計範型,該範型以一種稱爲切面(aspect)的語言構造爲基礎,切面是一種新的模塊化機制,用來描述分散在對象、類或方法中的橫切關注點(crosscutting concern)。
4. 闡述 Spring 框架中 Bean 的生命週期?
- ① Spring IoC 容器找到關於 Bean 的定義並實例化該 Bean。
- ② Spring IoC 容器對 Bean 進行依賴注入。
- ③ 如果 Bean 實現了 BeanNameAware 接口,則將該 Bean 的 id 傳給 setBeanName 方法。
- ④ 如果 Bean 實現了 BeanFactoryAware 接口,則將 BeanFactory 對象傳給 setBeanFactory
方法。 - ⑤ 如果 Bean 實現了 BeanPostProcessor 接口,則調用其
postProcessBeforeInitialization 方法。 - ⑥ 如果 Bean 實現了 InitializingBean 接口,則調用其 afterPropertySet 方法。
- ⑦ 如果有和 Bean 關聯的 BeanPostProcessors 對象,則這些對象的postProcessAfterInitialization 方法被調用。
- ⑧ 當銷燬 Bean 實例時,如果 Bean 實現了 DisposableBean 接口,則調用其 destroy 方法。
5. Spring 裏面的 aop的原理是什麼 ?
- 實現 AOP 的技術,主要分爲兩大類:
一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼
。通過反射創建動態代理對象,攔截方法執行,在將自己需要額外執行的代碼加塞進來執行。
6. Spring主要使用了什麼模式?
- 工廠模式:每個Bean的創建通過方法
- 單例模式:默認的每個Bean的作用域都是單例
- 代理模式:關於Aop的實現通過代理模式
7. 簡述Spring 中的事務 ?
- ①編程式事務管理:編程方式管理事務,極大靈活性,難維護。
- ②聲明式事務管理:可以將業務代碼和事務管理分離,用註解和xml配置來管理事務。
8. SpringMVC的核心是什麼,請求的流程是怎麼處理的 ?
- springmvc 是基於 servlet 的前端控制框架,核心是 ioc 和 aop(基於 spring 實現)
-
請求流程結合圖形腦補記憶
-
1、客戶端發出一個http請求給web服務器,web服務器對http請求進行解析,如果匹配DispatcherServlet的請求映射路徑(在web.xml中指定),web容器將請求轉交給DispatcherServlet.
-
2、DipatcherServlet接收到這個請求之後將根據請求的信息(包括URL、Http方法、請求報文頭和請求參數Cookie等)以及HandlerMapping的配置找到處理請求的處理器(Handler)。
-
3-4、DispatcherServlet根據HandlerMapping找到對應的Handler,將處理權交給Handler(Handler將具體的處理進行封裝),再由具體的HandlerAdapter對Handler進行具體的調用。
-
5、Handler對數據處理完成以後將返回一個ModelAndView()對象給DispatcherServlet。
-
6、Handler返回的ModelAndView()只是一個邏輯視圖並不是一個正式的視圖,DispatcherSevlet通過ViewResolver將邏輯視圖轉化爲真正的視圖View。
-
7、Dispatcher通過model解析出ModelAndView()中的參數進行解析最終展現出完整的view並返回給客戶端。
9. MyBatis 中使用 # 和 $ 書寫佔位符有什麼區別 ?
- ①#將傳入的數據都當成一個字符串,會對傳入的數據自動加上引號
- ② $將傳入的數據直接顯示生成在 SQL 中。
- 注意:使用 $ 佔位符可能會導致 SQL 注射攻擊,能用#的地方就不要使用 $ ,寫 order by 子句的時候應該用$而不是#。
10.Mybatis的好處 ?
- ①把Sql語句從Java中獨立出來。
- ②封裝了底層的JDBC,API的調用,並且能夠將結果集自動轉換成JavaBean對象,簡化了Java數據庫編程的重複工作。
- ③自己編寫Sql語句,更加的靈活。
- ④入參無需用對象封裝(或者map封裝),使用@Param註解。
11.簡述Mybatis的一級緩存和二級緩存 ?
-
①
一級緩存是SqlSession級別的緩存。
在操作數據庫時需要構造sqlSession對象,在對象中有一個數據結構(HashMap)用於存儲緩存數據。不同的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。(但是增刪改查等數據庫操作都會清空緩存)。 -
②
二級緩存是mapper級別的緩存
,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。
12.MyBatis 中的動態 SQL 是什麼意思 ?
- 對於一些複雜的查詢,我們可能會指定多個查詢條件,但是這些條件可能存在也可能不存在,例如在 58同城上面找房子,我們可能會指定面積、樓層和所在位置來查找房源,也可能會指定面積、價格、戶型和所在位置來查找房源,此時就需要根據用戶指定的條件動態生成 SQL 語句。
- 如果不使用持久層框架我們可能需要自己拼裝 SQL 語句,還好 MyBatis 提供了動態 SQL 的功能來解決這個問題。MyBatis中用於實現動態 SQL 的元素主要有:
- if
- choose / when / otherwise
- trim
- where
- set
- foreach
13.Mybatis工作原理簡述
- ①通過SqlSessionFactoryBuilder從mybatis-config.xml配置文件中構建出SqlSessionFactory。
- ②SqlSessionFactory開啓一個SqlSession,通過SqlSession實例獲得Mapper對象並且運行Mapper映射的Sql語句。
- ③完成數據庫的CRUD操作和事務提交,關閉SqlSession。
- Invest in yourself and improve yourself
2020.03.15. 記錄辰兮的第28篇博客