AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

81道SSM經典面試題總結

來源: 責編: 時間:2024-04-15 18:15:13 151觀看
導讀1、簡述一下Spring IOC和AOP(1)Spring IOCIOC是指將對象的創建和依賴關系的管理交給Spring容器來處理。IOC控制反轉通常通過依賴注入來實現,這可以通過XML配置或者注解來完成。IOC可以幫助開發者減少代碼的復雜性,提高模

Apo28資訊網——每日最新資訊28at.com

1、簡述一下Spring IOC和AOP

(1)Spring IOC

IOC是指將對象的創建和依賴關系的管理交給Spring容器來處理。Apo28資訊網——每日最新資訊28at.com

IOC控制反轉通常通過依賴注入來實現,這可以通過XML配置或者注解來完成。Apo28資訊網——每日最新資訊28at.com

IOC可以幫助開發者減少代碼的復雜性,提高模塊之間的解耦,使得代碼更加靈活和可維護。Apo28資訊網——每日最新資訊28at.com

(2)Spring AOP

AOP允許開發者將橫切關注點(如日志、事務管理等)與業務邏輯分離,從而提供更好的模塊化。Apo28資訊網——每日最新資訊28at.com

在Spring中,AOP可以通過動態代理或者字節碼操作來實現,常用的是動態代理。Apo28資訊網——每日最新資訊28at.com

AOP可以提高代碼的重用性,使得橫切關注點的修改更加集中和方便。Apo28資訊網——每日最新資訊28at.com

2、簡述一下Spring IOC的工作流程

  • 加載配置文件:Spring容器啟動時,會加載xml配置文件,并解析其中的bean定義;
  • 實例化bean:根據bean定義,spring會創建bean的實例;
  • 依賴注入:Spring容器會根據bean定義中的依賴關系,將依賴的bean注入到當前bean中。
  • 調用初始化方法:如果bean實現了InitializingBean接口或者在bean定義中配置了init-method屬性,Spring容器會調用相應的初始化方法。
  • 發布事件:如果bean實現了ApplicationListener接口或者在bean定義中配置了監聽的事件,Spring容器會發布相應的事件。
  • 調用銷毀方法:如果bean實現了DisposableBean接口或者在bean定義中配置了destroy-method屬性,Spring容器會在容器關閉時調用相應的銷毀方法。

3、簡述一下Spring AOP的工作流程?

Spring AOP(Aspect Oriented Programming)的工作流程主要涉及到面向切面編程的核心概念,如切面、連接點和通知等。以下是Spring AOP的基本工作流程:Apo28資訊網——每日最新資訊28at.com

  • 定義切面:切面是織入到目標類中的功能代碼,通常包括前置通知、后置通知、環繞通知、異常通知和最終通知等。這些通知可以根據業務需求進行自定義實現。
  • 確定連接點:連接點表示切面將會被織入到目標對象的哪個位置。在Java中,這通常是某個方法的執行點或者某個構造器的創建點。
  • 配置切入點:切入點是連接點的子集,用于更精確地定義哪些連接點需要被織入切面代碼。
  • 讀取切面配置:在Spring容器啟動時,會讀取所有的切面配置,包括切入點的配置。
  • 初始化bean:在bean初始化過程中,Spring會檢查bean對應的類中的方法是否匹配到任意切入點。如果匹配成功,則會在該方法上織入相應的切面代碼。
  • 代理對象創建:Spring AOP通過動態代理技術(如JDK動態代理或CGLIB代理)為目標對象創建代理對象。代理對象會攔截對目標方法的調用,并根據需要執行相應的通知代碼。
  • 方法調用:當應用程序調用代理對象的方法時,實際上會觸發AOP框架的執行流程。首先,會執行前置通知(如果有的話),然后調用目標方法,接著執行后置通知(如果有的話)。在方法執行過程中,如果出現異常,會執行異常通知。最后,執行最終通知(如果有的話)。
  • 通過這個工作流程,Spring AOP能夠在不修改原有業務代碼的前提下,對多個目標對象進行統一管理,并增加額外的功能,如日志記錄、事務管理、權限驗證等。這使得代碼更加模塊化、可維護,并提高了系統的靈活性和可擴展性。

4、Spring AOP 和 AspectJ AOP 有什么區別?

Spring AOP 是 Spring Framework 提供的一種 AOP 實現方式,是基于動態代理實現的。它允許在方法調用前、方法調用后、拋出異常時等切點進行切入通知,并通過動態代理技術織入切面。Spring AOP 只能在方法級別上生效。Apo28資訊網——每日最新資訊28at.com

AspectJ AOP 是一個獨立的 AOP 框架, 是基于字節碼操作實現的。它提供了比 Spring AOP 更為強大和靈活的 AOP 功能。AspectJ 可以在方法調用前、方法調用后、拋出異常時等切點進行切入通知,并且還支持構造器、字段、對象初始化和異常處理等更多切點。AspectJ 可以通過編譯器織入(AspectJ編譯器),也可以使用代理織入(在運行時為目標對象創建代理,稱為 Spring AOP 的 AspectJ 代理模式)。Apo28資訊網——每日最新資訊28at.com

簡而言之,如果需要更強大的功能和更好的性能,可以選擇使用 AspectJ AOP;如果只需要簡單的切面編程并且希望保持代碼的簡單性,可以選擇使用 Spring AOP。Apo28資訊網——每日最新資訊28at.com

5、Spring AOP有哪些應用場景?

  • 日志記錄:可以使用AOP在方法執行前、執行后或者拋出異常時記錄方法的執行日志,包括方法的入參、返回值、執行時間等信息。
  • 事務管理:通過AOP實現聲明式事務管理,對事務的開啟、提交、回滾等進行統一管理,提高事務控制的簡潔性和可維護性。
  • 安全檢查:AOP可以用于在方法調用前進行安全性檢查,例如對用戶權限的驗證或者身份認證。
  • 性能監控:利用AOP可以在方法執行前后統計方法的執行時間、調用頻率等信息,用于性能監控和分析。
  • 異常處理:AOP可以用于捕獲方法執行過程中拋出的異常,并進行統一的處理、記錄或通知。
  • 緩存控制:通過AOP可以實現對方法的返回值進行緩存,從而提高系統的性能。
  • 參數校驗和轉換:Spring AOP可以在方法調用前對方法的參數進行校驗和轉換,以確保參數的有效性和符合業務要求。這有助于減少因參數錯誤導致的異常和錯誤。
  • 事件驅動編程:AOP可以用于實現事件發布和訂閱機制,實現事件驅動編程。

6、Spring AOP的兩種代理方式

Spring AOP 提供了兩種代理方式:JDK 動態代理和 CGLIB 動態代理。Apo28資訊網——每日最新資訊28at.com

(1)JDK 動態代理

基于接口的代理,要求目標類實現一個接口,通過接口生成代理對象。這種方式的優點是性能較好,但缺點是只能代理接口,不能代理類。Apo28資訊網——每日最新資訊28at.com

(2)CGLIB 動態代理

基于類的代理,不要求目標類實現接口,直接對類進行代理。這種方式的優點是可以代理類和接口,但缺點是性能相對較差。Apo28資訊網——每日最新資訊28at.com

7、JDK動態代理有什么優點和缺點?

(1)優點:

相對于 CGLIB 動態代理,JDK 動態代理的性能較好,因為它是基于接口的代理,生成的代理類較少,使用起來比較簡單,運行時開銷較小。Apo28資訊網——每日最新資訊28at.com

(2)缺點:

  • 只能代理接口:JDK 動態代理要求目標類必須實現一個接口,不能直接代理類。這限制了它的使用范圍,對于沒有實現接口的類,無法使用 JDK 動態代理。
  • 代理類有限:JDK 動態代理生成的代理類數量有限,當目標類實現多個接口時,會為每個接口生成一個代理類,可能導致生成大量的代理類。
  • 不支持類成員代理:JDK 動態代理無法對類的成員變量進行代理,只能在方法調用時進行攔截處理。

8、CGLIB 動態代理是如何工作的?

  • 創建子類:CGLIB 動態代理通過創建目標類的子類來實現代理。當目標類沒有實現接口或者無法使用 JDK 動態代理時,CGLIB 會創建一個目標類的子類,并覆寫其中的方法。
  • 覆寫方法:在子類中覆寫目標類的方法,這使得在目標方法被調用時,可以先執行相應的增強邏輯。
  • 代理對象的創建:CGLIB 動態代理通過創建目標類的子類對象來實現代理。這個生成的子類對象就是代理對象,當調用代理對象的方法時,代理對象會委派給增強邏輯。

與 JDK 動態代理相比,CGLIB 動態代理不要求目標類必須實現接口,因此更加靈活,但代理對象的創建過程相對更為耗時。Apo28資訊網——每日最新資訊28at.com

9、Spring依賴注入是如何實現的?

Spring的依賴注入(Dependency Injection,簡稱DI)是通過Java的反射機制實現的。在Spring中,你可以使用XML配置文件或注解的方式,定義Bean之間的依賴關系,然后由Spring容器在運行時將這些依賴關系注入到相應的Bean中。Apo28資訊網——每日最新資訊28at.com

  • 構造器注入:通過在類的構造函數中傳入依賴對象,實現依賴注入。
  • Setter 方法注入:通過調用類的 Setter 方法設置依賴對象,實現依賴注入。
  • 注解注入:Spring 3.0以后引入了注解(Annotation),通過@Autowired,@Resource等注解可以實現自動裝配,Spring可以智能地自動裝配可以匹配的Bean。

在所有這些方式中,Spring都使用了Java的反射機制來動態地創建Bean的實例,并設置其屬性或調用其構造函數。反射機制允許Spring在運行時獲取類的信息,包括類的構造函數、方法、屬性等,然后根據配置信息動態地創建和配置Bean。Apo28資訊網——每日最新資訊28at.com

10、Spring有哪些重要的模塊?

  • Spring Core Container:Spring核心容器,包括BeanFactory和ApplicationContext。它們提供了依賴注入和面向切面編程(AOP)功能,以及對不同應用層(如Web應用或基于數據的應用)的支持。
  • Spring AOP:Spring的面向切面編程(AOP)模塊,提供了將橫切關注點(如日志、性能監控、事務管理等)從業務邏輯中分離出來的功能。
  • Spring ORM:Spring對各種ORM(對象關系映射)框架的支持,包括JDBC、Hibernate、JPA、MyBatis等。這個模塊提供了在Spring應用中集成持久化框架的功能。
  • Spring Web:Spring Web模塊包括Spring MVC和其他與Web開發相關的工具和類。Spring MVC是Spring框架的Web應用程序開發框架,用于構建靈活的Web應用程序。
  • 數據訪問與集成:提供與數據庫交互的工具和庫,包括JDBC、ORM、OXM、JMS等。
  • Spring Test:提供了對單元測試和集成測試的支持,包括對Junit和TestNG的集成。
  • Transaction Management事務管理:提供了事務管理的解決方案,可以方便地實現聲明式事務管理。
  • Security安全:提供了一套完整的安全框架,包括認證、授權、攻擊防護等。

11、Spring 有幾種配置方式?

(1)XML配置

通過編寫 XML 文件來配置 Spring 應用程序的組件、依賴項和行為。Apo28資訊網——每日最新資訊28at.com

(2)注解配置

使用注解(如 @Component, @Autowired, @Configuration 等)來配置應用程序的部分或全部組件,以及它們之間的依賴關系Apo28資訊網——每日最新資訊28at.com

(3)Java 配置

使用純 Java 代碼配置 Spring 應用程序的組件、依賴項和行為,不需要 XML 文件。通常使用 @Configuration 和 @Bean 注解來實現。Apo28資訊網——每日最新資訊28at.com

12、請解釋 Spring Bean 的生命周期?

  • 加載配置文件:Spring容器加載配置文件,解析配置信息。
  • 實例化Bean:根據配置文件中定義的Bean,Spring容器實例化Bean。
  • 設置Bean屬性:Spring容器為實例化的Bean注入屬性值。
  • BeanPostProcessor的前置處理(postProcessBeforeInitialization):如果Bean實現了BeanPostProcessor接口,Spring容器將在初始化方法調用之前調用postProcessBeforeInitialization方法。
  • 初始化Bean:如果Bean實現了InitializingBean接口,Spring容器將調用其afterPropertiesSet()方法進行初始化。如果在配置文件中通過init-method指定了初始化方法,Spring容器將調用指定的初始化方法。
  • BeanPostProcessor的后置處理(postProcessAfterInitialization):如果Bean實現了BeanPostProcessor接口,Spring容器將在初始化方法調用之后調用postProcessAfterInitialization方法。
  • 使用Bean:Bean可以被容器管理組件使用。
  • 銷毀Bean:如果Bean實現了DisposableBean接口,Spring容器將調用其destroy()方法進行銷毀。如果在配置文件中通過destroy-method指定了銷毀方法,Spring容器將調用指定的銷毀方法。

