Spring基礎面試題


1、談談你對Spring的理解酥宴?

spring 是一個開源的輕量級 JavaBean 容器框架啦吧。使用 JavaBean 代替 EJB ,并提供了豐富的企業(yè)應用功能拙寡,降低應用開發(fā)的復雜性授滓。

1)輕量:非入侵性的、所依賴的東西少肆糕、資源占用少般堆、部署簡單,不同功能選擇不同的 jar 組合诚啃;

2)容器:工廠模式實現對 JavaBean 進行管理淮摔,通過控制反轉(IOC)將應用程序的配置和依賴性與應用代碼分開;

3)低耦合:通過 xml 配置或注解即可完成 bean 的依賴注入始赎;

4)AOP:通過 xml 配置 或注解即可加入面向切面編程的能力和橙,完成切面功能仔燕,如:日志,事務等的統一處理魔招;

5)方便集成:通過配置和簡單的對象注入即可集成其他框架晰搀,如 Mybatis、Hibernate办斑、Shiro等厕隧;

6)豐富的功能:JDBC 層抽象、事務管理俄周、MVC吁讨、Java Mail、任務調度峦朗、JMX建丧、JMS、JNDI波势、EJB翎朱、動態(tài)語言、遠程訪問尺铣、Web Service等拴曲。

2、使用Spring框架的好處是什么凛忿?

輕量:Spring 是輕量的澈灼,基本的版本大約2MB。

控制反轉:Spring通過控制反轉實現了松散耦合店溢,對象們給出它們的依賴叁熔,而不是創(chuàng)建或查找依賴的對象們。

面向切面的編程(AOP):Spring支持面向切面的編程床牧,并且把應用業(yè)務邏輯和系統服務分開荣回。 容器:Spring 包含并管理應用中對象的生命周期和配置。

MVC框架:Spring的WEB框架是個精心設計的框架戈咳,是Web框架的一個很好的替代品心软。

事務管理:Spring 提供一個持續(xù)的事務管理接口,可以擴展到上至本地事務下至全局事務(JTA)著蛙。

異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC删铃,Hibernate or JDO拋出的)轉化為一致的unchecked 異常。

3册踩、什么是Ioc?

IoC (Inversion of Control) 控制反轉泳姐。是一種設計思想,在Java開發(fā)中暂吉,將你設計好的對象交給容器控制胖秒,而不是顯式地用代碼進行對象的創(chuàng)建缎患。 把創(chuàng)建和查找依賴對象的控制權交給 IoC 容器,由 IoC 容器進行注入阎肝、組合對象挤渔。這樣對象與對象之間是松耦合、便于測試风题、功能可復用的(減少對象的創(chuàng)建和內存消耗)判导,使得程序的整個體系結構可維護性、靈活性沛硅、擴展性變高眼刃。然后它底層原理的話是用到了Java的反射機制,之前我有在猜測它是不是用運行時類也就是Class.forname();的方法摇肌,因為我們使用Spring的時候是需要在xml文件或者通過注解的方式配置bean的擂红,我們提供了類的全類名,然后IoC容器通過Class.forName()方法围小,去幫我們創(chuàng)建對象昵骤,結果我發(fā)現不是,它是使用 ClassLoader來加載類肯适,有興趣的小伙伴請自行去了解為什么(因為我也不懂)变秦。

使用 IoC 的好處:
1)資源集中管理,實現資源的可配置和易管理框舔;
2)降低了資源的依賴程度蹦玫,即松耦合;
3)便于測試雨饺;
4)功能可復用(減少對象的創(chuàng)建和內存消耗)钳垮;
5)使得程序的整個體系結構可維護性、靈活性额港、擴展性變高。

4歧焦、什么是AOP?

AOP: Aspect Oriented Programming移斩,面向切面編程。在面向對象編程(OOP)思想中绢馍,我們將事物縱向抽象成一個個的對象向瓷。而在面向切面編程中,我們將一個個對象某些類似的方面橫向抽象成一個切面舰涌,對這個切面進行一些如權限驗證猖任,事物管理,記錄日志等公用操作處理的過程就是面向切面編程的思想瓷耙。通過預編譯和運行期動態(tài)代理實現程序功能的統一維護朱躺。在Spring框架中刁赖,AOP就是一個很重要的功能。

