溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java工程師有哪些常見(jiàn)spring面試題

發(fā)布時(shí)間:2021-10-29 17:41:56 來(lái)源:億速云 閱讀:138 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“Java工程師有哪些常見(jiàn)spring面試題”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java工程師有哪些常見(jiàn)spring面試題”吧!

1. 談?wù)勀銓?duì)spring的理解

    Spring是一個(gè)開(kāi)源的輕量級(jí)的IoC和AOP容器框架,它為Java 應(yīng)用程序提供了全面的基礎(chǔ)設(shè)施,其目的是簡(jiǎn)化企業(yè)應(yīng)用程序的開(kāi)發(fā),它使得開(kāi)發(fā)者只需要關(guān)心業(yè)務(wù)需求,從而提高開(kāi)發(fā)效率和系統(tǒng)的可維護(hù)性。

2.spring的配置方式

    spring常見(jiàn)的配置方式:基于XML的配置、基于注解的配置、基于Java的配置。

3.請(qǐng)列舉一下spring中有那些重要的模塊

    Spring Core:核心類(lèi)庫(kù),其spring所有功能都依賴(lài)于該類(lèi)庫(kù),提供IOC服務(wù);

    Spring Context:提供框架式的Bean訪問(wèn)方式,以及企業(yè)級(jí)功能(JNDI、定時(shí)任務(wù)等);

    Spring AOP:AOP服務(wù),提供面向方面的編程實(shí)現(xiàn);

    Spring DAO:對(duì)JDBC的抽象,簡(jiǎn)化了數(shù)據(jù)訪問(wèn)異常的處理;

    Spring ORM:對(duì)現(xiàn)有的ORM框架的支持,例如:對(duì)Hibernate的支持;

    Spring Web:為創(chuàng)建Web應(yīng)用程序提供綜合性支持,例如多方文件上傳;

    Spring MVC:提供面向Web應(yīng)用的Model-View-Controller(即:模型-視圖-控制器)實(shí)現(xiàn);

    Spring Test:提供了對(duì)JUnit和TestNG測(cè)試的支持;

    Spring Aspects:該模塊為與AspectJ的集成提供支持。

4.spring有那些優(yōu)點(diǎn)

    (1)spring采用低侵入式設(shè)計(jì),大大降低了代碼污染;

    (2)spring通過(guò)DI機(jī)制將對(duì)象之間的依賴(lài)關(guān)系交由框架處理,減低組件的耦合性;

    (3)Spring AOP技術(shù),將一些通用任務(wù),如安全、事務(wù)、日志、權(quán)限等進(jìn)行集中式管理,從而提供更好的復(fù)用。

    (4)spring對(duì)于主流的應(yīng)用框架提供了很好集成支持。

5.談?wù)勀銓?duì) Spring IoC 和 AOP的理解

     IoC 控制反轉(zhuǎn),是指創(chuàng)建對(duì)象的控制權(quán)的轉(zhuǎn)移,以前創(chuàng)建對(duì)象的主動(dòng)權(quán)和時(shí)機(jī)是由自己把控的,而現(xiàn)在這種權(quán)力轉(zhuǎn)移到Spring容器中,并由容器根據(jù)配置文件去創(chuàng)建實(shí)例和管理各個(gè)實(shí)例之間的依賴(lài)關(guān)系,對(duì)象與對(duì)象之間松散耦合,也利于功能的復(fù)用。DI依賴(lài)注入,和控制反轉(zhuǎn)是同一個(gè)概念的不同角度的描述,即 應(yīng)用程序在運(yùn)行時(shí)依賴(lài)IoC容器來(lái)動(dòng)態(tài)注入對(duì)象需要的外部資源。  

    AOP面向切面編程,可以說(shuō)它是對(duì)面向?qū)ο缶幊蹋ㄗⅲ好嫦驅(qū)ο蠛?jiǎn)稱(chēng)(OOP): 允許開(kāi)發(fā)者定義縱向的關(guān)系,但并適用于定義橫向的關(guān)系,導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用)的一種補(bǔ)充用于將那些與業(yè)務(wù)無(wú)關(guān),但卻對(duì)多個(gè)對(duì)象產(chǎn)生影響的公共行為和邏輯,抽取并封裝為一個(gè)可重用的模塊,這個(gè)模塊被命名為“切面”(Aspect),減少系統(tǒng)中的重復(fù)代碼,降低了模塊間的耦合度,同時(shí)提高了系統(tǒng)的可維護(hù)性??捎糜跈?quán)限認(rèn)證、日志、事務(wù)處理。