13、@Autowired和Spring的生命周期有什么關系?

  • 實例化Bean:當 Spring 容器創建 Bean 的實例時,會檢查該 Bean 是否使用了 @Autowired 注解。如果使用了該注解,Spring 會自動解析并注入所依賴的 Bean 到該 Bean 中。
  • 設置Bean屬性:在 Bean 實例化之后,Spring 會根據配置文件或者注解信息,將依賴的屬性值注入到 Bean 中。如果使用了 @Autowired 注解,Spring 會自動解析并注入所依賴的 Bean 到該 Bean 中。
  • 初始化Bean:在屬性注入完成后,Spring 會調用 Bean 的初始化方法。這包括實現 InitializingBean 接口的 afterPropertiesSet 方法或者配置的 init-method 方法。
  • 銷毀Bean:當容器關閉或者 Bean 不再需要時,Spring 會調用 Bean 的銷毀方法。這包括實現 DisposableBean 接口的 destroy 方法或者配置的 destroy-method 方法。在這個階段,可以進行資源的釋放等清理工作。

14、在Spring框架中,我使用了FileSystemXmlApplicationContext來注入bean,但是當我嘗試使用@Autowired注解來獲取這個bean時,卻無法成功。請問這是什么原因?

當您使用FileSystemXmlApplicationContext來加載XML配置文件時,雖然您可以成功地創建和管理Bean,但是這些Bean不會被自動注入到Spring容器中進行托管。因此,當您嘗試使用@Autowired注解來獲取這些Bean時,Spring容器無法找到這些Bean并將它們注入到目標對象中。Apo28資訊網——每日最新資訊28at.com

解決方法是將通過FileSystemXmlApplicationContext加載的Bean手動注冊到Spring容器中。Apo28資訊網——每日最新資訊28at.com

具體步驟如下:Apo28資訊網——每日最新資訊28at.com

  • 在Spring配置文件中使用FileSystemXmlApplicationContext加載XML配置文件,并創建Bean實例。
  • 將創建的Bean實例手動注冊到Spring容器中,例如使用ConfigurableBeanFactory的registerSingleton方法。
  • 在使用Autowired注解的地方,Spring容器就能夠正確地找到并注入這些Bean。

15、什么是FileSystemXmlApplicationContext,它是如何工作的,以及在什么情況下我們會使用它?

FileSystemXmlApplicationContext是Spring框架中的一個類,它用于從文件系統加載XML配置文件并創建應用程序上下文。它是AbstractApplicationContext的一個具體實現,專門用于處理XML配置文件。Apo28資訊網——每日最新資訊28at.com

工作原理:

  • 初始化:當創建一個FileSystemXmlApplicationContext實例時,你需要提供一個XML配置文件的路徑。這個路徑可以是相對于當前工作目錄的相對路徑,也可以是絕對路徑。
  • 解析XML:FileSystemXmlApplicationContext會讀取和解析指定的XML配置文件,從中提取bean定義和其他配置信息。
  • 創建Bean:根據XML中的bean定義,FileSystemXmlApplicationContext會創建和管理這些bean的生命周期,包括依賴注入、作用域等。
  • 提供服務:一旦所有的bean都被創建和管理,你就可以通過getBean()方法來獲取和使用這些bean。

使用場景:

當你有一個XML配置文件,并且希望在啟動應用程序時立即加載它時,可以使用FileSystemXmlApplicationContext。Apo28資訊網——每日最新資訊28at.com

如果你的應用程序需要從文件系統中加載多個XML配置文件,你可以使用FileSystemXmlApplicationContext來加載它們。Apo28資訊網——每日最新資訊28at.com

public static void main(String[] args) {    // 創建一個FileSystemXmlApplicationContext實例,加載XML配置文件    ApplicationContext context = new FileSystemXmlApplicationContext("conf/config.xml");        // 從ApplicationContext中獲取bean    UserService userService = (UserService) context.getBean("userService");        // 調用bean的方法    userService.execute();}

在這個例子中,我們首先創建了一個FileSystemXmlApplicationContext實例,并指定了XML配置文件的路徑。然后,我們從ApplicationContext中獲取了一個名為"userService"的bean,并調用了它的execute()方法。Apo28資訊網——每日最新資訊28at.com

16、FileSystemXmlApplicationContext是如何從文件系統中加載XML配置文件的?

  • 實例化:通過傳入一個或多個XML配置文件的路徑來創建一個FileSystemXmlApplicationContext實例。
  • 刷新容器:調用refresh()方法來啟動Spring容器。
  • 解析XML:FileSystemXmlApplicationContext使用內部的XML解析器來讀取和解析XML文件。
  • 注冊BeanDefinitions:解析完成后,FileSystemXmlApplicationContext會將解析出的bean定義注冊到內部的數據結構中,這樣Spring容器就能夠管理這些bean的生命周期。
  • 處理其他配置:除了bean定義之外,FileSystemXmlApplicationContext還會處理XML中的其他配置,如AOP設置、事務管理等。

17、FileSystemXmlApplicationContext與ClassPathXmlApplicationContext有何區別?

FileSystemXmlApplicationContext和ClassPathXmlApplicationContext都是Spring容器在加載XML配置文件時使用的接口實現類,它們之間的主要區別在于加載配置文件的方式和路徑。Apo28資訊網——每日最新資訊28at.com

FileSystemXmlApplicationContext是通過文件系統加載XML配置文件的方式來初始化Spring容器。Apo28資訊網——每日最新資訊28at.com

ClassPathXmlApplicationContext是通過類路徑(class path)加載XML配置文件的方式來初始化Spring容器。Apo28資訊網——每日最新資訊28at.com

18、什么是ApplicationContextAware接口,它的功能和用途是什么?

ApplicationContextAware 是 Spring 框架中的一個接口,它允許實現該接口的類能夠訪問到當前的 ApplicationContext。換句話說,任何實現了 ApplicationContextAware 接口的類都可以獲得Spring容器中的bean引用。Apo28資訊網——每日最新資訊28at.com

public class MyService implements ApplicationContextAware {    private ApplicationContext applicationContext;    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        this.applicationContext = applicationContext;    }}

19、Spring中@Autowired和@Resource的區別?

  • @Autowired是Spring的注解,@Resource是Java的注解;
  • @Autowired默認通過byType方式注入,@Resource默認通過byName方式注入;
  • @Autowired可以用于字段、構造方法和方法上,@Resource可以用于字段和set方法上;
  • @Autowired在有多個相同類型的bean時,需要結合@Qualifier注解來精確注入,@Resource在有多個相同類型的bean時,會根據名稱進行匹配,如果找不到對應的bean則會報錯。

20、@Autowired和@Resource在實際項目中如何選擇使用?

如果需要精確注入某個特定名稱的bean,那么可以選擇@Resource,因為它會根據名稱進行匹配。Apo28資訊網——每日最新資訊28at.com

如果需要在多個相同類型的bean中選擇一個進行注入,那么可以選擇@Autowired,并結合@Qualifier注解來指定具體的bean。Apo28資訊網——每日最新資訊28at.com

21、Spring Bean 的作用域之間有什么區別?

在Spring框架中,Bean的作用域定義了Bean實例的生命周期和可見范圍。Spring框架提供了以下五種主要的Bean作用域:Apo28資訊網——每日最新資訊28at.com

  • Singleton(單例):在整個應用程序中,只有一個Bean實例被創建并被共享。每次請求該Bean時,都會返回相同的實例。
  • Prototype(原型):每次請求該Bean時,Spring容器都會創建一個新的Bean實例。因此,每次獲取Bean時都會得到不同的實例。
  • Request(請求):每個HTTP請求都會創建一個新的Bean實例,該Bean實例僅在該HTTP請求范圍內可見。
  • Session(會話):每個HTTP會話期間只存在一個Bean實例,該Bean實例僅在該HTTP會話期間可見。
  • Global Session(全局會話):在基于Portlet的Web應用中,全局會話作用域類似于HTTP會話作用域,但僅適用于Portlet上下文。

這些作用域之間的主要區別在于Bean實例的生命周期、創建方式以及可見范圍。選擇合適的Bean作用域取決于應用程序的需求和設計。Apo28資訊網——每日最新資訊28at.com

22、為什么Spring中每個bean都要有作用域?

作用域規定了bean實例的生命周期和在容器中的存儲方式。作用域確定了bean實例的創建、初始化和銷毀方式,以及在應用程序中使用這些bean的方式。Apo28資訊網——每日最新資訊28at.com

  • 通過定義作用域,可以控制bean實例的生命周期;
  • 作用域也決定了bean實例之間的狀態共享方式;
  • 通過定義作用域,可以更好地管理內存和其他資源。

23、什么是 Spring inner beans?

Spring內部bean是指在另一個bean的內部定義的bean。這些內部bean的作用域受限于包含它們的外部bean,因此它們不能被應用程序的其他部分所訪問。內部bean適合于那些只在外部bean中使用的小型、私有的bean。在XML配置文件中,內部bean通常作為外部bean的屬性進行定義。Apo28資訊網——每日最新資訊28at.com

package com; public class Customer {    private Person person;} class Person{    private int id;    private String name;    private int age;}
<bean id="CustomerBean" class="com.Customer"> <property name="person">  <bean class="com.person">   <property name="id" value=1 />   <property name="name" value="哪吒編程" />   <property name="age" value=18 />  </bean> </property></bean>

在這個例子中,"person"是一個內部bean,它被嵌套在"CustomerBean"的屬性中。內部bean的生命周期受外部bean控制,并且外部bean銷毀時,內部bean也會被銷毀。 inner beans的使用可以幫助簡化配置文件,并在外部bean范圍內限制bean的可見性。Apo28資訊網——每日最新資訊28at.com

24、Spring 框架中的單例 Beans 是線程安全的么?

Spring 框架本身并不保證單例Beans的線程安全性,因為線程安全性通常取決于Bean的實現方式,而不是容器本身。因此,開發者需要自行確保他們的單例Beans是線程安全的。Apo28資訊網——每日最新資訊28at.com

有幾種常見的策略可以幫助確保單例Beans的線程安全性:Apo28資訊網——每日最新資訊28at.com

  • 無狀態Bean:如果Bean本身是無狀態的,即它不包含任何可變的實例變量,那么它自然就是線程安全的。這種Bean只包含方法,這些方法通常只依賴于傳入的參數,并且不修改任何內部狀態。
  • 同步方法:如果Bean的某些方法需要訪問和修改共享資源,可以使用synchronized關鍵字來同步這些方法。這樣可以確保在任意時刻只有一個線程能夠執行這些方法。
  • 使用并發集合:如果Bean包含集合類型的屬性,并且這些集合需要在多個線程之間共享,那么應該使用Java提供的并發集合類(如ConcurrentHashMap、CopyOnWriteArrayList等),而不是普通的集合類。
  • 使用ThreadLocal:對于某些需要在多個線程之間保持獨立狀態的場景,可以使用ThreadLocal來存儲線程特定的數據。這樣,每個線程都會有自己獨立的數據副本,從而避免了線程間的數據競爭。
  • 依賴注入:避免在Bean中直接創建和共享其他Bean的實例。相反,應該使用Spring的依賴注入功能來注入所需的依賴項。這樣,Spring可以管理這些依賴項的生命周期和線程安全性。

總之,雖然Spring框架本身不保證單例Beans的線程安全性,但開發者可以通過上述策略來確保他們的Bean在多線程環境中能夠正常工作。Apo28資訊網——每日最新資訊28at.com

25、請解釋 Spring Bean 的自動裝配?

Spring Bean的自動裝配是指Spring容器根據預先定義的規則,自動在Spring應用程序上下文中將Bean與其他Bean進行關聯。這樣可以避免手動配置Bean之間的依賴關系,從而簡化了應用程序的配置。Apo28資訊網——每日最新資訊28at.com

