日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SSM框架面试题整理

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SSM框架面试题整理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目目錄

  • Spring相關
    • 1、對Spring的了解
      • 使用Spring框架的好處
      • Spring的模塊
    • 2、Spring使用了哪些設計模式
    • 3、什么是Spring-MVC框架
      • Spring-MVC常用注解
    • 3、SpringBean
      • SpringBean的生命周期
      • BeanFactory和ApplicationContext有什么區別
      • Spring框架中的單例bean是線程安全的嗎
      • Spring如何處理線程并發問題
      • 什么是Spring的內部bean
      • Spring Bean 有哪些作用域
    • 4、Spring 框架有哪些自動裝配模式
    • 5、SpringMVC執行流程
    • 6、一些常用注解的區別
      • @Autowire和@Resource區別
    • 7、SpringMVC中的攔截器和Servlet的過濾器區別
    • 8、Spring加載流程
    • 9、Spring的IOC理解
      • IOC的實現原理
      • Spring通知有哪些類型
    • 10、SpringAop 實現原理
      • Spring AOP里面的幾個名詞
    • 11、Spring事務的實現方式和實現原理
      • Spring事務的種類
      • Spring中的隔離級別
      • Spring事務的傳播屬性
  • MyBatis相關
    • 1、對MyBatis的理解
      • MyBatis的優缺點
      • ORM是什么
      • JDBC編程不足之處,MyBatis如何解決
    • 2、MyBatis編程步驟
      • JDBC 編程步驟
    • 3、MyBatis的工作原理
      • 功能架構
    • 4、DBMS
      • 為什么需要預編譯
    • 5、#{}和${}的區別是什么
    • 6、緩存
    • 7、接口綁定有幾種實現方式
    • 8、 Mybatis 動態 sql

Spring相關

1、對Spring的了解

什么是Spring?
Spring 是個java企業級應用的開源開發框架。Spring主要用來開發Java應用,但是有些擴展是針對構建J2EE平臺的web應用。Spring 框架目標是簡化Java企業級應用開發,并通過POJO為基礎的編程模型促進良好的編程習慣

對Spring的理解
1、Spring是一個開源框架,主要是為簡化企業級應用開發而生。可以實現EJB可以實現的功能,Spring是一個IOC和AOP容器框架。

  • 控制反轉(IOC):Spring容器使用了工廠模式為我們創建了所需要的對
    象,我們使用時不需要自己去創建,直接調用Spring為我們提供的對象即可,這就是控制反轉的思想。
  • 依賴注入(DI):Spring使用Java Bean對象的Set方法或者帶參數的構造方法為我們在創建所需對象時將其屬性自動設置所需要的值的過程就是依賴注入的基本思想。
  • 面向切面編程(AOP):在面向對象編程(OOP)思想中,我們將事物縱向抽象成一個個的對象。而在面向切面編程中,我們將一個個對象某些類似的方面橫向抽象成一個切面,對這個切面進行一些如權限驗證,事物管理,記錄日志等公用操作處理的過程就是面向切面編程的思想。

2、在Spring中,所有管理的都是JavaBean對象,而BeanFactory和ApplicationContext就是Spring框架的那個IOC容器,現在一般使用ApplicationContext,其不但包括了BeanFactory的作用,同時還進行了更多的擴展。

使用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 異常。

Spring的模塊


核心模塊

核心模塊說明
Spring Core核心容器 :提供了Spring框架的基本功能。Spring以Bean的方式組織和管理Java應用中各個組件及其關系,使用BeanFactory生產和管理對象。
SpringContext應用上下文:一個配置文件,向Spring框架提供上下文信息。Spring上下文包括企業服務,如JNDI、EJB、電子郵件、國際化、校驗和調度功能
SpringAop面向切面編程: 是面向對象編程的有效補充和完善,Spring的AOP是基于動態代理實現的,實現的方式有兩種分別是Schema和AspectJ這兩種方式
SpringDaoJDBC和Dao模塊: JDBC、DAO的抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理,和不同數據庫供應商所拋出的錯誤信息。異常層次結構簡化了錯誤處理,并且極大的降低了需要編寫的代碼數量,比如打開和關閉鏈接
SpringORM對象實體映射: Spring框架插入了若干個ORM框架,從而提供了ORM對象的關系工具,其中包括了Hibernate、JDO和 IBatis SQL Map等,所有這些都遵從Spring的通用事物和DAO異常層次結構。
SpringWebWeb模塊: Web上下文模塊建立在應用程序上下文模塊之上,為基于web的應用程序提供了上下文。所以Spring框架支持與Struts集成,web模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作
SpringWebMvcMVC模塊:MVC框架是一個全功能的構建Web應用程序的MVC實現。通過策略接口,MVC框架變成為高度可配置的。MVC容納了大量視圖技術,其中包括JSP、POI等,模型由JavaBean構成,存放于m當中,而視圖是一個接口,負責實現模型,控制器表示邏輯代碼,由c的事情。Spring框架的功能可以用在任何J2EE服務器當中,大多數功能也適用于不受管理的環境。Spring的核心要點就是支持不綁定到特定J2EE服務的可重用業務和數據的訪問的對象,毫無疑問這樣的對象可以在不同的J2EE環境,獨立應用程序和測試環境之間重用