實現 AOP 的方式
1)創(chuàng)建容器對象的時候长搀,根據切入點表達式攔截的類宇弛,生成代理對象。
2)如果目標對象有實現接口源请,使用JDK動態(tài)代理的方式枪芒。如果目標對象沒有實現接口,則使用CGLib代理谁尸。然后從容器獲取代理后的對象舅踪,在運行期植入"切面"類的方法。

Spring中AOP實現的兩種方式都是基于動態(tài)代理的方式下良蛮,有想法的小伙伴可以自行思考為什么AOP實現要用動態(tài)代理抽碌,用靜態(tài)代理不可以嗎?

大體功能
1)Spring聲明式事務管理配置背镇;
2) Controller層的參數校驗咬展;
3) 使用Spring AOP實現MySQL數據庫讀寫分離案例分析;
4.) 在執(zhí)行方法前,判斷是否具有權限瞒斩;
5)對部分函數的調用進行日志記錄破婆。監(jiān)控部分重要函數,若拋出指定的異常胸囱,可以以短信或郵件方式通知相關人員祷舀;
6) 信息過濾,頁面轉發(fā)等等功能烹笔。

5裳扯、Spring常見注解?
注解名稱 作用
@Controller 組合注解(組合了@Component注解)谤职,應用在MVC層(控制層),DispatcherServlet會自動掃描注解了此注解的類饰豺,然后將web請求映射到注解了@RequestMapping的方法上。
@Service 組合注解(組合了@Component注解)允蜈,應用在service層(業(yè)務邏輯層)
@Reponsitory 組合注解(組合了@Component注解)冤吨,應用在dao層(數據訪問層)
@Component 表示一個帶注釋的類是一個“組件”殃姓,成為Spring管理的Bean鳞陨。當使用基于注解的配置和類路徑掃描時柜去,這些類被視為自動檢測的候選對象纳猪。同時@Component還是一個元注解夭苗。
@Autowired Spring提供的工具(由Spring的依賴注入工具(BeanPostProcessor宅楞、BeanFactoryPostProcessor)自動注入落塑。)
@Resource JSR-250提供的注解
@Inject JSR-330提供的注解
@Configuration 聲明當前類是一個配置類
@ComponentScan 自動掃描指定包下所有使用@Service,@Component,@Controller,@Repository的類并注冊
@Bean 注解在方法上朱庆,聲明當前方法的返回值為一個Bean。返回的Bean對應的類中可以定義init()方法和destroy()方法捺癞,然后在@Bean(initMethod=”init”,destroyMethod=”destroy”)定義夷蚊,在構造之后執(zhí)行init,在銷毀之前執(zhí)行destroy翘簇。
@Aspect 聲明一個切面(就是說這是一個額外功能)
@After 后置建言(advice)撬码,在原方法前執(zhí)行。
@Before 前置建言(advice)版保,在原方法后執(zhí)行呜笑。
@Around 環(huán)繞建言(advice),在原方法執(zhí)行前執(zhí)行彻犁,在原方法執(zhí)行后再執(zhí)行(@Around可以實現其他兩種advice)
@PointCut 聲明切點叫胁,即定義攔截規(guī)則,確定有哪些方法會被切入
@Transactional 聲明事務(一般默認配置即可滿足要求汞幢,當然也可以自定義)
@Cacheable 聲明數據緩存
@EnableAspectJAutoProxy 開啟Spring對AspectJ的支持
@Value 值得注入驼鹅。經常與Sping EL表達式語言一起使用,注入普通字符森篷,系統屬性输钩,表達式運算結果,其他Bean的屬性仲智,文件內容买乃,網址請求內容,配置文件屬性值等等
@PropertySource 指定文件地址钓辆。提供了一種方便的剪验、聲明性的機制,用于向Spring的環(huán)境添加PropertySource前联。與@configuration類一起使用功戚。
@PostConstruct 標注在方法上,該方法在構造函數執(zhí)行完成之后執(zhí)行似嗤。
@PreDestroy 標注在方法上啸臀,該方法在對象銷毀之前執(zhí)行。
@Profile 表示當一個或多個指定的文件是活動的時烁落,一個組件是有資格注冊的壳咕。使用@Profile注解類或者方法,達到在不同情況下選擇實例化不同的Bean顽馋。@Profile(“dev”)表示為dev時實例化。
@EnableAsync 開啟異步任務支持幌羞。注解在配置類上寸谜。
@Async 注解在方法上標示這是一個異步方法,在類上標示這個類所有的方法都是異步方法属桦。
@EnableScheduling 注解在配置類上熊痴,開啟對計劃任務的支持他爸。
@Scheduled 注解在方法上,聲明該方法是計劃任務果善。支持多種類型的計劃任務:cron,fixDelay,fixRate
@Conditional 根據滿足某一特定條件創(chuàng)建特定的Bean
@Enable* 通過簡單的@Enable來開啟一項功能的支持诊笤。所有@Enable注解都有一個@Import注解,@Import是用來導入配置類的巾陕,這也就意味著這些自動開啟的實現其實是導入了一些自動配置的Bean(1.直接導入配置類2.依據條件選擇配置類3.動態(tài)注冊配置類)
@RunWith 這個是Junit的注解讨跟,springboot集成了junit。一般在測試類里使用:@RunWith(SpringJUnit4ClassRunner.class) — SpringJUnit4ClassRunner在JUnit環(huán)境下提供Sprng TestContext Framework的功能
@ContextConfiguration 用來加載配置ApplicationContext鄙煤,其中classes屬性用來加載配置類:@ContextConfiguration(classes = {TestConfig.class(自定義的一個配置類)})
@ActiveProfiles 用來聲明活動的profile–@ActiveProfiles(“prod”(這個prod定義在配置類中))
6晾匠、Spring有哪些主要模塊?

