① 真實版Spring面試題,歡迎作答!
1.ApplicationContext提供了BeanFactory所能提供的功能管理,包括bean的載入,實例化,維護bean之間的依賴關系,負責bean的聲明周期之外,還提供了更完整的框架功能:
a. 國際化支持
通過配置org.springframework.context.support.ResourceBundleMessageSource
b. 資源訪問:Resource rs = ctx. getResource(「classpath:config.properties」), file:c:/config.properties」
c. 事件傳遞:通過實現ApplicationContextAware介面
2. 默認scope是singleton,另外幾個范圍是 prototype
區別是singleton 只在初始化時候創建一個對象
prototype 在每次訪問都會創建一個對象
3.根據輸入的參數創建實例對象
一種為setter
定義property name 在class裡面使用setter方法定義對象
一種為constractor
定義constructor-arg
4.沒有
5. Log
定義促銷活動日誌
@Aspect
public class logpromotion{
@Before("execution(* com.herb.aop.PromotionOwner.*(..))")
public void before(JoinPoint joinPoint){
System.out.println("Logging before " + joinPoint.getSignature().getName());
}
}
public class PromotionOwner.BuyXgetYfree{
....
}
6.Before Advice 方法執行前
Around Advice 方法執行時
After Advice 方法執行後
Throw Advice 方法出現異常
② 面試題:說說你對spring的理解
原文:https://www.hu.com/question
Spring是一個十分龐大的體系,具體可以訪問它的官網https://spring.io/projects進行詳細了解。
首先,回答這個問題,可以先介紹一下Spring體系中的幾個項目:
SpringFramework
SpringData
SpringSecurity
SpringBoot
SpringCloud
當然,除了這些之外,Spring還包括很多其他的項目。
接著,著重介紹SpringFramework這個項目,它是一個開源的java/JavaEE全功能棧的應用程序,SpringFramework提供了一個簡易的開發方式,這種開發方式可以避免使用那些可能致使底層代碼變得繁雜混亂的大量的屬性文件和幫助類。
Spring的這種低侵入式設計使代碼的污染極低。
SpringFramework包括以下部分:
構造方法注入
下面舉個例子來說明一下什麼是依賴注入:
假設類A因功能F需要調用類B,傳統的程序中,我們就會去new一個類B的對象,因而類A就會依賴類於類B,這就是說如果類B不存在,則類A也就無法使用。而使用依賴注入以後,類A只需要去調用實現功能F介面的一個實現類,這個實現類可能是類B,C等等,具體調用誰是有Spring的配置文件決定的,這樣類A就不再依賴於類B。
我們可以這樣理解控制反轉:
資源不是由使用資源的雙方進行管理,而是由不使用資源的第三方(即Spring容器)進行管理,這樣做的好處是:
資源集中管理,實現資源的可配置與易管理
降低使用資源雙方的依賴程度
在傳統程序中,當某個角色需要另外一個角色協助時,由調用者來創建被調用者的實例。而在Spring中,創建被調用者的的工作不再由調用者來完成,而由第三方Spring容器來完成,所以稱為控制反轉,Spring容器創建被調用者的實例,然後注入調用者,所以又稱為依賴注入。
③面向切面編程
AOP在Spring中主要表現在兩個方面:
提供聲明式事務管理
Spring支持用戶自定義切面
面向切面編程是對面向對象編程(OOP)的補充。面向對象編程將程序分解成為各個層次的對象,面向切面編程將程序運行過程分解成各個切面。面向切面編程基於動態代理實現,降低了類直接的耦合程度。Spring的事務管理就是基於AOP實現的。
免費資源教程
③ Spring中的ioc和aop有什麼作用為什麼要用ioc和aop面試中多次被問到,求一個詳細 清晰的解答...
還是需要去了解,多看看書!
IOC:控制反轉,是一種設計模式。一層含義是控制權的轉移:由傳統的在程序中控制依賴轉移到由容器來控制;第二層是依賴注入:將相互依賴的對象分離,在spring配置文件中描述他們的依賴關系。他們的依賴關系只在使用的時候才建立。簡單來說就是不需要NEW一個對象了。
AOP:面向切面,是一種編程思想,OOP的延續。將系統中非核心的業務提取出來,進行單獨處理。比如事務、日誌和安全等。這個簡單來說就是可以在一段程序之前或者之後做一些事。
Spring 的AOP和IOC都是為了解決系統代碼耦合度過高的問題。使代碼重用度高、易於維護。
不過AOP和IOC並不是spring中特有的,只是spring把他們應用的更靈活方便
④ "對spring的理解,面向aop編程的具體實現",這道面試題如何回答是好
aop,面向切面編程,他的最底層是實現的動態代理設計模式。
你可以把這個設計模式,說給他聽就行了,如果不了解動態代理,去研究一下。
aop的底層就是這樣實現的。
⑤ spring源碼怎麼讀
在我們的生活之中,有形形色色的萬物(Object),有飛機,有汽車,有輪船,還有我這個滄海一粟的java講師。
試問:了解飛機底層架構的人,就一定能把飛機開好嗎?精通汽車的構造和底層原理的人,就保證開車不出事故嗎?或者反過來問,一個多年的開計程車的老司機,技術非常嫻熟,但是你問他汽車的架構和底層原理,你覺得有多少老司機能准確的答出來?
那就對了,了解了,讀懂了spring底層源碼的程序員,我們並不能保證他就是一個好程序員,我心中的一個好的程序員是要能夠提出解決方案的程序員,就好比清華北大確實只是個過程,最後的目的,是為國家為人民做出奉獻才是我們活著的價值。所以說我並不看好去閱讀spring源碼這個行為。聞道有先後,術業有專攻,我們不是提供底層技術的人!絕大多數的程序員,我以為正確的做法是站在巨人的肩膀上,把前輩留下來的精髓發揚光大才是正道,簡而言之,把怎麼用,和為什麼要這么用學好才是大多數程序員學習技術的關鍵。就好比去學駕照的時候,教練只需要關心你是否會開車,是否遵守交通規則,並不關心你是否了解汽車是如何在路上跑起來的。
一個人的精力和時間都是有限的,分細了來說,開發者就是技術的使用者,重點在於如何正確熟練的使用,而不是一昧地去關心底層原理,如果要完全讀懂spring源碼,首先,英語就得很厲害吧,其次,得花多少時間?就算讀懂了,那收獲和付出也不成正比,大把大把的時間為何不花在java更多,更高級,更有意義的技術上呢?筆者此話並不是說spring源碼讀了沒用,只是讓我們的時間更有價值,例如分布式微服務,區塊鏈技術,大數據,python,作為新時代的IT佼佼者,我們是否應該隨著時代的腳步,迎接嶄新的未來?我奉勸大多數人,不必去看spring源碼,除非你確實感興趣作為技術研究,這樣是可以的。一個正常的工作者,是不建議花寶貴的時間去看的,那學生就更不應該去看了。此話怎講?我以為,學生應以學業為重,士不可不弘毅,任重而道遠,首先應該擴展其知識的廣度,和技術的嫻熟使用,再培養學生獨立解決問題的能力,溝通協作的能力,最後才考慮技術的深度。
筆者在多年前也被面試過很多很多問題,但是從來沒有一個面試官會問spring底層源碼,曾經阿里巴巴的架構師也面試過我,直到後來,我成為了面試官,當我去面試別人的時候,我也不會去問spring源碼這些東西,因為99.9%企業招人進來,是要做事實的,不是讓你去研究一個技術,絕大多數更在乎的是利用現有的技術,去完成一些項目功能。除了世界上極少數著名的企業他們需要技術研究員,才對這些有所要求,那要招這類人才,估計至少也是名校研究生以上吧,所以普通程序開發者,我覺得學好技術的正確與熟練使用,才是重中之重!
不宜本末倒置,不宜好高騖遠。筆者從事Java行業以來,真要說全階段全程全棧都精通的人,應屬風毛菱角,故此,更應讓所學知識運籌帷幄,舉一反三,千里爐火,萬里純青。以上篇幅在說我對閱讀spring源碼的一些強烈建議,最終結論,是不看、不讀就此作罷。
那有的感興趣的人非要閱讀呢?
Ok,其實閱讀spring源碼並不算很難。
首先,應該去官網spring.io閱讀寫spring框架的理念,就好比讀一本書,要閱讀這本書的綱要,要明白為什麼要設計spring架構。
然後,應該分模塊閱讀,先從核心模塊開始閱讀:如:
IoC Container, Events, Resources, i18n, Validation, Data Binding, Type Conversion, SpEL, AOP.
那麼在閱讀的時候,英文能力差的話,可以使用翻譯軟體翻譯成中文閱讀,畢竟不是每個程序員英語都很棒,畢竟中國人看中國字更容易去理解。當然,有些翻譯過來的並不準確,這個時候可以利用網路,去查看那段不理解的地方。
然後,把spring的jar包下載下來,利用IDEA打開,可以使用download資源,會發現,每個方法上面都會有詳細的英文注釋。一邊看官方的說明,一邊查看代碼的編寫,不難發現,非常多的代碼寫得很精闢,所以十分考驗一個程序員的java基本功,特別是反射,JDK\CGLIB代理,和java常用的設計模式等。
⑥ spring ioc aop 的原理是什麼啊,面試時我怎麼回答才好呢說說面試技巧好嗎
IOC:控制反轉也叫依賴注入。利用了工廠模式
將對象交給容器管理,你只需要在spring配置文件總配置相應的bean,以及設置相關的屬性,讓spring容器來生成類的實例對象以及管理對象。在spring容器啟動的時候,spring會把你在配置文件中配置的bean都初始化好,然後在你需要調用的時候,就把它已經初始化好的那些bean分配給你需要調用這些bean的類(假設這個類名是A),分配的方法就是調用A的setter方法來注入,而不需要你在A裡面new這些bean了。
注意:面試的時候,如果有條件,畫圖,這樣更加顯得你懂了
AOP:面向切面編程。(Aspect-Oriented Programming)
AOP可以說是對OOP的補充和完善。OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行為的一個集合。當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關系,但並不適合定義從左到右的關系。例如日誌功能。日誌代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。在OOP設計中,它導致了大量代碼的重復,而不利於各個模塊的重用。
將程序中的交叉業務邏輯(比如安全,日誌,事務等),封裝成一個切面,然後注入到目標對象(具體業務邏輯)中去。
實現AOP的技術,主要分為兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執行;二是採用靜態織入的方式,引入特定的語法創建「方面」,從而使得編譯器可以在編譯期間織入有關「方面」的代碼
簡單點解釋,比方說你想在你的biz層所有類中都加上一個列印『你好』的功能這你經可以用aop思想來做,你先寫個類寫個方法,方法經實現列印『你好』讓後你Ioc這個類 ref=「biz.*」讓每個類都注入。
⑦ java程序員面試時問aop是什麼 該怎麼回答
面試就是要裝B
只說aop是面向切面編程只是個很基礎的概念,看過點教程的初學者都知道
所以必須得深化點,你得告訴他,aop實現原理其實是java動態代理,但是jdk的動態代理必須實現介面,所以spring的aop是用cglib這個庫實現的,cglib使用了asm這個直接操縱位元組碼的框架,所以可以做到不實現介面的情況下完成動態代理。
最好拿張紙手寫兩個例子給他,然後他就沒什麼好問的了
⑧ 面試時被問到spring是怎麼控制事務的
先說說原理:spring的核心是ioc和aop,其中ioc是將對象創建權交由spring容器(這個一帶而過,接著說aop),aop是面向切面編程,內部實現使用的是動態代理,而動態代理內部實現用的是反射。spring的事務是通過aop來實現的,從cglib.jar包就可以看出,是和動態代理相關的。
spring事務的使用:聲明式和編程式(這里你可以順便介紹一下你喜歡使用的方式)
再簡單介紹下spring的事務隔離和傳播性
最後,offer到手了
⑨ 面試官要我介紹一下spring,我該如何比較全面的回答
介紹一個東西關鍵在於你對這東西有多少了解,不同程度的了解,介紹起來也有所不同.像一般的開發過程中,對core封裝包與aop封裝包用得比較多,所以你得去查資料對這兩個封裝包的功能,應該有相當的了解,其它的在開發過程中慢慢學習
下面是spring開發手冊上對spring的簡介
Spring框架包含許多特性,並被很好地組織在下圖所示的六個模塊中。本節將依次介紹每個模塊。
Spring框架概述
Core 封裝包是框架的最基礎部分,提供IoC和依賴注入特性。這里的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程序性單例模式的需要,並真正地允許你從程序邏輯中分離出依賴關系和配置。
Context(上下文) 封裝包構築於Core封裝包的堅固基礎上:它提供了用一種框架風格的方式來訪問對象,有些像JNDI注冊表。Context封裝包繼承了beans包的功能,還增加了國際化(I18N)(用於規范resource bundle),事件傳播,資源裝載,以及透明創建上下文,例如通過servlet容器。
DAO 提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析資料庫廠商特有的錯誤代碼。 並且,JDBC 封裝包還提供了一種比編程性更好的聲明性事務管理方法,不僅僅是實現了特定介面,而且對所有的POJOs(plain old Java objects)都適用。
ORM 封裝包提供了常用的「對象/關系」映射APIs的集成層。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封裝包,可以混合使用所有Spring提供的特性進行「對象/關系」映射,如前邊提到的簡單聲明性事務管理。
Spring的 AOP 封裝包提供了符合 AOP Alliance規范的面向方面的編程(aspect-oriented programming)實現,讓你可以定義,例如方法攔截器(method-interceptors)和切點(pointcuts),從邏輯上講,從而減弱代碼的功能耦合,清晰的被分離開。而且,利用source-level的元數據功能,還可以將各種行為信息合並到你的代碼中,這有點象.Net的attribute的概念。
Spring中的 Web 包提供了基礎的針對Web開發的集成特性,例如多方文件上傳,利用Servlet listeners進行IoC容器初始化和針對Web的application context。當與WebWork或Struts一起使用Spring時,這個包使Spring可與其他框架結合。
Spring中的 MVC 封裝包提供了Web應用的Model-View-Controller(MVC)實現。Spring的MVC框架並不是僅僅提供一種傳統的實現,它提供了一種 清晰的 分離模型,在領域模型代碼和web form之間。並且,還可以藉助Spring框架的其他特性。
⑩ 面試中問到spring aop 做許可權管理 和日誌管理 的思路
aop 面向切面,首先配置spring 對頁面請求的攔劫,對攔劫的請求進行判斷許可權,讓後進行日誌的寫入。