Spring提供了以下幾種自動裝配的模式:Apo28資訊網——每日最新資訊28at.com

  • no:默認模式,不自動裝配,需要手動指定依賴注入。
  • byName:根據Bean的名稱自動裝配,Spring容器會自動將與屬性名相同的Bean注入到屬性中。
  • byType:根據Bean的類型自動裝配,Spring容器會自動將與屬性類型相同的Bean注入到屬性中。如果存在多個匹配的Bean,則會拋出異常。
  • constructor:類似byType,但適用于構造函數參數的自動裝配。

使用自動裝配可以減少配置工作,并且更易于維護。然而,過度依賴自動裝配也可能導致代碼不夠清晰,因此需要根據具體情況進行合理的選擇。Apo28資訊網——每日最新資訊28at.com

26、如何開啟基于注解的自動裝配?

  • 導入context依賴:確保您的項目中包含了Spring的context依賴,這是使用注解進行自動裝配的基礎。
  • 啟用注解驅動:在Spring的配置文件中,需要開啟注解的支持。這通常是通過在XML配置文件中添加context:annotation-config/標簽來實現的。
  • 使用注解標識:使用注解@Autowired 來自動裝配Bean,@Component 用于標識自動掃描的Spring組件(如Bean),@Service、@Repository、@Controller等用于分別標識服務、存儲庫、控制器等特定類型的組件。
  • 配置組件掃描:為了讓Spring能夠掃描到使用了注解的類,需要在配置文件中開啟組件掃描,可以通過<context:component-scan base-package="your.package"/>來指定掃描的包路徑。
  • 使用@SpringBootApplication注解:如果您使用的是Spring Boot,那么可以使用@SpringBootApplication注解,它是一個組合注解,包含了@Configuration、@EnableAutoConfiguration和@ComponentScan三個注解,分別用于聲明配置類、開啟自動裝配和開啟組件掃描。

27、FileSystemResource 和 ClassPathResource 有何區別?

(1)加載方式不同

FileSystemResource 是從文件系統路徑加載文件,而 ClassPathResource 是從類路徑(classpath)中加載文件。Apo28資訊網——每日最新資訊28at.com

(2)適用場景不同

FileSystemResource 適用于加載本地文件系統中的文件,而 ClassPathResource 適用于加載應用程序內部的資源文件,如配置文件、模板等。Apo28資訊網——每日最新資訊28at.com

(3)使用方式不同

FileSystemResource 需要提供文件的絕對路徑或相對路徑,而 ClassPathResource 只需要提供資源文件的相對路徑即可。Apo28資訊網——每日最新資訊28at.com

28、如何向 Spring Bean 中注入一個 Java.util.Properties?

(1)使用標簽

在XML配置文件中定義一個util:properties元素來創建一個Properties對象,然后將其注入到Bean中。Apo28資訊網——每日最新資訊28at.com

<beans xmlns="http://www.springframework.org/schema/beans"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xmlns:util="http://www.springframework.org/schema/util"         xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd         http://www.springframework.org/schema/util         http://www.springframework.org/schema/util/spring-util-3.0.xsd">        <!-- 定義Properties -->      <util:properties id="myProperties" location="classpath:my-properties.properties"/>        <!-- 注入Properties到Bean -->      <bean id="myBean" class="com.example.MyBean">          <property name="properties" ref="myProperties"/>      </bean>    </beans>

(2)使用@Value注解

如果你正在使用Java配置或者希望直接在代碼中使用注解,那么可以使用@Value注解來注入Properties。但請注意,@Value注解主要用于注入單個屬性值,而不是整個Properties對象。然而,你可以通過Spring的@ConfigurationProperties注解或者@PropertySource和Environment類來注入整個Properties對象。Apo28資訊網——每日最新資訊28at.com

29、Spring中BeanFactory和FactoryBean的區別?

BeanFactory是Spring框架中的一個核心接口,它主要用于管理和提供應用程序中的Bean實例。BeanFactory接口定義了Spring容器的基本規范和行為,它提供了一種機制來將配置文件中定義的Bean實例化、配置和管理起來。它負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。BeanFactory的主要作用是提供Bean的創建、配置、初始化和銷毀等基本操作,它可以根據配置文件或注解來創建并管理Bean實例,并提供了各種方法來獲取和操作Bean實例。Apo28資訊網——每日最新資訊28at.com

FactoryBean接口定義了一種創建Bean的方式,它允許開發人員在Bean的創建過程中進行更多的自定義操作。通過實現FactoryBean接口,開發人員可以創建復雜的Bean實例,或者在Bean實例化之前進行一些額外的邏輯處理。Apo28資訊網——每日最新資訊28at.com

30、BeanFactory 和 ApplicationContext 有什么區別?

ApplicationContext則是BeanFactory的子接口,它提供了比BeanFactory更完整的功能。除了繼承BeanFactory的所有功能外,ApplicationContext還提供了國際化、資源文件訪問、監聽器注冊等功能。Apo28資訊網——每日最新資訊28at.com

(1)初始化方式

BeanFactory 是延遲初始化,即在真正需要使用到某個 Bean 時才會創建該 Bean。ApplicationContext 則是在容器啟動時就會預先加載所有的 Bean,所以它是預初始化。Apo28資訊網——每日最新資訊28at.com

(2)注冊方式

BeanFactory 的注冊必須要在配置文件中指定,而 ApplicationContext 可以通過注解的方式自動掃描并注冊 Bean。Apo28資訊網——每日最新資訊28at.com

(3)生命周期管理

ApplicationContext 會管理 Bean 的完整生命周期,包括創建、初始化、銷毀等過程。而 BeanFactory 則只負責創建和管理 Bean 實例,不會對 Bean 進行生命周期管理。Apo28資訊網——每日最新資訊28at.com

31、Spring有幾級緩存,都有什么特點?

Spring框架中有三級緩存。Apo28資訊網——每日最新資訊28at.com

(1)一級緩存

Spring中最基本的緩存,用于存放完全初始化并確定類型的Bean實例。當一個Bean被創建并完成所有的初始化過程后,它會被轉移到這個緩存中。這個緩存是對外提供服務的主要緩存,當我們通過Spring獲取一個Bean時,首先會從這個緩存中查找是否有現成的對象。Apo28資訊網——每日最新資訊28at.com

(2)二級緩存

存放的是已經實例化但未初始化的bean。Apo28資訊網——每日最新資訊28at.com

保證了在多次循環依賴時,同一個類只會被構建一次,從而確保了單例性質。Apo28資訊網——每日最新資訊28at.com

(3)三級緩存

用于存儲用于創建單例bean的ObjectFactory。Apo28資訊網——每日最新資訊28at.com

當依賴的bean實例創建完成后,Spring會使用這個ObjectFactory來創建bean實例,并從三級緩存中移除。Apo28資訊網——每日最新資訊28at.com

三級緩存的主要作用是解決循環依賴問題,特別是當涉及到AOP代理時。通過將代理的bean或普通bean提前暴露,使得依賴注入成為可能。Apo28資訊網——每日最新資訊28at.com

32、Spring為何需要三級緩存解決循環依賴,而不是二級緩存?

先了解一下什么是循環依賴?Apo28資訊網——每日最新資訊28at.com

當兩個或多個bean相互依賴,形成一個閉環時,就發生了循環依賴。Apo28資訊網——每日最新資訊28at.com

二級緩存存儲了尚未完成初始化的bean實例。當Spring檢測到循環依賴時,它可以將正在創建的bean放入二級緩存中,以便其他bean可以引用它。然而,二級緩存并不能解決所有循環依賴問題,特別是當涉及到AOP代理時。Apo28資訊網——每日最新資訊28at.com

AOP(面向切面編程)是Spring框架的一個重要特性,它允許開發者在不修改現有代碼的情況下,為應用程序添加新的行為。Spring AOP通常通過創建代理對象來實現這一點,這些代理對象在運行時增強目標對象的功能。Apo28資訊網——每日最新資訊28at.com

在循環依賴的場景中,如果涉及的bean需要被AOP代理,那么僅僅使用二級緩存是不夠的。因為二級緩存中的bean可能還沒有被AOP框架處理過,也就是說,它們可能還不是最終的代理對象。如果其他bean引用了這些未處理的bean,就會導致錯誤。Apo28資訊網——每日最新資訊28at.com

三級緩存就是為了解決這個問題而引入的。它存儲的不是實際的bean實例,而是創建這些bean的工廠對象(ObjectFactory)。當Spring檢測到循環依賴時,它會將ObjectFactory放入三級緩存中。這個工廠對象知道如何創建和(如果需要的話)代理目標bean。一旦循環依賴被解決,Spring就可以使用這個工廠對象來創建和返回最終的bean實例。Apo28資訊網——每日最新資訊28at.com

通過這種方式,三級緩存不僅解決了普通的循環依賴問題,還解決了涉及AOP代理的復雜循環依賴問題。它允許Spring在bean完全初始化(包括AOP代理)之前暴露引用,從而打破了循環依賴的限制。Apo28資訊網——每日最新資訊28at.com

因此,雖然二級緩存可以解決一些循環依賴問題,但三級緩存提供了更強大和靈活的解決方案,特別是當涉及到AOP代理時。Apo28資訊網——每日最新資訊28at.com

33、Spring中的事務傳播行為有哪些?

Spring中的事務傳播行為定義了七種類型,分別是:Apo28資訊網——每日最新資訊28at.com

PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。這是最常見的選擇。Apo28資訊網——每日最新資訊28at.com

PROPAGATION_SUPPORTS:支持當前事務,如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務方式執行操作。Apo28資訊網——每日最新資訊28at.com

PROPAGATION_MANDATORY:支持當前事務,如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。Apo28資訊網——每日最新資訊28at.com

PROPAGATION_REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則把當前事務掛起。Apo28資訊網——每日最新資訊28at.com

PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。Apo28資訊網——每日最新資訊28at.com

PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。Apo28資訊網——每日最新資訊28at.com

PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則與PROPAGATION_REQUIRED類似。Apo28資訊網——每日最新資訊28at.com

這些傳播行為可以通過@Transactional注解的propagation屬性來設置,用于控制業務方法的事務行為。Apo28資訊網——每日最新資訊28at.com

34、導致Spring事務失效的原因有哪些?

(1)對@Transactional理解不深入或使用不當

開發者如果對@Transactional注解的工作原理和使用方式理解不深入,或者在使用時存在誤解,也可能導致事務失效。Apo28資訊網——每日最新資訊28at.com

(2)方法沒有被public修飾

在Spring中,如果@Transactional注解添加在不是public修飾的方法上,事務就會失效。因為Spring的事務是通過AOP代理實現的,而AOP代理需要目標方法能夠被外部訪問,所以只有public方法才能被代理。Apo28資訊網——每日最新資訊28at.com

(3)類沒有被Spring托管

如果事務方法所在的類沒有被加載到Spring IoC容器中,即該類沒有被Spring管理,那么Spring就無法實現代理,從而導致事務失效。Apo28資訊網——每日最新資訊28at.com

(4)不正確的異常捕獲

如果事務方法拋出的異常被catch處理,那么@Transactional注解無法感知到異常,因此無法回滾事務,導致事務失效。Apo28資訊網——每日最新資訊28at.com

(5)傳播行為配置錯誤

如果內部方法的事務傳播類型被配置為不支持事務的傳播類型,那么該方法的事務在Spring中就會失效。Apo28資訊網——每日最新資訊28at.com

(6)異步

如果在事務方法中調用了異步方法,那么異步方法中的事務可能會失效。Apo28資訊網——每日最新資訊28at.com

35、Spring中實現異步的方式有哪些?

  • 使用@Async注解:通過在方法上添加@Async注解,可以將該方法聲明為異步方法。Spring會自動創建一個代理對象,當調用該方法時,會在一個單獨的線程中執行。
  • 使用CompletableFuture:CompletableFuture是Java 8引入的一個類,用于表示異步計算的結果。在Spring中,可以通過CompletableFuture來創建異步任務。
  • 使用ThreadPoolTaskExecutor:ThreadPoolTaskExecutor是Spring提供的一個線程池任務執行器,可以用來執行異步任務。
  • 使用@Scheduled注解:@Scheduled注解可以用于定時任務,通過設置固定的時間間隔或者使用Cron表達式,可以實現定時執行異步任務。
  • 使用WebAsyncTask:在Spring Web應用中,可以使用WebAsyncTask來實現異步處理。WebAsyncTask會在一個新的線程中執行,并且支持回調函數。
  • 使用消息隊列,消息隊列是實現異步操作的一種常見方式。你可以將任務發布到消息隊列,然后由后臺消費者異步處理這些任務。
  • 使用Spring WebFlux,Spring WebFlux基于Reactive Streams規范,允許你以非阻塞的方式處理請求和響應。雖然這主要用于Web應用程序,但它也可以用于其他需要異步處理的場景。