2、Spring使用了哪些設計模式

1、單例模式
2、原型模式
3、工廠模式
4、適配器模式
5、包裝模式
6、代理模式
7、觀察者模式
8、策略模式
9、模板模式

3、什么是Spring-MVC框架

Spring 配備構建Web 應用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反轉把業務對象和控制邏輯清晰地隔離。它也允許以聲明的方式把請求參數和業務對象綁定。

Spring-MVC常用注解

@Controller注解

是在Spring的org.springframework.stereotype包下,org.springframework.stereotype.Controller注解類型用于指示Spring類的實例是一個控制器

使用@Controller注解的類不需要繼承特定的父類或者實現特定的接口,相對之前的版本實現Controller接口變的更加簡單。

而Controller接口的實現類只能處理一個單一的請求動作,而@Controller注解注解的控制器可以同時支持處理多個請求動作,使程序開發變的更加靈活。 @Controller用戶標記一個類,使用它標記的類就是一個Spring MVC Controller對象,即:一個控制器類。Spring使用掃描機制查找應用程序中所有基于注解的控制器類,分發處理器會掃描使用了該注解的方法,并檢測該方法是否使用了@RequestMapping注解,而使用@RequestMapping注解的方法才是真正處理請求的處理器。為了保證Spring能找到控制器,我們需要完成兩件事.
@RequestParam注解

下面來說org.springframework.web.bind.annotation包下的第三個注解,即:@RequestParam注解,該注解類型用于將指定的請求參數賦值給方法中的形參。那么@RequestParam注解有什么屬性呢?它有4種屬性,下面將逐一介紹這四種屬性:

1、name屬性該屬性的類型是String類型,它可以指定請求頭綁定的名稱;
2、value屬性該屬性的類型是String類型,它可以設置是name屬性的別名;
3、required屬性該屬性的類型是boolean類型,它可以設置指定參數是否必須綁定;
4、defalutValue屬性該屬性的類型是String類型,它可以設置如果沒有傳遞參數可以使用默認值。

@PathVaribale注解
下面來說org.springframework.web.bind.annotation包下的第四個注解,即:@PathVaribale注解,該注解類型可以非常方便的獲得請求url中的動態參數。@PathVaribale注解只支持一個屬性value,類型String,表示綁定的名稱,如果省略則默認綁定同名參數。

3、SpringBean

SpringBean的生命周期

1、實例化Bean:
對于BeanFactory容器,當客戶向容器請求一個尚未初始化的bean時,或初始化bean的時候需要注入另一個尚未初始化的依賴時,容器就會調用createBean進行實例化。對于ApplicationContext容器,當容器啟動結束后,通過獲取BeanDefinition對象中的信息,實例化所有的bean。

2、設置對象屬性(依賴注入):
實例化后的對象被封裝在BeanWrapper對象中,緊接著,Spring根據BeanDefinition中的信息 以及 通過BeanWrapper提供的設置屬性的接口完成依賴注入。

3、處理Aware接口:
接著,Spring會檢測該對象是否實現了xxxAware接口,并將相關的xxxAware實例注入給Bean:

  • 如果這個Bean已經實現了BeanNameAware接口,會調用它實現的setBeanName(StringbeanId)方法,此處傳遞的就是Spring配置文件中Bean的id值;
  • 如果這個Bean已經實現了BeanFactoryAware接口,會調用它實現的setBeanFactory()方法,傳遞的是Spring工廠自身。
  • 如果這個Bean已經實現了ApplicationContextAware接口,會調用
    setApplicationContext(ApplicationContext)方法,傳入Spring上下文;