1)Spring Core:框架的最基礎部分梯刚,提供 IoC 容器凉馆,對 bean 進行管理。

2)Spring Context: 基于 bean亡资,提供上下文信息澜共,擴展出JNDI、EJB锥腻、電子郵件嗦董、國際化、校驗和調度等功能旷太。

3)Spring DAO: 提供了JDBC的抽象層展懈,它可消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼,還提供了聲明性事務管理方法供璧。

4)Spring ORM: 提供了常用的“對象/關系”映射APIs的集成層存崖。 其中包括JPA、Hibernate睡毒、MyBatis 等来惧。

5)Spring AOP: 提供了符合AOP Alliance規(guī)范的面向方面的編程實現。

6)Spring Web: 提供了基礎的 Web 開發(fā)的上下文信息演顾,可與其他 web 進行集成供搀。

7)Spring Web MVC: 提供了 Web 應用的 Model-View-Controller 全功能實現。

7钠至、Spring支持幾種bean的作用域葛虐?

Spring框架支持以下五種bean的作用域:

singleton : bean在每個Spring ioc 容器中只有一個實例。

prototype:一個bean的定義可以有多個實例棉钧。

request:每次http請求都會創(chuàng)建一個bean屿脐,該作用域僅在基于web的Spring ApplicationContext情形下有效。

session:在一個HTTP Session中,一個bean定義對應一個實例的诵。該作用域僅在基于web的Spring ApplicationContext情形下有效万栅。

global-session:在一個全局的HTTP Session中,一個bean定義對應一個實例西疤。該作用域僅在基于web的Spring ApplicationContext情形下有效烦粒。

8、spring配置bean實例化有哪些方式代赁。

1)使用類構造器實例化(默認無參數)

  <bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>  

2)使用靜態(tài)工廠方法實例化(簡單工廠模式)

調用Bean2Factory的getBean2方法得到bean2

 <bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2"></bean>  

3)使用實例工廠方法實例化(工廠方法模式)

先創(chuàng)建工廠實例bean3Facory扰她,再通過工廠實例創(chuàng)建目標bean實例

<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory"></bean>
 <bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean> 
9、Spring中的單例Beans是線程安全的嗎管跺?

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

10卸夕、Spring事務的五種隔離級別

DEFAULT(默認):默認的隔離級別层释,使用數據庫默認的事務隔離級別;

READ_UNCOMMITTED(讀未提交):這是事務最低的隔離級別快集,它允許另外一個事務可以看到這個事務未提交的數據贡羔。這種隔離級別會產生臟讀,不可重復讀和幻讀个初;

READ_COMMITTED(讀已提交):保證一個事務修改的數據提交后才能被另外一個事務讀取乖寒。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免臟讀出現院溺,但是可能會出現不可重復讀和幻讀楣嘁;