6.Spring IoC 的注入方式

    注入方式:構(gòu)造器注入、注解注入、setter方法注入

7.BeanFactory和ApplicationContext有什么區(qū)別?

    BeanFactory和ApplicationContext是Spring的兩大核心接口,都可以當(dāng)做Spring的容器。其中ApplicationContext是BeanFactory的子接口。

    (1)BeanFactory:是Spring里面最底層的接口,包含了各種Bean的定義,讀取bean配置文檔,管理bean的加載、實(shí)例化,控制bean的生命周期,維護(hù)bean之間的依賴(lài)關(guān)系。ApplicationContext接口作為BeanFactory的派生,除了提供BeanFactory所具有的功能外,還提供了更完整的框架功能:

        ①繼承MessageSource,因此支持國(guó)際化。

        ②統(tǒng)一的資源文件訪問(wèn)方式。
        ③提供在監(jiān)聽(tīng)器中注冊(cè)bean的事件。
        ④同時(shí)加載多個(gè)配置文件。
        ⑤載入多個(gè)(有繼承關(guān)系)上下文 ,使得每一個(gè)上下文都專(zhuān)注于一個(gè)特定的層次,比如應(yīng)用的web層。

  (2)①BeanFactroy采用的是延遲加載形式來(lái)注入Bean的,即只有在使用到某個(gè)Bean時(shí)(調(diào)用getBean()),才對(duì)該Bean進(jìn)行加載實(shí)例化。這樣,我們就不能發(fā)現(xiàn)一些存在的Spring的配置問(wèn)題。如果Bean的某一個(gè)屬性沒(méi)有注入,BeanFacotry加載后,直至第一次使用調(diào)用getBean方法才會(huì)拋出異常。

        ②ApplicationContext,它是在容器啟動(dòng)時(shí),一次性創(chuàng)建了所有的Bean。這樣,在容器啟動(dòng)時(shí),我們就可以發(fā)現(xiàn)Spring中存在的配置錯(cuò)誤,這樣有利于檢查所依賴(lài)屬性是否注入。 ApplicationContext啟動(dòng)后預(yù)載入所有的單實(shí)例Bean,通過(guò)預(yù)載入單實(shí)例bean ,確保當(dāng)你需要的時(shí)候,你就不用等待,因?yàn)樗鼈円呀?jīng)創(chuàng)建好了。

        ③相對(duì)于基本的BeanFactory,ApplicationContext 唯一的不足是占用內(nèi)存空間。當(dāng)應(yīng)用程序配置Bean較多時(shí),程序啟動(dòng)較慢。

    (3)BeanFactory通常以編程的方式被創(chuàng)建,ApplicationContext還能以聲明的方式創(chuàng)建,如使用ContextLoader。

(4)BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但兩者之間的區(qū)別是:BeanFactory需要手動(dòng)注冊(cè),而ApplicationContext則是自動(dòng)注冊(cè)。

8.Spring AOP和AspectJ AOP有什么區(qū)別?

    Spring AOP是屬于運(yùn)行時(shí)增強(qiáng),而AspectJ是編譯時(shí)增強(qiáng)。Spring AOP基于代理(Proxying),而AspectJ基于字節(jié)碼操作(Bytecode Manipulation)。
    Spring AOP已經(jīng)集成了AspectJ,AspectJ應(yīng)該算得上是Java生態(tài)系統(tǒng)中最完整的AOP框架了。AspectJ相比于Spring AOP功能更加強(qiáng)大,但是Spring AOP相對(duì)來(lái)說(shuō)更簡(jiǎn)單。
    如果我們的切面比較少,那么兩者性能差異不大。但是,當(dāng)切面太多的話,最好選擇AspectJ,它比SpringAOP快很多。

9.Spring中的bean生命周期

(1)實(shí)例化Bean:
    對(duì)于BeanFactory容器,當(dāng)客戶向容器請(qǐng)求一個(gè)尚未初始化的bean時(shí),或初始化bean的時(shí)候需要注入另一個(gè)尚未初始化的依賴(lài)時(shí),容器就會(huì)調(diào)用createBean進(jìn)行實(shí)例化。對(duì)于ApplicationContext容器,當(dāng)容器啟動(dòng)結(jié)束后,通過(guò)獲取BeanDefinition對(duì)象中的信息,實(shí)例化所有的bean。