36、什么是 Spring Batch?

Spring Batch是一個輕量級、全功能且可擴展的開源批處理框架,用于處理大量數據操作的需求。它允許開發人員定義并運行大規模的批處理作業,涵蓋了各種需求,包括數據遷移、ETL操作(抽取、轉換、加載)、報表生成等。Apo28資訊網——每日最新資訊28at.com

Spring Batch提供了豐富的功能,包括錯誤處理、事務管理、并發處理、監控和跟蹤等,使得開發人員能夠輕松構建可靠、高性能的批處理作業。通過使用配置簡單和易于擴展的Spring Batch框架,可以減少開發成本和時間,并且易于維護。Apo28資訊網——每日最新資訊28at.com

Spring Batch框架由多個重要組件組成,包括Job、Step、ItemReader、ItemProcessor和ItemWriter等。開發人員可以使用這些組件來定義和配置批處理作業,以滿足特定的需求。同時,Spring Batch提供了豐富的支持,能夠與其他Spring框架(如Spring Boot、Spring Integration)及其他企業級技術(如JDBC、JMS、Hadoop、NoSQL數據庫)集成,進一步提升了批處理作業的靈活性和適用性。Apo28資訊網——每日最新資訊28at.com

37、如何在Spring中實現定時任務?

在Spring中實現定時任務,可以使用@Scheduled注解。以下是一個簡單的示例:Apo28資訊網——每日最新資訊28at.com

首先,在Spring配置文件中開啟定時任務支持,添加task:annotation-driven/標簽:Apo28資訊網——每日最新資訊28at.com

<beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:task="http://www.springframework.org/schema/task"       xsi:schemaLocation="http://www.springframework.org/schema/beans                           http://www.springframework.org/schema/beans/spring-beans.xsd                           http://www.springframework.org/schema/task                           http://www.springframework.org/schema/task/spring-task.xsd">    <!-- 開啟定時任務支持 -->    <task:annotation-driven/></beans>

創建一個定時任務類,并在需要執行定時任務的方法上添加@Scheduled注解:Apo28資訊網——每日最新資訊28at.com