4、BeanPostProcessor:
如果想對Bean進行一些自定義的處理,那么可以讓Bean實現了BeanPostProcessor接口,那將會調用postProcessBeforeInitialization(Object obj, String s)方法。由于這個方法是在Bean初始化結束時調用的,所以可以被應用于內存或緩存技術;
5、InitializingBean 與 init-method:
如果Bean在Spring配置文件中配置了 init-method 屬性,則會自動調用其配置的初始化方法。

6、 如果這個Bean實現了BeanPostProcessor接口,將會調用
postProcessAfterInitialization(Object obj, String s)方法;以上幾個步驟完成后,Bean就已經被正確創建了,之后就可以使用這個Bean

7、DisposableBean:
當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個接口,會調用其實現的destroy()方法;
8、destroy-method:
最后,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷毀方法。

BeanFactory和ApplicationContext有什么區別

BeanFactory是ApplicationContext接口的父接口

BeanFactory

是spring中比較原始的Factory。如XMLBeanFactory就是一種典型的BeanFactory。原始的BeanFactory無法支持spring的許多插件,如AOP功能、Web應用等。

ApplicationContext

ApplicationContext接口是由BeanFactory接口派生而來,因而具有BeanFactory所有的功能。
ApplicationContext以一種更向面向框架的方式工作以及對上下文進行分層和實現繼承,
ApplicationContext包還提供了以下的功能:

  • MessageSource, 提供國際化的消息訪問
  • 資源訪問,如URL和文件
  • 事件傳播
  • 載入多個(有繼承關系)上下文 ,使得每一個上下文都專注于一個特定的層次,比如應用的web層.
  • Spring框架中的單例bean是線程安全的嗎

    肯定不是線程安全的,當多用戶同時請求一個服務時,容器會給每一個請求分配一個線程,這是多個線程會并發執行該請求多對應的業務邏輯(成員方法),此時就要注意了,如果該處理邏輯中有對該單列狀態的修改(體現為該單列的成員屬性),則必須考慮線程同步問題.

    Spring框架并沒有對單例bean進行任何多線程的封裝處理。關于單例bean的線程安全和并發問題需要開發者自行去搞定。但實際上,大部分的Spring bean并沒有可變的狀態(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態的話(比如 View Model對象),就需要自行保證線程安全。最淺顯的解決辦法就是將多態bean的作用域由“singleton”變更為“prototype”。

    Spring如何處理線程并發問題

    在一般情況下,只有無狀態的Bean才可以在多線程環境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域,因為Spring對一些Bean中非線程安全狀態采用ThreadLocal進行處理,解決線程安全問題。

    ThreadLocal和線程同步機制都是為了解決多線程中相同變量的訪問沖突問題。同步機制采用了“時間換空間”的方式,僅提供一份變量,不同的線程在訪問前需要獲取鎖,沒獲得鎖的線程則需要排隊。而ThreadLocal采用了“空間換時間”的方式。

    ThreadLocal會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。

    什么是Spring的內部bean

    當一個bean僅被用作另一個bean的屬性時,它能被聲明為一個內部bean,為了定義inner bean,在Spring 的 基于XML的 配置元數據中,可以在 或\ 元素內使用 元素,內部bean通常是匿名的,它們的Scope一般是prototype。

    一般寫法

    <?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="CustomerBean" class="com.dpb.common.Customer"><property name="person" ref="PersonBean"/></bean><bean id="PersonBean" class="com.domain.common.Person"><property name="name" value="阿三"/><property name="address" value="陜西"/><property name="age" value="18"/></bean> </beans>

    改為內部bean

    <?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="CustomerBean" class="com.domain.common.Customer"><property name="person"><bean class="com.domain.common.Person"><property name="name" value="阿三"/><property name="address" value="陜西"/><property name="age" value="18"/></bean></property></bean> </beans>

    內部 bean 也支持構造器注入

    <?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="CustomerBean" class="com.dpb.common.Customer"><constructor-arg ><bean class="com.domain.common.Person"><property name="name" value="阿三"/><property name="address" value="陜西"/><property name="age" value="18"/></bean></constructor-arg></bean> </beans>

    id 或 name 值在bean類是沒有必要以一個內部 bean 呈現

    Spring Bean 有哪些作用域

    singleton :這種 bean 范圍是默認的,這種范圍確保不管接受到多少個請求,每個容器中只有一個bean 的實例,單例的模式由 bean factory 自身來維護 。

    prototype :原形范圍與單例范圍相反,為每一個 bean 請求提供一個實例 。

    request :在請求 bean 范圍內會每一個來自客戶端的網絡請求創建一個實例,在請求完成以后, bean會失效并被垃圾回收器回收 。

    Session :與請求范圍類似,確保每個 session 中有一個 bean 的實例,在 session 過期后, bean 會隨之失效 。global-session : global-session 和 Portlet 應用相關 。 當你的應用部署在 Portlet 容器中工作時,它包含很多 portlet。 如果你想要聲明讓所有的 portlet 共用全局的存儲變量的話,那么這全局變量需要存儲在 global-session 中

    4、Spring 框架有哪些自動裝配模式

    no :這是 Spring 框架的默認設置,在該設置下自動裝配是關閉的,開發者需要自行在 bean 定義中用標簽明確的設置依賴關系 。

    byName :該選項可以根據 bean 名稱設置依賴關系 。 當向一個 bean 中自動裝配一個屬性時,容器將根據 bean 的名稱自動在在配置文件中查詢一個匹配的 bean。 如果找到的話,就裝配這個屬性,如果沒找到的話就報錯 。

    byType :該選項可以根據 bean 類型設置依賴關系 。 當向一個 bean 中自動裝配一個屬性時,容器將根據 bean 的類型自動在在配置文件中查詢一個匹配的 bean。 如果找到的話,就裝配這個屬性,如果沒找到的話就報錯 。

    constructor :構造器的自動裝配和 byType 模式類似,但是僅僅適用于與有構造器相同參數的 bean,如果在容器中沒有找到與構造器參數類型一致的 bean ,那么將會拋出異常 。

    autodetect :該模式自動探測使用構造器自動裝配或者 byType 自動裝配 。 首先,首先會嘗試找合適的帶參數的構造器,如果找到的話就是用構造器自動裝配,如果在 bean 內部沒有找到相應的構造器或者是無參構造器,容器就會自動選擇 byTpe 的自動裝配方式 。

    5、SpringMVC執行流程


    1、用戶發送出請求到前端控制器DispatcherServlet。
    2、DispatcherServlet收到請求調用HandlerMapping(處理器映射器)。
    3、HandlerMapping找到具體的處理器(可查找xml配置或注解配置),生成處理器對象及處理器攔截器(如果有),再一起返回給DispatcherServlet。
    4、DispatcherServlet調用HandlerAdapter(處理器適配器)。
    5、HandlerAdapter經過適配調用具體的處理器(Handler/Controller)。
    6、Controller執行完成返回ModelAndView對象。
    7、HandlerAdapter將Controller執行結果ModelAndView返回給DispatcherServlet。
    8、DispatcherServlet將ModelAndView傳給ViewReslover(視圖解析器)。
    9、ViewReslover解析后返回具體View(視圖)。
    10、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。
    11、DispatcherServlet響應用戶。

    6、一些常用注解的區別

    @Component:這將 java 類標記為 bean。它是任何 Spring 管理組件的通用構造型。spring 的組件掃
    描機制現在可以將其拾取并將其拉入應用程序環境中。
    @Controller:這將一個類標記為 Spring Web MVC 控制器。標有它的 Bean 會自動導入到 IoC 容器
    中。
    @Service:此注解是組件注解的特化。它不會對 @Component 注解提供任何其他行為。您可以在服務
    層類中使用 @Service 而不是 @Component,因為它以更好的方式指定了意圖。
    @Repository:這個注解是具有類似用途和功能的 @Component 注解的特化。它為 DAO 提供了額外的好處。它將 DAO 導入 IoC 容器,并使未經檢查的異常有資格轉換為 Spring DataAccessException
    @Autowired
    通過類型來實現自動注入bean。和@Qualifier注解配合使用可以實現根據name注入bean。
    @Qualifier
    和@Autowired一塊使用,在同一類型的bean有多個的情況下可以實現根據name注入的需求
    @Resource
    默認是根據name注入bean的,可以通過設置類型來實現通過類型來注入

    @Autowire和@Resource區別

    對比項@Autowire@Resource
    注解來源Spring注解JDK注解
    裝配方式優先按照類型優先按照名稱
    屬性requiredname,type
    作用范圍字段,setter方法,構造器字段,setter方法

    7、SpringMVC中的攔截器和Servlet的過濾器區別

    首先最核心的一點他們的攔截側重點是不同的,SpringMVC中的攔截器是依賴JDK的反射實現的,SpringMVC的攔截器主要是進行攔截請求,通過對Handler進行處理的時候進行攔截,先聲明的攔截器中的preHandle方法會先執行,然而它的postHandle方法(他是介于處理完業務之后和返回結果之前)和afterCompletion方法卻會后執行。并且Spring的攔截器是按照配置的先后順序進行攔截的。而Servlet的filter是基于函數回調實現的過濾器,Filter主要是針對URL地址做一個編碼的事情、過濾掉沒用的參數、安全校驗(比較泛的,比如登錄不登錄之類)

    8、Spring加載流程

    初始化環境—>加載配置文件—>實例化Bean—>調用Bean顯示信息

    9、Spring的IOC理解

    1、IOC就是控制反轉,是指創建對象的控制權的轉移,以前創建對象的主動權和時機是由自己把控的,而現在這種權力轉移到Spring容器中,并由容器根據配置文件去創建實例和管理各個實例之間的依賴關系,對象與對象之間松散耦合,也利于功能的復用。DI依賴注入,和控制反轉是同一個概念的不同角度的描述,即 應用程序在運行時依賴IoC容器來動態注入對象需要的外部資源。

    2、最直觀的表達就是,IOC讓對象的創建不用去new了,可以由spring自動生產,使用java的反射機制,根據配置文件在運行時動態的去創建對象以及管理對象,并調用對象的方法的。

    3、Spring的IOC有三種注入方式 :構造器注入、setter方法注入、根據注解注入。
    IoC讓相互協作的組件保持松散的耦合,而AOP編程允許你把遍布于應用各層的功能分離出來形成可重用的功能組件。

    IOC的實現原理

    就是工廠模式加反射機制

    Spring通知有哪些類型

    1、前置通知(Before advice):在某連接點(join point)之前執行的通知,但這個通知不能阻止連接點前的執行(除非它拋出一個異常)。
    2、返回后通知(After returning advice):在某連接點(join point)正常完成后執行的通知:例如,一個方法沒有拋出任何異常,正常返回。
    3、拋出異常后通知(After throwing advice):在方法拋出異常退出時執行的通知。
    4、后通知(After (finally) advice):當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。
    5、環繞通知(Around Advice):包圍一個連接點(join point)的通知,如方法調用。這是最強大的一種通知類型。 環繞通知可以在方法調用前后完成自定義的行為。它也會選擇是否繼續執行連接點或直接返回它們自己的返回值或拋出異常來結束執行。 環繞通知是最常用的一種通知類型。大部分基于攔截的AOP框架,例如Nanning和JBoss4,都只提供環繞通知。

    10、SpringAop 實現原理

    AOP(Aspect-OrientedProgramming,面向方面編程):是OOP的補充和完善。OOP引入了封裝、繼承、多態性等建立一種對象層次結構(從上到下的關系)。當需要為分散的對象引入公共行為的時候(從左到右的關系),OOP就顯得無能為力。例如:日志功能。日志代碼往往水平的散步所有對象層次中,與對象的核心功能毫無關系。這種代碼被稱為橫切(cross-cutting)代碼還有像安全性、異常處理、透明的持續性等都稱為橫切代碼。在OOP設計中,它們導致了大量代碼的重復,不利于模塊的重用。
    AOP與OOP相反,利用“橫切”技術將影響多個類的公共行為封裝到一個可重用模塊,稱為Aspect。簡單點,就是將那些與業務無關,卻被業務模塊所共同調用的邏輯封裝起來,便于減少系統的重復代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護性。AOP的核心思想就是“將應用程序中的商業邏輯同對其提供支持的通用服務進行分離。” Spring提供了兩種方式生成代理對象:JDKProxy和Cglib具體使用哪種方式生成由AopProxyFactory根據AdvisedSupport對象的配置來決定。默認的策略是如果目標
    類是接口,則使用JDK動態代理技術,否則使用Cglib來生成代理。

    Spring AOP里面的幾個名詞

    1、切面(Aspect):被抽取的公共模塊,可能會橫切多個對象。 在Spring AOP中,切面可以使用通用類(基于模式的風格) 或者在普通類中以 @AspectJ 注解來實現。

    2、連接點(Join point):指方法,在Spring AOP中,一個連接點 總是 代表一個方法的執行。

    3、通知(Advice):在切面的某個特定的連接點(Join point)上執行的動作。通知有各種類型,其中包括“around”、“before”和“after”等通知。許多AOP框架,包括Spring,都是以攔截器做通知模型, 并維護一個以連接點為中心的攔截器鏈。

    4、切入點(Pointcut):切入點是指 我們要對哪些Join point進行攔截的定義。通過切入點表達式,指定攔截的方法,比如指定攔截add、search。

    5、引入(Introduction):(也被稱為內部類型聲明(inter-type declaration))。聲明額外的方法或者某個類型的字段。Spring允許引入新的接口(以及一個對應的實現)到任何被代理的對象。例如,你可以使用一個引入來使bean實現 IsModified 接口,以便簡化緩存機制。

    6、目標對象(Target Object): 被一個或者多個切面(aspect)所通知(advise)的對象。也有人把它叫做 被通知(adviced) 對象。 既然Spring AOP是通過運行時代理實現的,這個對象永遠是一個 被代理(proxied) 對象。

    7、織入(Weaving):指把增強應用到目標對象來創建新的代理對象的過程。Spring是在運行時完成織入。

    切入點(pointcut)和連接點(join point)匹配的概念是AOP的關鍵,這使得AOP不同于其它僅僅提供攔截功能的舊技術。 切入點使得定位通知(advice)可獨立于OO層次。 例如,一個提供聲明式事務管理的around通知可以被應用到一組橫跨多個對象中的方法上(例如服務層的所有業務操作)。

    11、Spring事務的實現方式和實現原理

    Spring事務的種類

    • 編程式事務管理使用TransactionTemplate。
    • 聲明式事務管理建立在AOP之上的。其本質是通過AOP功能,對方法前后進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務。
      聲明式事務最大的優點就是不需要在業務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規則聲明或通過@Transactional注解的方式,便可以將事務規則應用到業務邏輯中。聲明式事務管理要優于編程式事務管理,這正是spring倡導的非侵入式的開發方式,使業務代碼不受污染,只要加上注解就可以獲得完全的事務支持。唯一不足地方是,最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別。

    Spring中的隔離級別

    • ISOLATION_DEFAULT:這是個 PlatfromTransactionManager 默認的隔離級別,使用數據庫默認的事務隔離級別。

    • ISOLATION_READ_UNCOMMITTED:讀未提交,允許另外一個事務可以看到這個事務未提交的數據。

    • ISOLATION_READ_COMMITTED:讀已提交,保證一個事務修改的數據提交后才能被另一事務讀取,而且能看到該事務對已有記錄的更新。

    • ISOLATION_REPEATABLE_READ:可重復讀,保證一個事務修改的數據提交后才能被另一事務讀取,但是不能看到該事務對已有記錄的更新。

    • ISOLATION_SERIALIZABLE:一個事務在執行的過程中完全看不到其他事務對數據庫所做的更新

    Spring事務的傳播屬性

    1、PROPAGATION_REQUIRED,那么由于執行ServiceA.methodA的時候,ServiceA.methodA已經起了事務,這時調用ServiceB.methodB,ServiceB.methodB看到自己已經運行在ServiceA.methodA的事務內部,就不再起新的事務。而假如ServiceA.methodA運行的時候發現自己沒有在事務中,他就會為自己分配一個事務。這樣,在ServiceA.methodA或者在ServiceB.methodB內的任何地方出現異常,事務都
    會被回滾。即使ServiceB.methodB的事務已經被提交,但是ServiceA.methodA在接下來fail要回滾,ServiceB.methodB也要回滾。

    2、PROPAGATION_SUPPORTS —— 支持當前事務,如果當前沒有事務,就以非事務方式執行。

    3、PROPAGATION_MANDATORY ——支持當前事務,如果當前沒有事務,就拋出異常。

    4、PROPAGATION_REQUIRES_NEW ——支持當前事務,如果當前沒有事務,就將當前事務掛起。如ServiceA.methodA的事務級別為PROPAGATION_REQUIRED,ServiceB.methodB的事務級別為PROPAGATION_REQUIRES_NEW,那么當執行到ServiceB.methodB的時候,ServiceA.methodA所在的事務就會掛起,ServiceB.methodB會起一個新的事務,等待ServiceB.methodB的事務完成以后,A
    才繼續執行。他與PROPAGATION_REQUIRED的事務區別在于事務的回滾程度了。因為ServiceB.methodB是新起一個事務,那么就是存在兩個不同的事務。如果ServiceB.methodB已經提交,那么ServiceA.methodA失敗回滾,ServiceB.methodB是不會回滾的。如果ServiceB.methodB失敗回滾,如果他拋出的異常被ServiceA.methodA捕獲,ServiceA.methodA事務仍然可能提交。

    5、PROPAGATION_NOT_SUPPORTED —— 以非事務方式執行當前操作,如果當前存在事務,就把事務掛起來。 /

    6、PROPAGATION_NEVER —— 以非事務方式執行,如果當前存在事務,則拋異常。

    7、PROPAGATION_NESTED—— 如果當前存在事務,則在嵌套事務內執行,關鍵是savepoint。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。與PROPAGATION_REQUIRES_NEW的區別是NESTED的事務和他的父事務是相依的,它的提交是要等父事務一塊提交。也就是說,如果父事務最后回滾,它也要回滾。

    MyBatis相關

    1、對MyBatis的理解

    1、Mybatis是一個半ORM(對象關系映射)框架,它內部封裝了JDBC,開發時只需要關注SQL語句本身,不需要花費精力去處理加載驅動、創建連接、創建statement等繁雜的過程。程序員直接編寫原生態sql,可以嚴格控制sql執行性能,靈活度高。

    2、MyBatis 可以使用 XML 或注解來配置和映射原生信息,將 POJO映射成數據庫中的記錄,避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。

    3、通過xml 文件或注解的方式將要執行的各種 statement 配置起來,并通過java對象和 statement中sql的動態參數進行映射生成最終執行的sql語句,最后由mybatis框架執行sql并將結果映射為java對象并返回。(從執行sql到返回result的過程)。

    MyBatis的優缺點

    優點

    1、基于SQL語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL寫在XML里,解除sql與程序代碼的耦合,便于統一管理;提供XML標簽,支持編寫動態SQL語句,并可重用。

    2、與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗余的代碼,不需要手動開關連接;

    3、很好的與各種數據庫兼容(因為MyBatis使用JDBC來連接數據庫,所以只要JDBC支持的數據庫MyBatis都支持)。

    4、能夠與Spring很好的集成;

    5、提供映射標簽,支持對象與數據庫的ORM字段關系映射;提供對象關系映射標簽,支持對象關系組件維護。

    缺點

    1、SQL語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL語句的功底有一定要求。

    2、SQL語句依賴于數據庫,導致數據庫移植性差,不能隨意更換數據庫

    ORM是什么

    ORM(Object Relational Mapping),對象關系映射,是一種為了解決關系型數據庫數據與簡單Java對象(POJO)的映射關系的技術。簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關系型數據庫中。

    JDBC編程不足之處,MyBatis如何解決

    1、數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫連接池可解決此問題。

    • 解決:在mybatis-config.xml中配置數據鏈接池,使用連接池管理數據庫連接。

    2、Sql語句寫在代碼中造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java代碼。

    • 解決:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。

    3、向sql語句傳參數麻煩,因為sql語句的where條件不一定,可能多也可能少,占位符需要和參數一一對應。

    • 解決: Mybatis自動將java對象映射至sql語句。

    4、對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果能將數據庫記錄封裝成pojo對象解析比較方便。

    • 解決:Mybatis自動將sql執行結果映射至java對象。

    2、MyBatis編程步驟

    1、 創建SqlSessionFactory
    2、 通過SqlSessionFactory創建SqlSession
    3、 通過sqlsession執行數據庫操作
    4、 調用session.commit()提交事務
    5、 調用session.close()關閉會話

    JDBC 編程步驟

    1、加載數據庫驅動
    2、創建數據庫鏈接
    3、創建預處理對象
    4、執行Sql語句
    5、返回結果集處理
    6、關閉資源

    3、MyBatis的工作原理

    1、讀取 MyBatis 配置文件:mybatis-config.xml 為 MyBatis 的全局配置文件,配置了 MyBatis 的運行環境等信息,例如數據庫連接信息。

    2、加載映射文件。映射文件即 SQL 映射文件,該文件中配置了操作數據庫的 SQL 語句,需要在MyBatis 配置文件 mybatis-config.xml 中加載。mybatis-config.xml 文件可以加載多個映射文件,每個文件對應數據庫中的一張表。

    3、構造會話工廠:通過 MyBatis 的環境等配置信息構建會話工廠 SqlSessionFactory。

    4、創建會話對象:由會話工廠創建 SqlSession 對象,該對象中包含了執行 SQL 語句的所有方法。

    5、Executor 執行器:MyBatis 底層定義了一個 Executor 接口來操作數據庫,它將根據 SqlSession 傳遞的參數動態地生成需要執行的 SQL 語句,同時負責查詢緩存的維護。

    6、MappedStatement 對象:在 Executor 接口的執行方法中有一個 MappedStatement 類型的參數,該參數是對映射信息的封裝,用于存儲要映射的 SQL 語句的 id、參數等信息。

    7、輸入參數映射:輸入參數類型可以是 Map、List 等集合類型,也可以是基本數據類型和 POJO 類型。輸入參數映射過程類似于 JDBC 對 preparedStatement 對象設置參
    數的過程。

    8、輸出結果映射:輸出結果類型可以是 Map、 List 等集合類型,也可以是基本數據類型和 POJO 類型。輸出結果映射過程類似于 JDBC 對結果集的解析過程。

    功能架構

    • API接口層:提供給外部使用的接口API,開發人員通過這些本地API來操縱數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。
    • 數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操作。
    • 基礎支撐層:負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎的組件。為上層的數據處理層提供最基礎的支撐。

    4、DBMS

    數據庫管理系統(database management system)是一種操縱和管理數據庫的大型軟件,用于建立、使用和維護數zd據庫,簡稱dbms。它對數據庫進行統一的管理和控制,以保證數據庫的安全性和完整性。用戶通過dbms訪問數據庫中的數據,數據庫管理員也通過dbms進行數據庫的維護工作。它可使多個應用程序和用戶用不同的方法在同時版或不同時刻去建立,修改和詢問數據庫。DBMS提供數據定義語言DDL(Data Definition Language)與數據操作語言DML(Data Manipulation Language),供用
    戶定義數據庫的模式結構與權限約束,實現對數據的追加權、刪除等操作。

    為什么需要預編譯

    定義:
    SQL 預編譯指的是數據庫驅動在發送 SQL 語句和參數給 DBMS 之前對 SQL 語句進行編譯,這樣DBMS 執行 SQL 時,就不需要重新編譯。
    為什么需要預編譯
    JDBC 中使用對象 PreparedStatement 來抽象預編譯語句,使用預編譯。預編譯階段可以優化SQL 的執行。預編譯之后的 SQL 多數情況下可以直接執行,DBMS 不需要再次編譯,越復雜的SQL,編譯的復雜度將越大,預編譯階段可以合并多次操作為一個操作。同時預編譯語句對象可以重復利用。把一個 SQL 預編譯后產生的 PreparedStatement 對象緩存下來,下次對于同一個SQL,可以直接使用這個緩存的 PreparedState 對象。Mybatis默認情況下,將對所有的 SQL 進行預編譯。
    還有一個重要的原因,防止SQL注入

    5、#{}和${}的區別是什么

    • #{} 是預編譯處理
    • $ {} 是字符串替換。
      Mybatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值;Mybatis在處理時,就是把{}時,就是把時,就是把{}替換成變量的值。使用#{}可以有效的防止SQL注入,提高系統安全性。

    6、緩存

    1)一級緩存: 基于 PerpetualCache 的 HashMap 本地緩存,其存儲作用域為 Session,當 Session flush 或 close 之后,該 Session 中的所有 Cache 就將清空,默認打開一級緩存。

    2)二級緩存與一級緩存其機制相同,默認也是采用 PerpetualCache,HashMap 存儲,不同在于其存儲作用域為 Mapper(Namespace),并且可自定義存儲源,如 Ehcache。默認不打開二級緩存,要開啟二級緩存,使用二級緩存屬性類需要實現Serializable序列化接口(可用來保存對象的狀態),可在它的映射文件中配置 ;

    3)對于緩存數據更新機制,當某一個作用域(一級緩存 Session/二級緩存Namespaces)的進行了C/U/D操作后,默認該作用域下所有 select 中的緩存將被 clear。

    7、接口綁定有幾種實現方式

    接口綁定有兩種實現方式

    • 一種是通過注解綁定,就是在接口的方法上面加上@Select@Update 等注解里面包含 Sql 語句來綁定
    • 另外一種就是通過 xml 里面寫 SQL 來綁定,在這種情況下,要指定 xml 映射文件里面的 namespace 必須為接口的全路徑名.
      什么情況下用注解綁定,什么情況下用 xml 綁定?
      當 Sql 語句比較簡單時候,用注解綁定;當 SQL 語句比較復雜時候,用 xml 綁定,一般用
      xml 綁定的比較多

    8、 Mybatis 動態 sql

    1、Mybatis 動態 sql 可以讓我們在 Xml 映射文件內,以標簽的形式編寫動態 sql,完成邏輯判斷和動態拼接 sql 的功能。

    2、Mybatis 提供了 9 種動態 sql 標簽:
    trim、where、set、foreach、if、choose、when、otherwise、bind。

    3、其執行原理為,使用 OGNL 從 sql 參數對象中計算表達式的值,根據表達式的值動態拼接 sql,以此來完成動態 sql 的功能。

    總結

    以上是生活随笔為你收集整理的SSM框架面试题整理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。