更新時(shí)間:2022-12-26 15:15:54 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2074次
很多同學(xué)說(shuō)來(lái)都很疑惑,為什么很多的業(yè)內(nèi)面試官總喜歡問(wèn)源碼?其實(shí)我們常用的一些框架、比如Spring、MyBaits都是比較經(jīng)典的教科書(shū),我們可以從中學(xué)習(xí)到代碼與經(jīng)驗(yàn)技巧,從而領(lǐng)悟框架的含義:

1、什么是Spring-MVC框架
Spring 配備構(gòu)建Web 應(yīng)用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反轉(zhuǎn)把業(yè)務(wù)對(duì)象和控制邏輯清晰地隔離。它也允許以聲明的方式把請(qǐng)求參數(shù)和業(yè)務(wù)對(duì)象綁定。
Spring-MVC常用注解
@Controller注解
是在Spring的org.springframework.stereotype包下,org.springframework.stereotype.Controller注解類(lèi)型用于指示Spring類(lèi)的實(shí)例是一個(gè)控制器
使用@Controller注解的類(lèi)不需要繼承特定的父類(lèi)或者實(shí)現(xiàn)特定的接口,相對(duì)之前的版本實(shí)現(xiàn)Controller接口變的更加簡(jiǎn)單。
而Controller接口的實(shí)現(xiàn)類(lèi)只能處理一個(gè)單一的請(qǐng)求動(dòng)作,而@Controller注解注解的控制器可以同時(shí)支持處理多個(gè)請(qǐng)求動(dòng)作,使程序開(kāi)發(fā)變的更加靈活。 @Controller用戶(hù)標(biāo)記一個(gè)類(lèi),使用它標(biāo)記的類(lèi)就是一個(gè)Spring MVC Controller對(duì)象,即:一個(gè)控制器類(lèi)。Spring使用掃描機(jī)制查找應(yīng)用程序中所有基于注解的控制器類(lèi),分發(fā)處理器會(huì)掃描使用了該注解的方法,并檢測(cè)該方法是否使用了@RequestMapping注解,而使用@RequestMapping注解的方法才是真正處理請(qǐng)求的處理器。為了保證Spring能找到控制器,我們需要完成兩件事.
@RequestParam注解
下面來(lái)說(shuō)org.springframework.web.bind.annotation包下的第三個(gè)注解,即:@RequestParam注解,該注解類(lèi)型用于將指定的請(qǐng)求參數(shù)賦值給方法中的形參。那么@RequestParam注解有什么屬性呢?它有4種屬性,下面將逐一介紹這四種屬性:
1、name屬性該屬性的類(lèi)型是String類(lèi)型,它可以指定請(qǐng)求頭綁定的名稱(chēng);
2、value屬性該屬性的類(lèi)型是String類(lèi)型,它可以設(shè)置是name屬性的別名;
3、required屬性該屬性的類(lèi)型是boolean類(lèi)型,它可以設(shè)置指定參數(shù)是否必須綁定;
4、defalutValue屬性該屬性的類(lèi)型是String類(lèi)型,它可以設(shè)置如果沒(méi)有傳遞參數(shù)可以使用默認(rèn)值。
@PathVaribale注解
下面來(lái)說(shuō)org.springframework.web.bind.annotation包下的第四個(gè)注解,即:@PathVaribale注解,該注解類(lèi)型可以非常方便的獲得請(qǐng)求url中的動(dòng)態(tài)參數(shù)。@PathVaribale注解只支持一個(gè)屬性value,類(lèi)型String,表示綁定的名稱(chēng),如果省略則默認(rèn)綁定同名參數(shù)。
Spring框架中的單例bean是線(xiàn)程安全的嗎
肯定不是線(xiàn)程安全的,當(dāng)多用戶(hù)同時(shí)請(qǐng)求一個(gè)服務(wù)時(shí),容器會(huì)給每一個(gè)請(qǐng)求分配一個(gè)線(xiàn)程,這是多個(gè)線(xiàn)程會(huì)并發(fā)執(zhí)行該請(qǐng)求多對(duì)應(yīng)的業(yè)務(wù)邏輯(成員方法),此時(shí)就要注意了,如果該處理邏輯中有對(duì)該單列狀態(tài)的修改(體現(xiàn)為該單列的成員屬性),則必須考慮線(xiàn)程同步問(wèn)題.
Spring框架并沒(méi)有對(duì)單例bean進(jìn)行任何多線(xiàn)程的封裝處理。關(guān)于單例bean的線(xiàn)程安全和并發(fā)問(wèn)題需要開(kāi)發(fā)者自行去搞定。但實(shí)際上,大部分的Spring bean并沒(méi)有可變的狀態(tài)(比如Serview類(lèi)和DAO類(lèi)),所以在某種程度上說(shuō)Spring的單例bean是線(xiàn)程安全的。如果你的bean有多種狀態(tài)的話(huà)(比如 View Model對(duì)象),就需要自行保證線(xiàn)程安全。最淺顯的解決辦法就是將多態(tài)bean的作用域由“singleton”變更為“prototype”。
Spring如何處理線(xiàn)程并發(fā)問(wèn)題
在一般情況下,只有無(wú)狀態(tài)的Bean才可以在多線(xiàn)程環(huán)境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域,因?yàn)镾pring對(duì)一些Bean中非線(xiàn)程安全狀態(tài)采用ThreadLocal進(jìn)行處理,解決線(xiàn)程安全問(wèn)題。
ThreadLocal和線(xiàn)程同步機(jī)制都是為了解決多線(xiàn)程中相同變量的訪(fǎng)問(wèn)沖突問(wèn)題。同步機(jī)制采用了“時(shí)間換空間”的方式,僅提供一份變量,不同的線(xiàn)程在訪(fǎng)問(wèn)前需要獲取鎖,沒(méi)獲得鎖的線(xiàn)程則需要排隊(duì)。而ThreadLocal采用了“空間換時(shí)間”的方式。
ThreadLocal會(huì)為每一個(gè)線(xiàn)程提供一個(gè)獨(dú)立的變量副本,從而隔離了多個(gè)線(xiàn)程對(duì)數(shù)據(jù)的訪(fǎng)問(wèn)沖突。因?yàn)槊恳粋€(gè)線(xiàn)程都擁有自己的變量副本,從而也就沒(méi)有必要對(duì)該變量進(jìn)行同步了。ThreadLocal提供了線(xiàn)程安全的共享對(duì)象,在編寫(xiě)多線(xiàn)程代碼時(shí),可以把不安全的變量封裝進(jìn)ThreadLocal。
什么是Spring的內(nèi)部bean
當(dāng)一個(gè)bean僅被用作另一個(gè)bean的屬性時(shí),它能被聲明為一個(gè)內(nèi)部bean,為了定義inner bean,在Spring 的 基于XML的 配置元數(shù)據(jù)中,可以在 或\ 元素內(nèi)使用 元素,內(nèi)部bean通常是匿名的,它們的Scope一般是prototype。
一般寫(xiě)法
<?xml version="1.0" encoding="UTF-8"?>
<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="CustomerBean" class="com.dpb.common.Customer">
<property name="person" ref="PersonBean"/>
</bean>
<bean id="PersonBean" class="com.domain.common.Person">
<property name="name" value="阿三"/>
<property name="address" value="陜西"/>
<property name="age" value="18"/>
</bean>
</beans>
改為內(nèi)部bean
<?xml version="1.0" encoding="UTF-8"?>
<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="CustomerBean" class="com.domain.common.Customer">
<property name="person">
<bean class="com.domain.common.Person">
<property name="name" value="阿三"/>
<property name="address" value="陜西"/>
<property name="age" value="18"/>
</bean>
</property>
</bean>
</beans>
內(nèi)部 bean 也支持構(gòu)造器注入
<?xml version="1.0" encoding="UTF-8"?>
<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="CustomerBean" class="com.dpb.common.Customer">
<constructor-arg >
<bean class="com.domain.common.Person">
<property name="name" value="阿三"/>
<property name="address" value="陜西"/>
<property name="age" value="18"/>
</bean>
</constructor-arg>
</bean>
</beans>
id 或 name 值在bean類(lèi)是沒(méi)有必要以一個(gè)內(nèi)部 bean 呈現(xiàn)
以上就是“ssm框架面試題,常見(jiàn)知識(shí)點(diǎn)總結(jié)”,你能回答上來(lái)嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)