import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;@Componentpublic class MyTask {    // 每隔5秒執行一次    @Scheduled(fixedRate = 5000)    public void doTask() {        System.out.println("執行定時任務");    }}

38、說說@Required注解的作用?

@Required注解是Spring框架中的注解之一,用于標記Bean的屬性在配置時必須進行注入的。當在Bean配置中使用了@Required注解標記的屬性時,Spring在初始化Bean時會檢查這些屬性是否被正確注入,如果未被注入,則會拋出BeanInitializationException異常。Apo28資訊網——每日最新資訊28at.com

在Spring 5.x及更高版本中,@Required注解已經被廢棄,因為它依賴于一些不推薦使用的特性。Apo28資訊網——每日最新資訊28at.com

推薦使用Java配置或XML配置中的required="true"屬性來指定必需的屬性。Apo28資訊網——每日最新資訊28at.com

推薦使用JSR-330中的@Inject或者Spring的@Autowired注解來代替@Required。這些注解在實現依賴注入時更加靈活,并且更容易用于各種場合。Apo28資訊網——每日最新資訊28at.com

39、Spring常用注解有哪些?應用場景都有什么?

以下是Spring框架中常用的一些注解及其應用場景:Apo28資訊網——每日最新資訊28at.com

@Component:用于聲明一個通用的組件,是其他注解的基礎。 @Controller:用于標記API層,即Web控制器。 @Service:用于標記業務邏輯層。 @Repository:用于標記數據訪問層,通常用于DAO實現類。 @Autowired:用于自動裝配Bean,可以按類型自動注入依賴。 @Resource:按照名稱自動裝配,與JNDI查找相關。 @Bean:標注在方法上,表示該方法返回的對象應該被注冊為Spring容器中的Bean。 @Configuration:表明該類是一個配置類,可以包含@Bean注解的方法。 @ComponentScan:用于指定Spring容器啟動時掃描的包路徑,以便發現并注冊帶有特定注解的類。 @Value:用于將外部屬性值注入到Bean中。 @Qualifier:與@Autowired一起使用,用于指定需要裝配的Bean的名稱。 @Scope:用于指定Bean的作用域,如singleton(單例)或prototype(原型)。 @Primary:用于指定當有多個相同類型的Bean時,優先選擇哪個Bean進行裝配。 @Transactional:用于聲明事務管理,可以標注在類或方法上。 @RequestMapping:用于映射Web請求到特定的處理方法。 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping:分別用于處理HTTP的GET、POST、PUT、DELETE和PATCH請求。 @RequestBody:用于將請求體中的JSON數據綁定到方法參數。 @ResponseBody:用于將方法返回值寫入響應體。 @PathVariable:用于從URL模板變量中提取參數。 @RequestParam:用于將請求參數綁定到方法參數。 @RequestHeader:用于將請求頭信息綁定到方法參數。 @CookieValue:用于將Cookie信息綁定到方法參數。 @SessionAttribute:用于從會話中獲取屬性值。 @RequestAttribute:用于從請求中獲取屬性值。 @ModelAttribute:用于在控制器方法執行前添加模型屬性。 @ExceptionHandler:用于處理方法中拋出的異常。 @ControllerAdvice:用于定義全局的異常處理類。 @RestController:是@Controller和@ResponseBody的組合注解,用于RESTful Web服務。 @CrossOrigin:用于支持跨域請求。 @MatrixVariable:用于處理矩陣變量。Apo28資訊網——每日最新資訊28at.com

40、REST風格的請求是什么?

在REST風格的請求中,核心概念包括資源(Resource)和RESTful API(Application Programming Interface)。資源可以簡單理解為URI,表示一個網絡實體,具有唯一標識符。客戶端通過訪問這些標識符來對資源進行操作。RESTful API則是使用HTTP協議的不同方法來實現與資源的交互。Apo28資訊網——每日最新資訊28at.com

客戶端與服務器之間的交互通過HTTP協議進行,客戶端不需要知道服務器的實現細節,只需要遵循HTTP協議。Apo28資訊網——每日最新資訊28at.com

  • 無狀態,服務器不會保存客戶端的任何狀態信息,每次請求都需要攜帶完整的請求信息,這降低了服務器的負擔,也使得API更加可擴展。
  • 統一接口,REST使用統一的接口,包括HTTP方法、URI、MIME類型等,使API的設計更加簡單、清晰、易于理解。
  • 分層系統,REST的架構是分層的,每個層有自己的責任和職能,這使得系統更加靈活、可擴展、易于維護。

41、如何防止表單重復提交?

(1)Token驗證

在會話中生成一個唯一的Token,并將其嵌入到表單中。當表單被提交時,服務器檢查該Token是否有效,并確保其只被使用一次。 一旦處理完請求,服務器應廢棄該Token。Apo28資訊網——每日最新資訊28at.com

(2)按鈕禁用(不推薦)

用戶點擊提交按鈕后,立即將其禁用,以防止用戶多次點擊。Apo28資訊網——每日最新資訊28at.com

(3)頁面重定向

提交成功后,將用戶重定向到一個新的頁面或消息提示頁,這樣用戶就無法再次點擊提交按鈕了。Apo28資訊網——每日最新資訊28at.com

(4)時間限制

對表單提交設置時間間隔限制,例如不允許在一分鐘內連續提交。Apo28資訊網——每日最新資訊28at.com

(5)驗證碼

對于敏感操作,要求用戶輸入驗證碼,這可以有效防止機器人或惡意軟件的自動提交。Apo28資訊網——每日最新資訊28at.com

(6)數據庫唯一性約束(簡單粗暴)

如果重復提交會導致數據庫中的數據沖突,可以在數據庫字段上設置唯一性約束。Apo28資訊網——每日最新資訊28at.com

42、Spring中都應用了哪些設計模式?

(1)簡單工廠模式

簡單工廠模式的本質就是一個工廠類根據傳入的參數,動態的決定實例化哪個類。Apo28資訊網——每日最新資訊28at.com

Spring中的BeanFactory就是簡單工廠模式的體現,根據傳入一個唯一的標識來獲得bean對象。Apo28資訊網——每日最新資訊28at.com

(2)工廠方法模式

應用程序將對象的創建及初始化職責交給工廠對象,工廠Bean。Apo28資訊網——每日最新資訊28at.com

定義工廠方法,然后通過config.xml配置文件,將其納入Spring容器來管理,需要通過factory-method指定靜態方法名稱。Apo28資訊網——每日最新資訊28at.com

(3)單例模式

Spring用的是雙重判斷加鎖的單例模式,通過getSingleton方法從singletonObjects中獲取bean。Apo28資訊網——每日最新資訊28at.com

(4)代理模式

Spring的AOP中,使用的Advice(通知)來增強被代理類的功能。Spring實現AOP功能的原理就是代理模式(① JDK動態代理,② CGLIB字節碼生成技術代理。)對類進行方法級別的切面增強。Apo28資訊網——每日最新資訊28at.com

(5)裝飾器模式

裝飾器模式:動態的給一個對象添加一些額外的功能。Apo28資訊網——每日最新資訊28at.com

Spring的ApplicationContext中配置所有的DataSource。這些DataSource可能是不同的數據庫,然后SessionFactory根據用戶的每次請求,將DataSource設置成不同的數據源,以達到切換數據源的目的。Apo28資訊網——每日最新資訊28at.com

在Spring中有兩種表現:Apo28資訊網——每日最新資訊28at.com

一種是類名中含有Wrapper,另一種是類名中含有Decorator。Apo28資訊網——每日最新資訊28at.com

(6)觀察者模式

定義對象間的一對多的關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并自動更新。Apo28資訊網——每日最新資訊28at.com

Spring中觀察者模式一般用在listener的實現。Apo28資訊網——每日最新資訊28at.com

(7)策略模式

策略模式是行為性模式,調用不同的方法,適應行為的變化 ,強調父類的調用子類的特性 。Apo28資訊網——每日最新資訊28at.com

getHandler是HandlerMapping接口中的唯一方法,用于根據請求找到匹配的處理器。Apo28資訊網——每日最新資訊28at.com

(8)模板方法模式

Spring JdbcTemplate的query方法總體結構是一個模板方法+回調函數,query方法中調用的execute()是一個模板方法,而預期的回調doInStatement(Statement state)方法也是一個模板方法。Apo28資訊網——每日最新資訊28at.com

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

在Spring中,可以使用XML配置或者注解來注入一個Java Collection。Apo28資訊網——每日最新資訊28at.com

(1)使用XML配置注入Java Collection

<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="stringList" class="java.util.ArrayList">        <constructor-arg>            <list>                <value>Item 1</value>                <value>Item 2</value>                <value>Item 3</value>            </list>        </constructor-arg>    </bean></beans>

(2)使用注解方式注入Java Collection

@Configurationpublic class AppConfig {    @Bean    public List<String> stringList() {        return Arrays.asList("Item 1", "Item 2", "Item 3");    }}

在上面的示例中,我們使用@Configuration注解標注了一個配置類,并且在配置類中定義了一個返回List類型的方法,通過@Bean注解來將List實例注入Spring容器。Apo28資訊網——每日最新資訊28at.com

44、@Scheduled注解在Spring框架中的執行原理,包括它是如何工作的,以及它的主要組件和功能

(1)@Scheduled注解執行原理

Spring使用一個內部的任務調度器(TaskScheduler)來管理所有被 @Scheduled 注解的方法。Apo28資訊網——每日最新資訊28at.com

當Spring容器啟動時,它會自動掃描所有的Bean,找到被 @Scheduled 注解的方法,并將它們注冊到TaskScheduler中。Apo28資訊網——每日最新資訊28at.com

TaskScheduler會按照注解中指定的時間間隔或表達式來自動調用這些方法。Apo28資訊網——每日最新資訊28at.com

@Scheduled注解可以根據配置使用多線程執行,發生異常時,根據配置決定是重試還是直接跳過。Apo28資訊網——每日最新資訊28at.com

深入一點:Apo28資訊網——每日最新資訊28at.com

  • Bean初始化:當Spring容器啟動并初始化bean時,它會在bean的生命周期方法執行完成后,通過postProcessAfterInitialization鉤子函數攔截所有使用了@Scheduled注解的方法。
  • 解析注解參數:Spring會解析這些方法上的@Scheduled注解,包括cron表達式、fixedDelay、fixedRate等參數,以確定任務的執行時間和頻率。
  • 任務注冊:解析后的任務會被注冊到Spring的調度器中,這個調度器負責管理所有的定時任務。
  • 定時任務執行:根據注解參數指定的規則,調度器會在適當的時間觸發任務的執行。

(2)@Scheduled注解主要組件和功能

  • cron: 使用Cron表達式來指定任務的執行時間。
  • fixedDelay: 表示從上一次任務執行完畢到下一次任務開始的時間間隔(以毫秒為單位)。
  • fixedRate: 表示兩次任務開始之間的時間間隔(以毫秒為單位),不考慮上一次任務是否已經執行完畢。
  • initialDelay: 表示首次執行任務前的延遲時間(以毫秒為單位)。

(3)常見用途和實際應用場景

  • 定時任務調度: 執行定時任務,如每隔一段時間執行一次某個操作。
  • 報表生成: 每天或每周定期生成報表。
  • 數據備份: 定時將數據庫中的數據備份到其他地方。
  • 系統維護: 如清理臨時文件、檢查系統健康狀況等。
  • 定時提醒: 如發送定期通知、定時執行某項操作等。

45、請簡述Spring MVC的執行流程

Spring MVC的執行流程遵循了前端控制器模式,通過DispatcherServlet協調各個組件來接收請求、匹配處理器、執行處理器、渲染視圖的過程,實現了請求到視圖的端到端處理。Apo28資訊網——每日最新資訊28at.com

具體執行流程如下:Apo28資訊網——每日最新資訊28at.com

  • 客戶端發送請求:客戶端發送HTTP請求到服務器上部署的Spring MVC應用程序。
  • DispatcherServlet接收請求:請求被DispatcherServlet(前端控制器)攔截,它是Spring MVC的核心組件之一,負責統一管理請求的處理過程。
  • HandlerMapping匹配處理器:DispatcherServlet調用HandlerMapping來確定請求的處理器(Controller)。
  • 執行處理器:確定了處理器之后,DispatcherServlet將請求轉發給相應的Controller進行處理,Controller執行業務邏輯并返回ModelAndView對象。
  • 視圖解析和渲染:DispatcherServlet通過ViewResolver解析Controller返回的邏輯視圖名,并選擇合適的View進行渲染,最終將視圖呈現給用戶。
  • HTTP響應:渲染后的視圖作為HTML響應發送給客戶端。

46、談談你對Spring MVC中九大組件的理解

Spring MVC是Spring框架的一個模塊,用于構建基于MVC(Model-View-Controller)設計模式的Web應用程序。在Spring MVC中,有九大組件是非常重要的,它們分別是:Apo28資訊網——每日最新資訊28at.com

  • DispatcherServlet:這是Spring MVC的核心,是一個前端控制器,負責接收用戶請求并分發給相應的處理器。
  • HandlerMapping:處理器映射,根據請求信息找到對應的處理器(Controller)。
  • HandlerAdapter:處理器適配器,用于調用相應的處理器(Controller)的方法。
  • Controller:控制器,處理由DispatcherServlet分發的請求。
  • ViewResolver:視圖解析器,解析邏輯視圖名到真正的視圖(如JSP)。
  • View:視圖,用于展示模型(Model)數據。
  • ModelAndView:模型和視圖,用于封裝模型數據和視圖信息。
  • ModelMap:模型數據,用于存放模型數據,可以在視圖中直接使用。
  • LocaleResolver:區域解析器,用于解析用戶的語言和區域設置。

這九大組件共同構成了Spring MVC的完整流程:Apo28資訊網——每日最新資訊28at.com

首先,DispatcherServlet接收用戶請求,然后通過HandlerMapping找到對應的Controller,再通過HandlerAdapter調用Controller的方法,方法返回的ModelAndView包含了模型數據和視圖信息,最后通過ViewResolver解析視圖,并通過View展示模型數據。在這個過程中,還可以通過LocaleResolver來解析用戶的語言和區域設置,以實現國際化。Apo28資訊網——每日最新資訊28at.com

47、Spring MVC有哪些常用注解?它們的作用是什么?

@Controller:用于標識一個類為Spring MVC的控制器,處理客戶端的請求并返回相應的視圖。Apo28資訊網——每日最新資訊28at.com

@RequestMapping:用于將URL路徑映射到特定的處理方法,可用于類級別或方法級別,用于定義請求URL和處理請求的方法。Apo28資訊網——每日最新資訊28at.com

@ResponseBody:用于將方法的返回值直接作為HTTP Response的主體內容返回,通常用于返回 JSON 或 XML 格式的數據。Apo28資訊網——每日最新資訊28at.com

@PathVariable:用于將請求URL中的模板變量映射到處理方法的參數中。Apo28資訊網——每日最新資訊28at.com

@RequestParam:用于將請求參數映射到處理方法的參數中,可以指定參數名稱、是否必須等。Apo28資訊網——每日最新資訊28at.com

@RequestParamMap:用于將所有的請求參數映射為一個Map類型的參數。Apo28資訊網——每日最新資訊28at.com

@ModelAttribute:用于將請求參數綁定到Model對象中,通常用于在視圖渲染之前填充模型數據。Apo28資訊網——每日最新資訊28at.com

@SessionAttributes:用于指定處理方法的返回值需要存儲到會話中的屬性值。Apo28資訊網——每日最新資訊28at.com

@InitBinder:用于定制數據綁定規則和初始化數據綁定規則。Apo28資訊網——每日最新資訊28at.com

@Validated:用于標記其后的方法參數需要進行驗證。Apo28資訊網——每日最新資訊28at.com

48、spring mvc 和 struts 的區別是什么?

(1)架構設計

Spring MVC是基于Servlet API構建的,而Struts2是通過Filter實現的。這意味著Spring MVC的入口是一個Servlet,而Struts2的入口是一個Filter。這導致了兩者在處理請求時的不同機制。Apo28資訊網——每日最新資訊28at.com

(2)攔截器

Spring MVC 的攔截器機制通過 HandlerInterceptor 接口進行實現。通過實現這個接口,你可以在處理程序執行的前后插入邏輯,可以在請求處理之前或之后對請求進行預處理或后處理。攔截器可以用來實現日志記錄、權限校驗、國際化、主題切換等各種需求。Apo28資訊網——每日最新資訊28at.com

Struts 的攔截器機制是通過攔截器棧(interceptor stacks)實現的。在Struts2中,通過配置攔截器棧,可以在請求處理的各個階段插入預處理邏輯或后處理邏輯。攔截器可以用于日志記錄、權限校驗、異常處理、輸入驗證等。Apo28資訊網——每日最新資訊28at.com

(3)配置方式

Spring MVC 的配置更加靈活,可以使用 XML 配置、Java 注解或者 Java 類配置(JavaConfig)來配置控制器、視圖解析器等。Apo28資訊網——每日最新資訊28at.com

Struts 使用基于 XML 的配置文件來定義控制器(Action)、攔截器、結果視圖等。Apo28資訊網——每日最新資訊28at.com

(4)擴展性和靈活性

Spring MVC強調依賴注入,通過Spring容器管理對象和組件,使得應用更加靈活和可測試。 Struts不提供像Spring那樣的依賴注入機制,更多地依賴于配置文件,因此在靈活性方面可能稍遜于Spring MVC。Apo28資訊網——每日最新資訊28at.com

(5)性能

由于Spring MVC的輕量級設計,其代碼量相對較少,運行時間也更快,因此在性能方面通常優于Struts2。Apo28資訊網——每日最新資訊28at.com

49、@RestController和@Controller有什么區別?

@RestController和@Controller是Spring MVC中常用的注解,它們的主要區別在于返回值的不同:Apo28資訊網——每日最新資訊28at.com

@Controller:用于標識控制器類的注解。在Spring MVC中,使用@Controller注解標記的類表示該類是控制器,可以處理客戶端的請求,并返回相應的視圖。Apo28資訊網——每日最新資訊28at.com

@RestController:是Spring4.0引入的一個組合注解,用于標識RESTful風格的控制器類。它相當于@Controller和@ResponseBody的組合,表示該類處理RESTful請求,方法的返回值直接作為HTTP Response的主體內容返回,而不是作為視圖進行解析。Apo28資訊網——每日最新資訊28at.com

因此,@RestController注解在處理HTTP請求時,會將方法的返回值直接轉換為JSON/XML等格式的數據返回給客戶端,而@Controller注解一般用于傳統的Web應用程序開發,將方法的返回值解析為視圖進行渲染。Apo28資訊網——每日最新資訊28at.com

50、Spring MVC如何匹配請求路徑?

在Spring MVC中,請求路徑的匹配是通過DispatcherServlet和HandlerMapping來完成的。具體步驟如下:Apo28資訊網——每日最新資訊28at.com

  • 客戶端發送請求到服務器,請求首先到達DispatcherServlet。
  • DispatcherServlet接收到請求后,會調用HandlerMapping(處理器映射)來找到對應的Controller(控制器)。
  • HandlerMapping會根據請求路徑(URI)和請求方法(GET、POST等)來查找匹配的Controller。這是通過配置文件或者注解來實現的。
  • 如果找到匹配的Controller,HandlerMapping會返回一個HandlerExecutionChain對象,包含了處理器(Handler)、攔截器(Interceptors)和適配器(Adapter)。
  • DispatcherServlet根據HandlerExecutionChain對象,依次調用攔截器、處理器和適配器來處理請求。
  • 最后,將處理結果返回給客戶端。

在Spring MVC中,可以通過多種方式來配置請求路徑與Controller的映射關系,例如使用XML配置文件或者使用注解(如@RequestMapping)。Apo28資訊網——每日最新資訊28at.com

RequestMapping可以實現模糊匹配路徑,比如:Apo28資訊網——每日最新資訊28at.com

  • ?表示一個字符;
  • *表示任意字符;
  • **匹配多層路徑;

51、Spring MVC中,在調用controller接口前都進行了哪些操作?

Spring MVC的執行流程:Apo28資訊網——每日最新資訊28at.com

  • DispatcherServlet(前端控制器):所有的請求都會先到達前端控制器 DispatcherServlet,它是整個 Spring MVC 的核心。
  • HandlerMapping(處理器映射器):DispatcherServlet 會根據請求的 URL 找到對應的 Handler(處理器),這個過程中會用到 HandlerMapping。
  • Interceptors(攔截器),在請求到達 Handler 之前,可以設置一些攔截器對請求進行預處理,例如權限驗證、日志記錄等。
  • Handler(處理器):這里指的是 Controller 接口,當請求到達 Controller 后,會執行相應的方法進行處理。
  • ModelAndView(模型和視圖):Controller 處理完請求后,會返回一個 ModelAndView 對象,其中包含了響應的數據和視圖信息。
  • ViewResolver(視圖解析器):根據 ModelAndView 中的視圖信息,通過 ViewResolver 解析出實際的視圖對象。
  • View(視圖):將解析出的視圖對象渲染成 HTML 頁面,返回給客戶端。

因此,DispatcherServlet(前端控制器)、HandlerMapping(處理器映射器)、Interceptors(攔截器)就是在調用controller接口前進行的操作。Apo28資訊網——每日最新資訊28at.com

52、SpringMVC如何獲取請求的參數?

(1)@RequestParam

最常見的方法,用于從請求參數中取值到控制器方法的參數上。Apo28資訊網——每日最新資訊28at.com

(2)@PathVariable

從URL路徑中提取參數時,可以使用@PathVariable注解。Apo28資訊網——每日最新資訊28at.com

在這個例子中,當發送一個GET請求到/users/123時,123會被解析為id參數的值。Apo28資訊網——每日最新資訊28at.com

@Controller  public class MyController {        @GetMapping("/users/{id}")      public String getUser(@PathVariable Long id) {          // 使用id參數          return "user";      }  }

(3)@ModelAttribute

當請求參數與對象屬性對應時,可以使用@ModelAttribute注解來綁定請求參數到JavaBean上。Apo28資訊網——每日最新資訊28at.com

當發送一個GET請求到/create?id=1&name=nezha&age=18時,請求參數會被綁定到User對象的屬性上。Apo28資訊網——每日最新資訊28at.com

@Controller  public class MyController {        @GetMapping("/create")      public String create(@ModelAttribute User user) {          // 使用user對象中的屬性          return "create";      }        public static class User {          private String id;          private String name;          private String age;          // getters and setters      }  }

(4)@RequestBody

當請求體中包含JSON或XML數據時,可以使用@RequestBody注解來自動解析請求體并綁定到方法參數上。Apo28資訊網——每日最新資訊28at.com

(5)HttpServletRequest

還可以直接通過HttpServletRequest對象來獲取請求參數,盡管這不是Spring MVC推薦的方式,因為它沒有利用Spring MVC的參數綁定特性。Apo28資訊網——每日最新資訊28at.com

在使用HttpServletRequest時,你需要自己處理參數的獲取和類型轉換。Apo28資訊網——每日最新資訊28at.com

@Controller  public class MyController {        @GetMapping("/oldWay")      public String oldWay(HttpServletRequest request) {          String query = request.getParameter("query");          // 使用query參數          return "oldWay";      }  }

53、mybatis 中 #{}和 ${}的區別是什么?

#{}:被稱為占位符,在執行SQL語句時,通過PreparedStatement對參數值進行預處理,MyBatis會將#{}替換為?,然后將參數值傳遞給SQL語句,這樣可以防止SQL注入攻擊。當使用#{}時,MyBatis會自動處理參數的轉義和引號等問題,確保參數作為一個完整的字符串被傳遞。Apo28資訊網——每日最新資訊28at.com

#{}主要用于替換 SQL 語句中的條件值,它不能直接用于替換 SQL 語句的片段或關鍵字,比如表名。Apo28資訊網——每日最新資訊28at.com

:稱為變量替換,使用{}時,它在SQL語句中直接替換成相應的參數值,它會將參數值直接拼接到SQL語句中,因此存在SQL注入的風險。Apo28資訊網——每日最新資訊28at.com

${}:可以替換 SQL 語句中的任何部分,包括列名、表名、SQL 關鍵字等。Apo28資訊網——每日最新資訊28at.com

54、使用${}時,如何防止SQL注入?

(1)白名單校驗

在將參數傳遞給SQL語句之前,對參數值進行驗證,確保它們符合預期的格式或范圍。這可以通過正則表達式、字符串比較或其他邏輯來實現。Apo28資訊網——每日最新資訊28at.com

避免敏感操作,比如DROP、TRUNCATE 等。Apo28資訊網——每日最新資訊28at.com

(2)轉義特殊字符

對于可能引起注入的特殊字符,需要進行合適的轉義處理,比如對單引號、雙引號、分號等特殊字符進行轉義,防止它們被誤解為SQL命令的一部分。Apo28資訊網——每日最新資訊28at.com

(3)使用數據庫權限控制

確保數據庫用戶只有執行必要操作的權限,避免給予過多的權限。這樣即使發生了 SQL 注入攻擊,攻擊者也只能執行有限的操作。Apo28資訊網——每日最新資訊28at.com

(4)日志記錄和監控

記錄所有執行的 SQL 語句,并監控任何異常或可疑行為。這有助于及時發現并應對潛在的 SQL 注入攻擊。Apo28資訊網——每日最新資訊28at.com

55、mybatis 是否支持延遲加載?延遲加載的原理是什么?

MyBatis支持延遲加載,它允許在需要時動態地加載與某個對象關聯的數據。延遲加載可以幫助減少不必要的數據庫查詢,提高性能,并且提供了一種方便的方式來管理復雜對象之間的關聯關系。Apo28資訊網——每日最新資訊28at.com

延遲加載的原理是,在查詢主對象時,并不會立即加載關聯對象的信息,而是在真正需要使用這些關聯對象的時候再去發起對關聯對象的查詢。具體來說,延遲加載通常使用代理對象(Proxy)來實現。當主對象被查詢并加載到內存中時,關聯對象并沒有被加載,而是創建一個代理對象來代替關聯對象的位置。當應用程序實際使用關聯對象的屬性或方法時,代理對象會攔截這些調用,并觸發對關聯對象數據的實際加載查詢,然后返回結果給應用程序。Apo28資訊網——每日最新資訊28at.com

在MyBatis中,延遲加載通常與二級緩存(二級緩存是一種全局性的緩存機制,可以跨多個會話對查詢進行緩存)結合使用,可以延遲加載對象的時候首先嘗試從二級緩存中獲取數據,如果緩存中不存在再去查詢數據庫。Apo28資訊網——每日最新資訊28at.com

延遲加載可以提高查詢性能,特別是在處理大量數據或者復雜關聯查詢的時候。但是,它也會增加一些額外的內存開銷,因為需要創建代理對象,并且在訪問數據時需要進行額外的數據庫查詢操作。因此,在使用延遲加載時需要根據具體的業務需求和性能要求進行權衡。Apo28資訊網——每日最新資訊28at.com

56、說一下 mybatis 的一級緩存和二級緩存?

(1)一級緩存

MyBatis的一級緩存是SqlSession級別的緩存,也就是說當我們執行查詢之后,會將查詢的結果放在SqlSession的緩存中。Apo28資訊網——每日最新資訊28at.com

對于同一個SqlSession,當執行相同的查詢時,MyBatis會先查看一級緩存中是否有相同的查詢結果,如果有,則直接返回緩存的結果,而不再去數據庫中查詢。Apo28資訊網——每日最新資訊28at.com

一級緩存是MyBatis默認開啟的,它可以減少對數據庫的訪問,提高查詢性能。Apo28資訊網——每日最新資訊28at.com

(2)二級緩存

MyBatis的二級緩存是Mapper級別的緩存,它可以跨SqlSession共享緩存數據。Apo28資訊網——每日最新資訊28at.com

二級緩存是在Mapper的映射文件配置開啟的,我們可以在Mapper的映射文件中配置元素來開啟二級緩存。Apo28資訊網——每日最新資訊28at.com

使用二級緩存時,要確保查詢的 SQL 語句和參數是完全相同的,否則 MyBatis 會認為它們是不同的查詢,從而不會從二級緩存中獲取數據。Apo28資訊網——每日最新資訊28at.com

對于頻繁更新的數據,不建議使用二級緩存,因為頻繁的更新會導致緩存失效,反而降低性能。Apo28資訊網——每日最新資訊28at.com

57、mybatis 有哪些執行器(Executor)?

(1)簡單執行器SimpleExecutor

SimpleExecutor是MyBatis默認的執行器,它對每個SQL語句的執行進行了封裝,每次都會生成一個新的Statement對象,并執行SQL語句,SimpleExecutor適用于短時、簡單的操作。Apo28資訊網——每日最新資訊28at.com

(2)重用執行器ReuseExecutor

ReuseExecutor是一種復用的執行器,它會在多次執行相同SQL語句時重用Statement對象,從而減少了Statement對象的創建和銷毀,提升了性能。Apo28資訊網——每日最新資訊28at.com

(3)批處理執行器BatchExecutor

BatchExecutor是一種執行器,用于批量操作。當我們需要執行批量的SQL語句時,可以使用BatchExecutor來提高性能。BatchExecutor通過快速執行批量的SQL語句,來減少與數據庫的交互次數,提高操作的效率。Apo28資訊網——每日最新資訊28at.com

58、mybatis中如何設置執行器?

(1)全局設置

Spring集成MyBatis時,執行器的設置通常是在Spring的配置文件中進行的。你可以通過配置SqlSessionFactoryBean的executorType屬性來指定執行器類型。例如:Apo28資訊網——每日最新資訊28at.com

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">      <property name="dataSource" ref="dataSource" />      <property name="configLocation" value="classpath:mybatis-config.xml" />      <property name="executorType" value="REUSE"/> </bean>

這個設置會影響所有的SqlSession,但不建議全局修改執行器類型,因為這可能會對性能產生不必要的影響。Apo28資訊網——每日最新資訊28at.com

(2)局部配置

當獲取SqlSession對象時,可以指定所需的執行器類型。這種方式更加靈活,允許根據不同的操作需求選擇不同的執行器。Apo28資訊網——每日最新資訊28at.com

SqlSession是MyBatis中用于執行數據庫操作的核心接口,它提供了多種方法來執行SQL語句和映射操作。Apo28資訊網——每日最新資訊28at.com

通過SqlSessionFactory獲取SqlSession對象時,可以配置執行器的類型。Apo28資訊網——每日最新資訊28at.com

使用SqlSessionFactory的openSession(ExecutorType)方法來獲取指定類型的SqlSession。ExecutorType是一個枚舉類型,包含了MyBatis支持的三種執行器:SIMPLE、REUSE和BATCH。Apo28資訊網——每日最新資訊28at.com

import org.apache.ibatis.session.ExecutorType;  import org.apache.ibatis.session.SqlSession;  import org.apache.ibatis.session.SqlSessionFactory;  import org.apache.ibatis.session.SqlSessionFactoryBuilder;    import java.io.Reader;     Reader reader = Resources.getResourceAsReader("mybatis-config.xml");    // 創建SqlSessionFactory  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);    // 獲取指定執行器類型的SqlSession  // 使用SIMPLE執行器  SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.SIMPLE);  // 或者使用REUSE執行器  // SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.REUSE);  // 或者使用BATCH執行器  // SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);    try {      // 使用sqlSession執行數據庫操作...      // ...  } finally {      // 關閉SqlSession      sqlSession.close();  }

(3)xml中標簽內設置

可以通過在映射文件中配置和標簽來定義相應的執行器,在這些標簽中可以針對具體的SQL語句配置執行器類型。 Apo28資訊網——每日最新資訊28at.com

<select id="selectBlog" parameterType="int" resultType="Blog"     statementType="PREPARED" useCache="true" flushCache="true">  SELECT * FROM BLOG WHERE ID = #{id}</select>

Apo28資訊網——每日最新資訊28at.com

在上面的示例中,可以看到標簽指定了該查詢的執行器類型為“PREPARED”,也就是預處理執行器。 Apo28資訊網——每日最新資訊28at.com

59、BatchExecutor 如何提高性能?

BatchExecutor 通過批處理的方式提高性能。它允許在 JDBC 客戶端緩存多條 SQL 語句,然后在緩存滿或手動刷新時,將這些語句打包一起發送到數據庫執行。這種方式可以有效減少網絡通信次數和數據庫交互的開銷,從而提高系統性能。  Apo28資訊網——每日最新資訊28at.com

網絡通信次數:通過一次發送多條 SQL 語句,減少了與數據庫服務器之間的往返次數,從而減少了網絡延遲的影響。數據庫交互開銷:數據庫在處理批量請求時,可以優化執行計劃,減少編譯和準備時間,進一步提高執行效率。 Apo28資訊網——每日最新資訊28at.com

60、mybatis如何防止sql注入

(1)使用參數化的SQL語句 在編寫SQL語句時,應使用參數化的方式來構建SQL,而不是將用戶輸入的值直接拼接到SQL字符串中。這樣可以確保用戶輸入的內容不會被解釋為SQL命令。 #{}占位符會自動對輸入值進行轉義,可以有效防止SQL注入攻擊。 Apo28資訊網——每日最新資訊28at.com

<select id="getUser" parameterType="string" resultType="User">  SELECT * FROM users WHERE username = #{username}</select>

Apo28資訊網——每日最新資訊28at.com

(2)使用MyBatis的動態SQL MyBatis的動態SQL允許根據條件動態拼接SQL語句,可以在拼接SQL的過程中對用戶輸入的內容進行轉義或其他處理,從而防止SQL注入攻擊。Apo28資訊網——每日最新資訊28at.com

Apo28資訊網——每日最新資訊28at.com

<select id="getUsers" parameterType="map" resultType="User">  SELECT * FROM users  <where>    <if test="username != null">      AND username = #{username}    </if>  </where></select>

61、mybatis xml映射文件中,有哪些常用標簽?

  • :定義一個映射器,用于將 SQL 語句與 Java 方法關聯起來。
  • :定義一個結果映射,用于描述如何將查詢結果集映射到 Java 對象。
  • :定義一個可重用的 SQL 片段。
  • :定義一個查詢語句,用于從數據庫中檢索數據。
  • :定義一個插入語句,用于向數據庫中插入數據。
  • :定義一個更新語句,用于修改數據庫中的數據。
  • :定義一個刪除語句,用于從數據庫中刪除數據。
  • :定義一個參數映射,用于描述如何將 Java 方法的參數傳遞給 SQL 語句。
  • :定義一個刷新語句,用于清空或重置數據庫中的緩存。
  • :定義一個數據庫配置,用于指定數據庫連接信息。:定義一個緩存配置,用于設置查詢結果的緩存策略。
  • :定義一個關聯映射,用于描述兩個實體類之間的關聯關系。
  • :定義一個集合映射,用于描述一對多或多對多的關聯關系。
  • :定義一個鑒別器映射,用于處理繼承關系中的類型判斷。
  • :定義一個子查詢映射,用于在查詢語句中使用子查詢。
  • :定義一個構造函數映射,用于在查詢結果中使用構造函數創建對象。
  • :定義一個修剪表達式,用于在動態 SQL 中控制 SQL 語句的生成。
  • :定義一個條件表達式,用于在動態 SQL 中生成 WHERE 子句。
  • :定義一個更新表達式,用于在動態 SQL 中生成 SET 子句。
  • :定義一個循環表達式,用于在動態 SQL 中處理集合類型的參數。

62、Mybatis 動態 sql 有什么用?執行原理?有哪些動態 sql?

動態 SQL 的主要作用在于,根據運行時不同的條件,動態地生成不同的 SQL 語句,從而實現更靈活、更高效的數據庫操作。Apo28資訊網——每日最新資訊28at.com

常見的動態 SQL 標簽:Apo28資訊網——每日最新資訊28at.com

  • :只會在至少有一個子元素的條件返回 SQL 子句的情況下才去插入“WHERE”子句。而且,若子句的開頭是“AND”或“OR”,元素也會將它們去除。
  • :用于判斷條件,如果滿足條件,則包含其中的 SQL 片段。
  • 、、:類似于 Java 中的 switch-case-default 結構,用于多條件判斷。
  • :可以自定義前綴和后綴的去除規則。
  • :用于處理 SQL 語句中的 SET 子句,智能地處理逗號。
  • :用于遍歷集合,根據集合元素生成相應的 SQL 片段。

這些動態 SQL 標簽大大增強了 MyBatis 的靈活性,使得開發者能夠根據不同的業務邏輯,動態地構建 SQL 語句,從而提高了開發效率和代碼的可維護性。Apo28資訊網——每日最新資訊28at.com

63、Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重復?

在 MyBatis 的 XML 映射文件中,不同的 XML 映射文件之間的 ID 是可以重復的。因為每個 XML 映射文件都是獨立的,它們之間不會相互影響。但是在同一張 XML 映射文件中,每個元素中的 ID 必須是唯一的,不能重復。Apo28資訊網——每日最新資訊28at.com

64、MyBatis的接口綁定是如何工作的?

當 MyBatis 接收到 Java 接口方法的調用時,它會首先查找是否有與該方法相關的 SQL 映射語句。如果有,MyBatis 會解析該 SQL 語句,并根據傳入的參數值動態地生成最終的 SQL 語句。然后,MyBatis 會執行這個 SQL 語句,并將查詢結果映射回 Java 對象,最后返回給調用者。Apo28資訊網——每日最新資訊28at.com

在接口綁定中,MyBatis 提供了兩種實現方式:Apo28資訊網——每日最新資訊28at.com

(1)使用元素

在 MyBatis 的全局配置文件(如 mybatis-config.xml)中,通過元素引入 SQL 映射文件,將映射文件與 Java 接口關聯起來。Apo28資訊網——每日最新資訊28at.com

(2)使用注解

在 Java 接口方法上添加 @Select、@Insert、@Update、@Delete 等注解,直接編寫 SQL 語句。Apo28資訊網——每日最新資訊28at.com

public interface UserMapper {    @Select("SELECT * FROM user WHERE id = #{id}")    User getUserById(int id);}

65、MyBatis如何處理參數映射?

(1)單個參數

當 SQL 語句中只有一個參數時,MyBatis 無需指定參數的類型或名稱,直接使用 #{} 來引用參數。MyBatis 會自動將這個參數綁定到 SQL 語句中。Apo28資訊網——每日最新資訊28at.com

(2)多個參數

① 使用順序:MyBatis 會按照參數的順序進行綁定,可以使用 #{param1}、#{param2} 等來引用參數。Apo28資訊網——每日最新資訊28at.com

<select id="selectUserByUsernameAndPassword" resultType="User">    SELECT * FROM user WHERE username = #{param1} AND password = #{param2}  </select>

② 使用 @Param 注解:在 Mapper 接口的方法參數上添加 @Param 注解,為參數指定一個名稱,然后在 XML 中使用這個名稱來引用參數。Apo28資訊網——每日最新資訊28at.com

User selectUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
<select id="selectUserByCriteria" resultType="User">    SELECT * FROM user WHERE username = #{username} AND age = #{age}  </select>

③ 使用 Map 或 JavaBean:將多個參數封裝到一個 Map 或 JavaBean 中,然后在 XML 中引用 Map 的 key 或 JavaBean 的屬性。Apo28資訊網——每日最新資訊28at.com

User selectUserByCriteria(Map<String, Object> criteria);
<select id="selectUserByCriteria" resultType="User">    SELECT * FROM user WHERE username = #{username} AND age = #{age}  </select>

(3)復雜類型

對于復雜類型(如 JavaBean 或自定義類型),MyBatis 會自動映射這些類型的屬性到 SQL 語句中。只需要在 XML 中使用 #{} 引用這些屬性的名稱即可。Apo28資訊網——每日最新資訊28at.com

public class UserCriteria {    private String username;    private int age;    // getters and setters  }
<select id="selectUserByCriteria" resultType="User">    SELECT * FROM user WHERE username = #{username} AND age = #{age}  </select>

(4)使用 @Results 和 @Result 注解

對于結果集的映射,MyBatis 提供了 @Results 和 @Result 注解,用于在接口方法上直接定義結果集的映射關系,而無需編寫 XML 映射文件。這些注解可以指定如何將數據庫中的列映射到 Java 對象的屬性上。Apo28資訊網——每日最新資訊28at.com

66、ibatis中如何實現Oracle批量入庫?

<insert id="saveUserBatch" parameterClass="java.util.List"> insert all <iterate conjunction=" ">  into USER (   ID,   NAME,   SAVE_DATE  ) values    <![CDATA[    (     #list[].id#,   #list[].name#,   SYSDATE  ) ]]> </iterate> select * from dual</insert>

67、mybatis 和 hibernate 的區別有哪些?

(1)SQL書寫與靈活性

MyBatis:是一個半自動化的持久層框架,需要手動編寫SQL語句和ResultMap。MyBatis支持注解配置和XML配置,可以在XML文件中編寫動態SQL語句。Apo28資訊網——每日最新資訊28at.com

Hibernate:是一個全自動化的ORM框架,它會自動生成SQL語句,開發者無需關心SQL的生成與結果映射。Apo28資訊網——每日最新資訊28at.com

(2)性能與擴展性

MyBatis:由于SQL語句是手動編寫的,所以可以對SQL進行精細的優化,提高性能。但是,由于所有SQL都是依賴數據庫書寫的,所以MyBatis的擴展性、遷移性相對較差。Apo28資訊網——每日最新資訊28at.com

Hibernate:支持多種數據庫,通過配置可以方便地進行數據庫切換。Hibernate使用反射機制實現持久化對象操作,使得業務層與具體數據庫分開,降低了數據庫之間遷移的成本。Apo28資訊網——每日最新資訊28at.com

(3)緩存機制

MyBatis:提供了一級緩存和二級緩存機制,但主要是依賴于開發者手動管理和配置。Apo28資訊網——每日最新資訊28at.com

Hibernate:提供了更為強大的緩存機制,包括一級緩存和二級緩存,并支持多種緩存策略,能夠顯著提高性能。Apo28資訊網——每日最新資訊28at.com

68、什么情況下建議使用hibernate?

建議在需要支持多種數據庫兼容性和簡化持久層開發時使用Hibernate。Apo28資訊網——每日最新資訊28at.com

Hibernate作為一個對象關系映射(ORM)框架,它的優勢在于能夠將Java對象與數據庫表之間建立映射關系,從而使得開發者可以使用面向對象的方式進行數據庫操作,而無需直接編寫SQL語句。Apo28資訊網——每日最新資訊28at.com

69、hibernate 中如何在控制臺查看打印的 sql 語句?

(1)日志打印

Hibernate 使用 SLF4J 或其他日志框架(如 Log4j、Logback 等)進行日志記錄。你可以在 Hibernate 的配置中啟用 SQL 語句的日志記錄。Apo28資訊網——每日最新資訊28at.com

對于 Log4j,你可以在 log4j.properties 或 log4j.xml 文件中添加以下配置:Apo28資訊網——每日最新資訊28at.com

log4j.logger.org.hibernate.SQL=DEBUG  log4j.logger.org.hibernate.type.descriptor.sql=TRACE

如果你使用的是 Logback,可以在 logback.xml 中添加:Apo28資訊網——每日最新資訊28at.com

<logger name="org.hibernate.SQL" level="DEBUG" />  <logger name="org.hibernate.type.descriptor.sql" level="TRACE" />

這樣,Hibernate 就會打印出執行的 SQL 語句以及相關的綁定參數。Apo28資訊網——每日最新資訊28at.com

(2)使用 Hibernate 的 Show_SQL+format_sql 屬性

在 Hibernate 的配置文件中(如 hibernate.cfg.xml 或通過注解配置),你可以設置 show_sql 屬性為 true 來在控制臺打印 SQL 語句。但是,請注意,這只會打印 SQL 語句本身,不會顯示綁定的參數值。Apo28資訊網——每日最新資訊28at.com

format_sql 屬性為 true 來格式化打印的 SQL 語句,使其更易讀。Apo28資訊網——每日最新資訊28at.com

<hibernate-configuration>      <session-factory>          <!-- 其他配置 -->          <property name="show_sql">true</property>          <property name="format_sql">true</property>    </session-factory>  </hibernate-configuration>

70、hibernate 有幾種查詢方式?

(1)HQL查詢

HQL(Hibernate Query Language)是Hibernate專有的查詢語言,它類似于SQL,但操作的是實體對象而非數據庫表。HQL查詢可以更加直觀地進行對象之間的關聯查詢,同時減少對底層數據庫結構的依賴。Apo28資訊網——每日最新資訊28at.com

(2)OID檢索

OID(Object Identifier)是 Hibernate 中每個持久化對象的唯一標識符。OID 檢索是通過調用 get() 或 load() 方法來獲得一個持久化對象的方式。這兩個方法的區別在于當對象不存在時,get() 方法返回 null,而 load() 方法會拋出 ObjectNotFoundException 異常。Apo28資訊網——每日最新資訊28at.com

(3)QBC查詢

QBC(Query By Criteria)是一種以面向對象的方式構建查詢的方法。它使用Criteria API來構建查詢條件,這種方式更加靈活,可以在編譯時檢查屬性和關聯的正確性。Apo28資訊網——每日最新資訊28at.com

(4)對象導航檢索

這種方式利用實體類的內部關聯進行查找,不需要通過特定的方法和工具。例如,如果有一個 User 對象和一個與之關聯的 Order 對象,可以通過調用 user.getOrders() 方法來獲得該 User 的所有訂單。Apo28資訊網——每日最新資訊28at.com

(5)原生SQL查詢

在某些情況下,開發者可能需要直接使用原生SQL語句進行查詢,以便利用特定數據庫的特性或編寫復雜的查詢。Hibernate通過session.createSQLQuery()方法支持這種查詢方式。Apo28資訊網——每日最新資訊28at.com

71、hibernate如何實現HQL查詢?

我們首先創建了一個 SessionFactory 實例,然后開啟一個 Session。我們構建了一個 HQL 查詢字符串,該字符串指定了從 User 實體中選擇所有字段,并且 name 屬性等于指定的參數值。我們使用 session.createQuery() 方法來創建一個 Query 對象,并指定了查詢返回的結果類型為 User。接著,我們設置查詢參數,并執行查詢來獲取結果列表。Apo28資訊網——每日最新資訊28at.com

public class HQLQueryExample {      public static void main(String[] args) {          // 創建 SessionFactory,這通常是在應用啟動時完成的,而不是在每次查詢時          SessionFactory sessionFactory = new Configuration()                  .configure("hibernate.cfg.xml") // 加載 Hibernate 配置文件                  .addAnnotatedClass(User.class)  // 注冊實體類                  .buildSessionFactory();            try (Session session = sessionFactory.openSession()) {              // 開啟事務              session.beginTransaction();                // 創建 HQL 查詢              String hql = "FROM User WHERE name = :name"; // HQL 查詢,從 User 實體選擇所有字段                // 創建查詢對象              Query<User> query = session.createQuery(hql, User.class);                // 設置參數              query.setParameter("name", "nezha soft");                // 執行查詢并獲取結果列表              List<User> users = query.getResultList();                // 處理查詢結果              for (User user : users) {                  System.out.println("User ID: " + user.getId() + ", Name: " + user.getName() + ", Email: " + user.getEmail());              }                // 提交事務              session.getTransaction().commit();          } catch (Exception e) {              e.printStackTrace();          } finally {              // 關閉 SessionFactory(通常在應用關閉時)              sessionFactory.close();          }      }  }
@Entity  @Table(name = "users")  public class User {      @Id      private Long id;      private String name;      private String email;        // 省略構造器、getter 和 setter 方法  }

72、hibernate如何實現OID檢索?

代碼與HQL查詢類似,下面是關鍵代碼:Apo28資訊網——每日最新資訊28at.com

// 使用 get() 方法進行 OID 檢索  User user = session.get(User.class, userId);

73、hibernate如何實現QBC查詢?

代碼與HQL查詢類似,下面是關鍵代碼:Apo28資訊網——每日最新資訊28at.com

// 創建 Criteria 對象  Criteria criteria = session.createCriteria(Employee.class);  // 添加查詢條件  criteria.add(Restrictions.eq("firstName", "John"));  criteria.add(Restrictions.gt("salary", 50000.0));  // 執行查詢并獲取結果  List<Employee> employees = criteria.list();

74、hibernate如何實現對象導航檢索?

Hibernate 的對象導航檢索是指通過已經加載到內存中的持久化對象來訪問其關聯的其他對象。這種檢索方式基于對象之間的關系,而不是直接通過數據庫查詢。Apo28資訊網——每日最新資訊28at.com

在上面的示例中,我們首先通過用戶的 ID 使用 session.get() 方法檢索用戶對象。然后,我們直接訪問用戶的 orders 屬性(這是一個 List),這是通過對象導航實現的。如果 orders 列表尚未加載到內存中(例如,如果使用了延遲加載),那么可能需要顯式地初始化它,這通常通過 Hibernate 的 Hibernate.initialize() 方法或訪問列表中的元素來觸發。Apo28資訊網——每日最新資訊28at.com

請注意,對象導航檢索的性能取決于 FetchType 的設置以及是否啟用了延遲加載。如果 FetchType 設置為 LAZY(延遲加載),那么關聯的對象在首次訪問其屬性之前不會被加載。這可以減少初始加載時的數據庫交互次數,但可能會增加后續訪問關聯對象時的數據庫交互次數。因此,在設計應用程序時,需要權衡初始加載時間和后續訪問性能。Apo28資訊網——每日最新資訊28at.com

首先,假設我們有兩個實體類:User 和 Order,它們之間存在一對多的關系,即一個用戶可以擁有多個訂單。Apo28資訊網——每日最新資訊28at.com

@Entity  @Table(name = "users")  public class User {      @Id      @GeneratedValue(strategy = GenerationType.IDENTITY)      private Long id;      private String name;        @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)      private List<Order> orders;        // 省略構造器、getter 和 setter 方法  }
@Entity  @Table(name = "orders")  public class Order {      @Id      @GeneratedValue(strategy = GenerationType.IDENTITY)      private Long id;      private String orderNumber;      private double amount;        @ManyToOne(fetch = FetchType.LAZY)      @JoinColumn(name = "user_id")      private User user;        // 省略構造器、getter 和 setter 方法  }

現在,我們將使用對象導航來檢索一個用戶及其關聯的訂單:Apo28資訊網——每日最新資訊28at.com

// 使用 OID 檢索獲取用戶對象  User user = session.get(User.class, userId);  // 檢查用戶是否存在  if (user != null) {      // 使用對象導航訪問用戶的訂單列表      if (user.getOrders() != null) { // 確保訂單列表已經被加載或者沒有被延遲加載(取決于 FetchType)          for (Order order : user.getOrders()) {              ...        }      }}

75、hibernate如何實現原生SQL查詢?

代碼與HQL查詢類似,下面是關鍵代碼:Apo28資訊網——每日最新資訊28at.com

// 創建原生 SQL 查詢  String sql = "SELECT * FROM employees WHERE first_name = :firstName";  NativeQuery<Employee> nativeQuery = session.createNativeQuery(sql, Employee.class);  nativeQuery.setParameter("firstName", "John");  // 執行查詢并獲取結果列表  List<Employee> employees = nativeQuery.getResultList();

76、hibernate 實體類可以被定義為 final 嗎?

在Hibernate中,實體類可以被定義為final。然而,如果實體類被定義為final,那么Hibernate在進行一些代理和延遲加載等操作時可能會遇到一些限制。因為Hibernate通常會創建代理類來對實體類進行一些操作,而final類無法被繼承,所以可能會導致Hibernate無法生成有效的代理類或拋出異常。Apo28資訊網——每日最新資訊28at.com

通常情況下,建議不要將實體類定義為final,以免出現潛在的問題。如果需要限制對實體類的繼承,可以通過其他方式來實現,如在類的設計中采用不可變對象模式、使用其他方式來限制繼承等。Apo28資訊網——每日最新資訊28at.com

77、在 hibernate 中使用 Integer 和 int 做映射有什么區別?

使用對象類型Integer允許實體屬性值為null,而基礎數據類型int則不允許。Apo28資訊網——每日最新資訊28at.com

對于基本數據類型int,JVM直接在棧內存中為其分配空間,因此訪問速度更快。Integer對象在堆內存中分配空間,并通過引用訪問。雖然現代JVM的性能優化已經使得這種差異變得很小,但在處理大量數據或高并發場景下,基本數據類型的性能優勢可能會更加明顯。Apo28資訊網——每日最新資訊28at.com

78、項目中是如何實現權限驗證的,權限驗證需要幾張表?

Spring Security 是實現權限驗證的常用框架,通常需要三張表來實現基本的權限驗證。Apo28資訊網——每日最新資訊28at.com

Spring Security提供了一套全面的安全服務,包括身份認證、權限授權等功能。在實現權限驗證時,通常會使用到該框架提供的多種機制和擴展點。例如,通過實現UserDetailsService接口并覆寫里面的用戶認證方法,可以自定義用戶的認證邏輯。此外,權限管理過程包括鑒權管理和授權管理,即判斷用戶是否有權訪問某個資源以及如何將權限分配給用戶。Apo28資訊網——每日最新資訊28at.com

對于權限驗證所需的表結構,RBAC(Role-Based Access Control,基于角色的訪問控制)模型是一個常見的設計模式。在這個模型中,通常至少需要三張表:用戶表、角色表、權限表。用戶表存儲用戶信息,角色表定義了不同的角色,而權限表則規定了不同角色可以執行的操作。除此之外,還需要兩張關系表來維護用戶和角色之間、角色和權限之間的關系。這些表共同構成了權限驗證的基礎數據結構。Apo28資訊網——每日最新資訊28at.com

在設計和實施權限驗證系統時,開發者需要根據實際業務需求和技術選型來決定具體的實現方式和所需表結構。Apo28資訊網——每日最新資訊28at.com

79、說說你對RBAC的理解?

RBAC 的核心思想是將權限賦予角色,然后將角色賦予用戶。這種分離讓系統管理員能夠更容易地管理和控制資源的訪問權限。通過 RBAC,可以對用戶的權限進行集中管理,確保授權的一致性。 RBAC 主要包括三種基本權利:用戶、角色和權限。當用戶和角色是多對多的關系,當用戶角色變更時只需要對關系進行更改即可,簡化了權限管理工作。RBAC 通過模塊化的方式進行權限管理,可以減少權限管理的復雜性,提高系統的安全性。Apo28資訊網——每日最新資訊28at.com

這是RBAC的基礎模型。在RBAC0中,角色是權限的集合,用戶則被分配到這些角色中。用戶通過其角色獲得訪問資源的權限。RBAC0模型主要關注用戶、角色和權限之間的基本關系。Apo28資訊網——每日最新資訊28at.com

RBAC1在RBAC0的基礎上增加了角色繼承的概念。在RBAC1中,角色可以繼承其他角色的權限,形成一個角色層次結構。這種繼承關系使得權限的管理更加靈活和方便,可以滿足更復雜的權限控制需求。Apo28資訊網——每日最新資訊28at.com

RBAC2是RBAC的擴展模型,引入了約束的概念。這些約束可以是靜態的,也可以是動態的,用于限制角色、權限和用戶之間的關聯關系。例如,可以設置約束來防止某個角色被賦予過多的權限,或者限制某個用戶只能被分配到特定的角色中。Apo28資訊網——每日最新資訊28at.com

RBAC3結合了RBAC1和RBAC2的特性,既支持角色繼承,又允許定義約束來限制權限的分配和使用。這使得RBAC3成為一個功能全面且高度可配置的權限管理模型。Apo28資訊網——每日最新資訊28at.com

80、rbac的實現理論分析

在實現RBAC(基于角色的訪問控制)時,需要考慮以下因素:Apo28資訊網——每日最新資訊28at.com

  • 角色定義:定義系統中所有角色和這些角色可以執行的權限或操作。
  • 權限管理:對系統中需要進行控制的所有資源和操作進行明確定義,并分配相應的權限。
  • 用戶-角色分配:確定系統中的用戶與角色之間的關聯關系,即哪些用戶屬于哪些角色。
  • 角色-權限分配:明確每個角色所具有的權限。這個關系是角色擁有哪些權限的映射。
  • 角色層級關系(如果需要):在某些情況下,需要為角色定義父子關系以實現角色的繼承和權限的繼承。
  • 安全策略實施:制定并實施適當的安全策略,包括訪問控制列表、訪問策略、密碼策略等。
  • 審計和監控:監控系統對權限的使用情況,進行審計和日志記錄,以及定期的安全審查和漏洞分析。
  • 用戶界面及管理工具:提供用戶管理界面和權限管理界面,以便管理員和用戶能夠方便地管理和使用RBAC系統。
  • 用戶認證和會話管理:RBAC系統通常需要與用戶認證和會話管理系統集成,以確保合法用戶可以正常訪問系統資源。
  • 數據庫設計:RBAC系統的實現通常涉及數據庫設計,包括用戶、角色、權限信息的存儲和管理。
  • 系統優化和性能:為支持RBAC系統的高效運行,可能需要對系統進行特定的優化,確保系統可以快速、安全地進行權限驗證和驗證。

81、rbac攔截器權限控制關鍵代碼?

Java RBAC攔截器權限控制的關鍵代碼如下:Apo28資訊網——每日最新資訊28at.com

(1)定義權限注解

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Permission {    String[] value() default {};}

(2)實現攔截器

public class PermissionInterceptor implements HandlerInterceptor {    @Autowired    private UserService userService;    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        // 獲取請求的URL        String url = request.getRequestURI();        // 獲取當前登錄用戶的角色列表        List<String> roles = userService.getRolesByUsername(request.getRemoteUser());        // 判斷是否有訪問該URL的權限        if (hasPermission(url, roles)) {            return true;        } else {            response.sendError(HttpServletResponse.SC_FORBIDDEN);            return false;        }    }    private boolean hasPermission(String url, List<String> roles) {        // 根據URL和角色列表判斷是否有訪問權限        // 這里可以根據具體的業務邏輯進行判斷,例如查詢數據庫等        // 如果具有訪問權限,返回true;否則返回false        return true;    }}

(3)配置攔截器

@Configurationpublic class WebMvcConfig implements WebMvcConfigurer {    @Autowired    private PermissionInterceptor permissionInterceptor;    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(permissionInterceptor).addPathPatterns("/**");    }}

(4)在需要控制權限的方法上添加注解

@RestControllerpublic class UserController {    @Permission({"ROLE_ADMIN", "ROLE_USER"})    @GetMapping("/users")    public List<User> getUsers() {        // ...    }}

當用戶訪問/users接口時,攔截器會根據用戶的角色列表判斷是否具有訪問權限。如果具有訪問權限,則允許訪問;否則返回403 Forbidden錯誤。Apo28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-83628-0.html81道SSM經典面試題總結

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 美團二面:SpringBoot讀取配置優先級順序是什么?

下一篇: 一篇帶給你 Spring 循環依賴詳解

標簽:
  • 熱門焦點
Top