(2)設(shè)置對(duì)象屬性(依賴(lài)注入):
    實(shí)例化后的對(duì)象被封裝在BeanWrapper對(duì)象中,緊接著,Spring根據(jù)BeanDefinition中的信息 以及 通過(guò)BeanWrapper提供的設(shè)置屬性的接口完成依賴(lài)注入。


(3)處理Aware接口:
    接著,Spring會(huì)檢測(cè)該對(duì)象是否實(shí)現(xiàn)了xxxAware接口,并將相關(guān)的xxxAware實(shí)例注入給Bean:
        ①如果這個(gè)Bean已經(jīng)實(shí)現(xiàn)了BeanNameAware接口,會(huì)調(diào)用它實(shí)現(xiàn)的setBeanName(String beanId)方法,此處傳遞的就是Spring配置文件中Bean的id值;
        ②如果這個(gè)Bean已經(jīng)實(shí)現(xiàn)了BeanFactoryAware接口,會(huì)調(diào)用它實(shí)現(xiàn)的setBeanFactory()方法,傳遞的是Spring工廠自身。
        ③如果這個(gè)Bean已經(jīng)實(shí)現(xiàn)了ApplicationContextAware接口,會(huì)調(diào)用setApplicationContext(ApplicationContext)方法,傳入Spring上下文;


(4)BeanPostProcessor:
    如果想對(duì)Bean進(jìn)行一些自定義的處理,那么可以讓Bean實(shí)現(xiàn)了BeanPostProcessor接口,那將會(huì)調(diào)用postProcessBeforeInitialization(Object obj, String s)方法。


(5)InitializingBean 與 init-method:
       如果Bean在Spring配置文件中配置了 init-method 屬性,則會(huì)自動(dòng)調(diào)用其配置的初始化方法。


(6)如果這個(gè)Bean實(shí)現(xiàn)了BeanPostProcessor接口,將會(huì)調(diào)用postProcessAfterInitialization(Object obj, String s)方法;由于這個(gè)方法是在Bean初始化結(jié)束時(shí)調(diào)用的,所以可以被應(yīng)用于內(nèi)存或緩存技術(shù);
以上幾個(gè)步驟完成后,Bean就已經(jīng)被正確創(chuàng)建了,之后就可以使用這個(gè)Bean了。


(7)DisposableBean:
    當(dāng)Bean不再需要時(shí),會(huì)經(jīng)過(guò)清理階段,如果Bean實(shí)現(xiàn)了DisposableBean這個(gè)接口,會(huì)調(diào)用其實(shí)現(xiàn)的destroy()方法;


(8)destroy-method:
    最后,如果這個(gè)Bean的Spring配置中配置了destroy-method屬性,會(huì)自動(dòng)調(diào)用其配置的銷(xiāo)毀方法。

生命周期如下圖所示:

Java工程師有哪些常見(jiàn)spring面試題

Java工程師有哪些常見(jiàn)spring面試題  

10.Spring MVC的工作原理

流程說(shuō)明:
(1).客戶端(瀏覽器)發(fā)送請(qǐng)求,直接請(qǐng)求到DispatcherServlet。
(2).DispatcherServlet根據(jù)請(qǐng)求信息調(diào)用HandlerMapping,解析請(qǐng)求對(duì)應(yīng)的Handler。
(3).解析到對(duì)應(yīng)的Handler(也就是我們平常說(shuō)的Controller控制器)。
(4).HandlerAdapter會(huì)根據(jù)Handler來(lái)調(diào)用真正的處理器來(lái)處理請(qǐng)求和執(zhí)行相對(duì)應(yīng)的業(yè)務(wù)邏輯。
(5).處理器處理完業(yè)務(wù)后,會(huì)返回一個(gè)ModelAndView對(duì)象,Model是返回的數(shù)據(jù)對(duì)象,View是邏輯上的View。
(6).ViewResolver會(huì)根據(jù)邏輯View去查找實(shí)際的View。
(7).DispatcherServlet把返回的Model傳給View(視圖渲染)。
(8).把View返回給請(qǐng)求者(瀏覽器)。

如下圖所示:

Java工程師有哪些常見(jiàn)spring面試題

11.Spring框架中用到了哪些設(shè)計(jì)模式