REPEATABLE_READ(可重復讀):這種事務隔離級別可以防止臟讀,不可重復讀珍逸。但是可能出現幻讀逐虚。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免不可重復讀谆膳。(mysql默認的事務隔離級別)叭爱;

SERIALIZABLE(串行化):這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執(zhí)行漱病。除了防止臟讀涤伐,不可重復讀外馒胆,還避免了幻讀。

11凝果、Spring事務的七種傳播特性

1、PROPAGATION_REQUIRED:如果當前存在事務睦尽,方法將加入到這個事務器净,不存在,就新建一個事務当凡。
2山害、PROPAGATION_REQUIRED_NEW:當前存在事務,掛起當前事務沿量,新建一個新的事務浪慌。
3、PROPAGATION_MANDATORY:當前方法必須運行在事務中朴则,如果不存在事務权纤,就拋出異常。
4乌妒、PROPAGATION_NEVER:當前方法不需要運行在事務汹想,如果是事務調用,就拋出異常撤蚊。
5古掏、PROPAGATION_SUPPORTS:當前存在事務就在事務中運行,不存在就正常執(zhí)行侦啸。
6槽唾、PROPAGATION_NOT_SUPPORTED:當前方法不支持事務執(zhí)行, 如果存在事務光涂,掛起事務庞萍,執(zhí)行完后在繼續(xù)執(zhí)行事務。
7顶捷、PROPAGATION_NESTED:當父事務調用到這個方法挂绰,此時會創(chuàng)建一個savepoint,啟動一個嵌套事務執(zhí)行該方法服赎。如果方法失敗葵蒂,回滾到savepoint點。嵌套事務是外部事務的一部分重虑,如果外部事務失敗了践付,會全部回滾。

12缺厉、Spring框架中都用到了那些設計模式永高?

Spring框架中使用了大量的設計模式隧土,下面列舉比較有代表性的:
1)代理模式 -- AOP;
2)單例模式 -- 在Spring配置文件中定義的bean默認為單例模式命爬;
3)模板方法 -- 用來解決代碼重復的問題曹傀,比如RestTemplate,JpaTemplate;
4)工廠模式 -- BeanFactory用來創(chuàng)建對象的實例饲宛;
5)前端控制器 -- Spring提供了DispatcherServlet來對請求進行分發(fā)皆愉;
6)依賴注入 -- 貫穿BeanFactory/ApplicationContext接口的核心理念。

未完待續(xù)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末艇抠,一起剝皮案震驚了整個濱河市幕庐,隨后出現的幾起案子,更是在濱河造成了極大的恐慌家淤,老刑警劉巖异剥,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異絮重,居然都是意外死亡冤寿,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門绿鸣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疚沐,“玉大人,你說我怎么就攤上這事潮模×粱祝” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵擎厢,是天一觀的道長究流。 經常有香客問我,道長动遭,這世上最難降的妖魔是什么芬探? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮厘惦,結果婚禮上偷仿,老公的妹妹穿的比我還像新娘。我一直安慰自己宵蕉,他們只是感情好酝静,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著羡玛,像睡著了一般别智。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稼稿,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天薄榛,我揣著相機與錄音讳窟,去河邊找鬼。 笑死敞恋,一個胖子當著我的面吹牛丽啡,可吹牛的內容都是我干的。 我是一名探鬼主播耳舅,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼碌上,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浦徊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤天梧,失蹤者是張志新(化名)和其女友劉穎盔性,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體呢岗,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡冕香,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了后豫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悉尾。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挫酿,靈堂內的尸體忽然破棺而出构眯,到底是詐尸還是另有隱情,我是刑警寧澤早龟,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布惫霸,位于F島的核電站,受9級特大地震影響葱弟,放射性物質發(fā)生泄漏壹店。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一芝加、第九天 我趴在偏房一處隱蔽的房頂上張望硅卢。 院中可真熱鬧,春花似錦藏杖、人聲如沸将塑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抬旺。三九已至,卻和暖如春祥楣,著一層夾襖步出監(jiān)牢的瞬間开财,已是汗流浹背汉柒。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留责鳍,地道東北人碾褂。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像历葛,于是被迫代替她去往敵國和親正塌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容