90.為什么要使用 spring?
Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架撵渡,它由Rod Johnson創(chuàng)建忱辅。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的豪诲。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。
91.解釋一下什么是 aop蝶念?
- AOP(Aspect-Oriented Programming)指一種程序設(shè)計(jì)范型,該范型以一種稱為切面(aspect)的語言構(gòu)造為基礎(chǔ)芋绸,切面是一種新的模塊化機(jī)制媒殉,用來描述分散在對(duì)象、類或方法中的橫切關(guān)注點(diǎn)(crosscutting concern)摔敛。
- Spring提供了面向切面編程的豐富支持廷蓉,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)(例如審計(jì)(auditing)和事務(wù)(transaction)管理)進(jìn)行內(nèi)聚性的開發(fā)。應(yīng)用對(duì)象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已马昙。它們并不負(fù)責(zé)(甚至是意識(shí))其它的系統(tǒng)級(jí)關(guān)注點(diǎn)苦酱,例如日志或事務(wù)支持。
92.解釋一下什么是 ioc给猾?
- IoC就是(Inversion of Control)疫萤,控制反轉(zhuǎn)。在Java開發(fā)中敢伸,IoC意味著將你設(shè)計(jì)好的類交給系統(tǒng)去控制扯饶,而不是在你的類內(nèi)部控制。這稱為控制反轉(zhuǎn)。
- Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦合尾序。當(dāng)應(yīng)用了IoC钓丰,一個(gè)對(duì)象依賴的其它對(duì)象會(huì)通過被動(dòng)的方式傳遞進(jìn)來,而不是這個(gè)對(duì)象自己創(chuàng)建或者查找依賴對(duì)象每币。你可以認(rèn)為IoC與JNDI相反——不是對(duì)象從容器中查找依賴携丁,而是容器在對(duì)象初始化時(shí)不等對(duì)象請(qǐng)求就主動(dòng)將依賴傳遞給它。
93.spring 有哪些主要模塊兰怠?
Spring有七大模塊組成:
核心容器(Spring Core)
核心容器提供Spring框架的基本功能梦鉴。Spring以bean的方式組織和管理Java應(yīng)用中的各個(gè)組件及其關(guān)系。Spring使用BeanFactory來產(chǎn)生和管理Bean揭保,它是工廠模式的實(shí)現(xiàn)肥橙。BeanFactory使用控制反轉(zhuǎn)(IoC)模式將應(yīng)用的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。應(yīng)用上下文(Spring Context)
Spring上下文是一個(gè)配置文件秸侣,向Spring框架提供上下文信息存筏。Spring上下文包括企業(yè)服務(wù),如JNDI味榛、EJB椭坚、電子郵件、國際化搏色、校驗(yàn)和調(diào)度功能藕溅。Spring面向切面編程(Spring AOP)
通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring框架中继榆。所以巾表,可以很容易地使 Spring框架管理的任何對(duì)象支持 AOP。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)略吨。通過使用 Spring AOP集币,不用依賴 EJB 組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中翠忠。JDBC和DAO模塊(Spring DAO)
JDBC鞠苟、DAO的抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理秽之,和不同數(shù)據(jù)庫供應(yīng)商所拋出的錯(cuò)誤信息当娱。異常層次結(jié)構(gòu)簡化了錯(cuò)誤處理,并且極大的降低了需要編寫的代碼數(shù)量考榨,比如打開和關(guān)閉鏈接跨细。對(duì)象實(shí)體映射(Spring ORM)
Spring框架插入了若干個(gè)ORM框架,從而提供了ORM對(duì)象的關(guān)系工具河质,其中包括了Hibernate冀惭、JDO和 IBatis SQL Map等震叙,所有這些都遵從Spring的通用事物和DAO異常層次結(jié)構(gòu)。Web模塊(Spring Web)
Web上下文模塊建立在應(yīng)用程序上下文模塊之上散休,為基于web的應(yīng)用程序提供了上下文媒楼。所以Spring框架支持與Struts集成,web模塊還簡化了處理多部分請(qǐng)求以及將請(qǐng)求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/p>MVC模塊(Spring Web MVC)
MVC框架是一個(gè)全功能的構(gòu)建Web應(yīng)用程序的MVC實(shí)現(xiàn)戚丸。通過策略接口划址,MVC框架變成為高度可配置的。MVC容納了大量視圖技術(shù)限府,其中包括JSP夺颤、POI等,模型來有JavaBean來構(gòu)成谣殊,存放于m當(dāng)中,而視圖是一個(gè)街口牺弄,負(fù)責(zé)實(shí)現(xiàn)模型姻几,控制器表示邏輯代碼,由c的事情势告。Spring框架的功能可以用在任何J2EE服務(wù)器當(dāng)中蛇捌,大多數(shù)功能也適用于不受管理的環(huán)境。Spring的核心要點(diǎn)就是支持不綁定到特定J2EE服務(wù)的可重用業(yè)務(wù)和數(shù)據(jù)的訪問的對(duì)象咱台,毫無疑問這樣的對(duì)象可以在不同的J2EE環(huán)境络拌,獨(dú)立應(yīng)用程序和測試環(huán)境之間重用。
94.spring 常用的注入方式有哪些回溺?
- @Configuration把一個(gè)類作為一個(gè)IoC容器春贸,它的某個(gè)方法頭上如果注冊(cè)了@Bean,就會(huì)作為這個(gè)Spring容器中的Bean遗遵。
- @Scope注解 作用域
- @Lazy(true) 表示延遲初始化
- @Service用于標(biāo)注業(yè)務(wù)層組件萍恕、
- @Controller用于標(biāo)注控制層組件(如struts中的action)
- @Repository用于標(biāo)注數(shù)據(jù)訪問組件,即DAO組件车要。
- @Component泛指組件允粤,當(dāng)組件不好歸類的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標(biāo)注翼岁。
- @Scope用于指定scope作用域的(用在類上)
- @PostConstruct用于指定初始化方法(用在方法上)
- @PreDestory用于指定銷毀方法(用在方法上)
- @DependsOn:定義Bean初始化及銷毀時(shí)的順序
- @Primary:自動(dòng)裝配時(shí)當(dāng)出現(xiàn)多個(gè)Bean候選者時(shí)类垫,被注解為@Primary的Bean將作為首選者,否則將拋出異常
- @Autowired 默認(rèn)按類型裝配琅坡,如果我們想使用按名稱裝配悉患,可以結(jié)合@Qualifier注解一起使用。如下:
- @Autowired @Qualifier("personDaoBean") 存在多個(gè)實(shí)例配合使用
- @Resource默認(rèn)按名稱裝配榆俺,當(dāng)找不到與名稱匹配的bean才會(huì)按類型裝配购撼。
- @PostConstruct 初始化注解
- @PreDestroy 摧毀注解 默認(rèn) 單例 啟動(dòng)就加載
- @Async異步方法調(diào)用
95.spring 中的 bean 是線程安全的嗎跪削?
Spring框架并沒有對(duì)單例bean進(jìn)行任何多線程的封裝處理。關(guān)于單例bean的線程安全和并發(fā)問題需要開發(fā)者自行去搞定迂求。但實(shí)際上碾盐,大部分的Spring bean并沒有可變的狀態(tài)(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的揩局。如果你的bean有多種狀態(tài)的話(比如 View Model 對(duì)象)毫玖,就需要自行保證線程安全。
最淺顯的解決辦法就是將多態(tài)bean的作用域由“singleton”變更為“prototype”凌盯。
96.spring 支持幾種 bean 的作用域付枫?
當(dāng)通過spring容器創(chuàng)建一個(gè)Bean實(shí)例時(shí),不僅可以完成Bean實(shí)例的實(shí)例化驰怎,還可以為Bean指定特定的作用域阐滩。Spring支持如下5種作用域:
- singleton:單例模式,在整個(gè)Spring IoC容器中县忌,使用singleton定義的Bean將只有一個(gè)實(shí)例
- prototype:原型模式掂榔,每次通過容器的getBean方法獲取prototype定義的Bean時(shí),都將產(chǎn)生一個(gè)新的Bean實(shí)例
- request:對(duì)于每次HTTP請(qǐng)求症杏,使用request定義的Bean都將產(chǎn)生一個(gè)新實(shí)例装获,即每次HTTP請(qǐng)求將會(huì)產(chǎn)生不同的Bean實(shí)例。只有在Web應(yīng)用中使用Spring時(shí)厉颤,該作用域才有效
- session:對(duì)于每次HTTP Session穴豫,使用session定義的Bean豆?jié){產(chǎn)生一個(gè)新實(shí)例。同樣只有在Web應(yīng)用中使用Spring時(shí)逼友,該作用域才有效
- globalsession:每個(gè)全局的HTTP Session精肃,使用session定義的Bean都將產(chǎn)生一個(gè)新實(shí)例。典型情況下帜乞,僅在使用portlet context的時(shí)候有效肋杖。同樣只有在Web應(yīng)用中使用Spring時(shí),該作用域才有效挖函。
其中比較常用的是singleton和prototype兩種作用域状植。對(duì)于singleton作用域的Bean,每次請(qǐng)求該Bean都將獲得相同的實(shí)例怨喘。容器負(fù)責(zé)跟蹤Bean實(shí)例的狀態(tài)津畸,負(fù)責(zé)維護(hù)Bean實(shí)例的生命周期行為;如果一個(gè)Bean被設(shè)置成prototype作用域必怜,程序每次請(qǐng)求該id的Bean肉拓,Spring都會(huì)新建一個(gè)Bean實(shí)例,然后返回給程序梳庆。在這種情況下暖途,Spring容器僅僅使用new 關(guān)鍵字創(chuàng)建Bean實(shí)例卑惜,一旦創(chuàng)建成功,容器不在跟蹤實(shí)例驻售,也不會(huì)維護(hù)Bean實(shí)例的狀態(tài)露久。
如果不指定Bean的作用域,Spring默認(rèn)使用singleton作用域欺栗。Java在創(chuàng)建Java實(shí)例時(shí)毫痕,需要進(jìn)行內(nèi)存申請(qǐng);銷毀實(shí)例時(shí)迟几,需要完成垃圾回收消请,這些工作都會(huì)導(dǎo)致系統(tǒng)開銷的增加。因此类腮,prototype作用域Bean的創(chuàng)建臊泰、銷毀代價(jià)比較大。而singleton作用域的Bean實(shí)例一旦創(chuàng)建成功蚜枢,可以重復(fù)使用缸逃。因此,除非必要祟偷,否則盡量避免將Bean被設(shè)置成prototype作用域察滑。
97.spring 自動(dòng)裝配 bean 有哪些方式打厘?
Spring中bean有三種裝配機(jī)制修肠,分別是:
- 在xml中顯示配置;
- 在java中顯示配置户盯;
- 隱式的bean發(fā)現(xiàn)機(jī)制和自動(dòng)裝配嵌施。
98.spring 事務(wù)實(shí)現(xiàn)方式有哪些?
事務(wù):事務(wù)邏輯上的一組操作,組成這組操作的各個(gè)邏輯單元,要么一起成功,要么一起失敗.比如莽鸭,保證數(shù)據(jù)的運(yùn)行不會(huì)說A給B錢,A錢給了B卻沒收到吗伤。
實(shí)現(xiàn)事務(wù)的三種方式:
1.aspectJ AOP實(shí)現(xiàn)事務(wù):
2.事務(wù)代理工廠Bean實(shí)現(xiàn)事務(wù):
3.注解方式實(shí)現(xiàn)事務(wù):
在需要進(jìn)行事務(wù)的方法上增加一個(gè)注解“@Transactional(rollbackFor = MyExepction.class )”
99.說一下 spring 的事務(wù)隔離?
一硫眨、 事務(wù)特性(4種):
- 原子性 (atomicity):強(qiáng)調(diào)事務(wù)的不可分割.
- 一致性 (consistency):事務(wù)的執(zhí)行的前后數(shù)據(jù)的完整性保持一致.
- 隔離性 (isolation):一個(gè)事務(wù)執(zhí)行的過程中,不應(yīng)該受到其他事務(wù)的干擾
- 持久性(durability) :事務(wù)一旦結(jié)束,數(shù)據(jù)就持久到數(shù)據(jù)庫
二足淆、 如果不考慮隔離性引發(fā)安全性問題: - 臟讀 :一個(gè)事務(wù)讀到了另一個(gè)事務(wù)的未提交的數(shù)據(jù)
- 不可重復(fù)讀 :一個(gè)事務(wù)讀到了另一個(gè)事務(wù)已經(jīng)提交的 update 的數(shù)據(jù)導(dǎo)致多次查詢結(jié)果不一致.
- 虛幻讀 :一個(gè)事務(wù)讀到了另一個(gè)事務(wù)已經(jīng)提交的 insert 的數(shù)據(jù)導(dǎo)致多次查詢結(jié)果不一致.
三、解決讀問題: 設(shè)置事務(wù)隔離級(jí)別(5種) - DEFAULT 這是一個(gè)PlatfromTransactionManager默認(rèn)的隔離級(jí)別礁阁,使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級(jí)別.
- 未提交讀(read uncommited) :臟讀巧号,不可重復(fù)讀,虛讀都有可能發(fā)生
- 已提交讀 (read commited):避免臟讀姥闭。但是不可重復(fù)讀和虛讀有可能發(fā)生
- 可重復(fù)讀 (repeatable read) :避免臟讀和不可重復(fù)讀.但是虛讀有可能發(fā)生.
- 串行化的 (serializable) :避免以上所有讀問題.
- Mysql 默認(rèn):可重復(fù)讀
-
Oracle 默認(rèn):讀已提交
20190412163126958.png
- read uncommited:是最低的事務(wù)隔離級(jí)別丹鸿,它允許另外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。
- read commited:保證一個(gè)事物提交后才能被另外一個(gè)事務(wù)讀取棚品。另外一個(gè)事務(wù)不能讀取該事物未提交的數(shù)據(jù)靠欢。
- repeatable read:這種事務(wù)隔離級(jí)別可以防止臟讀廊敌,不可重復(fù)讀。但是可能會(huì)出現(xiàn)幻象讀门怪。它除了保證一個(gè)事務(wù)不能被另外一個(gè)事務(wù)讀取未提交的數(shù)據(jù)之外還避免了以下情況產(chǎn)生(不可重復(fù)讀)骡澈。
- serializable:這是花費(fèi)最高代價(jià)但最可靠的事務(wù)隔離級(jí)別。事務(wù)被處理為順序執(zhí)行薪缆。除了防止臟讀秧廉,不可重復(fù)讀之外,還避免了幻象讀(避免三種)拣帽。
四疼电、事務(wù)的傳播行為(7種)
PROPAGION_XXX :事務(wù)的傳播行為
- 保證同一個(gè)事務(wù)中
- PROPAGATION_REQUIRED 支持當(dāng)前事務(wù),如果不存在 就新建一個(gè)(默認(rèn))
2.PROPAGATION_SUPPORTS 支持當(dāng)前事務(wù)减拭,如果不存在蔽豺,就不使用事務(wù) - PROPAGATION_MANDATORY 支持當(dāng)前事務(wù),如果不存在拧粪,拋出異常
- 保證沒有在同一個(gè)事務(wù)中
- PROPAGATION_REQUIRES_NEW 如果有事務(wù)存在修陡,掛起當(dāng)前事務(wù),創(chuàng)建一個(gè)新的事務(wù)
- PROPAGATION_NOT_SUPPORTED 以非事務(wù)方式運(yùn)行可霎,如果有事務(wù)存在魄鸦,掛起當(dāng)前事務(wù)
- PROPAGATION_NEVER 以非事務(wù)方式運(yùn)行,如果有事務(wù)存在癣朗,拋出異常
- PROPAGATION_NESTED 如果當(dāng)前事務(wù)存在拾因,則嵌套事務(wù)執(zhí)行
100.說一下 spring mvc 運(yùn)行流程?
流程
1旷余、用戶發(fā)送請(qǐng)求至前端控制器DispatcherServlet
2绢记、DispatcherServlet收到請(qǐng)求調(diào)用HandlerMapping處理器映射器。
3正卧、處理器映射器找到具體的處理器蠢熄,生成處理器對(duì)象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。
4炉旷、DispatcherServlet調(diào)用HandlerAdapter處理器適配器
5签孔、HandlerAdapter經(jīng)過適配調(diào)用具體的處理器(Controller,也叫后端控制器)窘行。
6饥追、Controller執(zhí)行完成返回ModelAndView
7、HandlerAdapter將controller執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet
8抽高、DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
9判耕、ViewReslover解析后返回具體View
10、DispatcherServlet根據(jù)View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)翘骂。
11壁熄、DispatcherServlet響應(yīng)用戶
101.spring mvc 有哪些組件帚豪?
102.@RequestMapping 的作用是什么?
@RequestMapping
RequestMapping是一個(gè)用來處理請(qǐng)求地址映射的注解草丧,可用于類或方法上狸臣。
103.@Autowired 的作用是什么?
這個(gè)注解就是spring可以自動(dòng)幫你把bean里面引用的對(duì)象的setter/getter方法省略昌执,它會(huì)自動(dòng)幫你set/get烛亦。
<bean id="userDao" class="..."/>
<bean id="userService" class="...">
<property name="userDao">
<ref bean="userDao"/>
</property>
</bean>
這樣你在userService里面要做一個(gè)userDao的setter/getter方法。
但如果你用了@Autowired的話懂拾,你只需要在UserService的實(shí)現(xiàn)類中聲明即可煤禽。
@Autowired
private IUserDao userdao;