(1).工廠模式:Spring 中BeanFactory就是簡(jiǎn)單工廠模式的體現(xiàn),用來(lái)創(chuàng)建bean對(duì)象。
(2).代理模式:Spring AOP功能的實(shí)現(xiàn)用到了JDK的動(dòng)態(tài)代理和CGLIB字節(jié)碼生成技術(shù)。
(3).單例模式:Spring中的bean默認(rèn)都是單例的。
(4).模板方法:Spring中的jdbcTemplate、hibernateTemplate等以Template結(jié)尾的對(duì)數(shù)據(jù)庫(kù)操作的類(lèi),它們就使用到了模板模式,主要用來(lái)解決代碼重復(fù)。
(5).包裝器模式:我們的項(xiàng)目需要連接多個(gè)數(shù)據(jù)庫(kù),而且不同的客戶在每次訪問(wèn)中根據(jù)需要會(huì)去訪問(wèn)不同的數(shù)據(jù)庫(kù)。這種模式讓我們可以根據(jù)客戶的需求能夠動(dòng)態(tài)切換不同的數(shù)據(jù)源。
(6).觀察者模式:Spring事件驅(qū)動(dòng)模型就是觀察者模式很經(jīng)典的一個(gè)應(yīng)用。
(7).適配器模式:Spring AOP的增強(qiáng)或通知(Advice)使用到了適配器模式、Spring MVC中也是用到了適配器模式適配Controller

12.spring中bean的作用域

    Spring容器中的bean可以分為5個(gè)范圍:

    (1). singleton:默認(rèn),每個(gè)容器中只有一個(gè)bean的實(shí)例,單例的模式由BeanFactory自身來(lái)維護(hù)。
    (2).prototype:為每一個(gè)bean請(qǐng)求提供一個(gè)實(shí)例。
    (3).request:為每一個(gè)網(wǎng)絡(luò)請(qǐng)求創(chuàng)建一個(gè)實(shí)例,在請(qǐng)求完成以后,bean會(huì)失效并被垃圾回收器回收。
    (4).session:與request范圍類(lèi)似,確保每個(gè)session中有一個(gè)bean的實(shí)例,在session過(guò)期后,bean會(huì)隨之失效。
    (5).global-session:全局作用域,global-session和Portlet應(yīng)用相關(guān)。當(dāng)你的應(yīng)用部署在Portlet容器中工作時(shí),它包含很多portlet。如果你想要聲明讓所有的portlet共用全局的存儲(chǔ)變量的話,那么這全局變量需要存儲(chǔ)在global-session中。全局作用域與Servlet中的session作用域效果相同。

13.Spring基于xml注入bean的幾種方式

    (1)Set方法注入;

    (2)構(gòu)造器注入:①通過(guò)index設(shè)置參數(shù)的位置;②通過(guò)type設(shè)置參數(shù)類(lèi)型;

    (3)靜態(tài)工廠注入;

    (4)實(shí)例工廠

14.Spring框架xml配置中有哪幾種自動(dòng)裝配

    在Spring框架xml配置中共有5種自動(dòng)裝配:

    (1)no:默認(rèn)的方式是不進(jìn)行自動(dòng)裝配的,通過(guò)手工設(shè)置ref屬性來(lái)進(jìn)行裝配bean。

    (2)byName:通過(guò)bean的名稱(chēng)進(jìn)行自動(dòng)裝配,如果一個(gè)bean的 property 與另一bean 的name 相同,就進(jìn)行自動(dòng)裝配。 

    (3)byType:通過(guò)參數(shù)的數(shù)據(jù)類(lèi)型進(jìn)行自動(dòng)裝配。

    (4)constructor:利用構(gòu)造函數(shù)進(jìn)行裝配,并且構(gòu)造函數(shù)的參數(shù)通過(guò)byType進(jìn)行裝配。

    (5)autodetect:自動(dòng)探測(cè),如果有構(gòu)造方法,通過(guò) construct的方式自動(dòng)裝配,否則使用 byType的方式自動(dòng)裝配。

15.spring中bean的常用注解有哪些

    (1).@Component注解。通用的注解,可標(biāo)注任意類(lèi)為Spring組件。如果一個(gè)Bean不知道屬于哪一個(gè)層,可以使用@Component注解標(biāo)注。

    (2).@Repository注解。對(duì)應(yīng)持久層,即Dao層,主要用于數(shù)據(jù)庫(kù)相關(guān)操作。

    (3).@Service注解。對(duì)應(yīng)服務(wù)層,即Service層,主要涉及一些復(fù)雜的邏輯,需要用到Dao層(注入)。

    (4).@Controller注解。對(duì)應(yīng)Spring MVC的控制層,即Controller層,主要用于接受用戶請(qǐng)求并調(diào)用Service層的方法返回?cái)?shù)據(jù)給前端頁(yè)面。

到此,相信大家對(duì)“Java工程師有哪些常見(jiàn)spring面試題”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI