Java SSM框架面试题「建议收藏」(java注释@)
Spring入門:https://blog.csdn.net/qq_40323256/article/details/89738330
Spring中的動(dòng)態(tài)代理和aop的自定義通知:https://blog.csdn.net/qq_40323256/article/details/89754201
SpringMVC入門:https://blog.csdn.net/qq_40323256/article/details/89784956
mybatis入門(實(shí)現(xiàn)增刪改查):https://blog.csdn.net/qq_40323256/article/details/89704582
Mapper動(dòng)態(tài)代理:https://blog.csdn.net/qq_40323256/article/details/89715484
ssm中直接返回某個(gè)頁面或存東西:https://blog.csdn.net/qq_40323256/article/details/91511256
2019java后端面試集合篇最值得收藏的:
sql 中 ${} 和 #{}的區(qū)別:
- #將傳入的參數(shù)都當(dāng)成一個(gè)字符串,會(huì)對(duì)自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號(hào)。如:order by #{age},如果傳入的值是18,那么解析成sql時(shí)的值為order by “18”, 如果傳入 age ,則會(huì)解析為 order by“age”
- $將傳入的參數(shù)直接顯示生成在sql中,被當(dāng)成一個(gè)對(duì)象。如:order by${age},如果傳入的值是18,那么解析成sql時(shí)的值為order by 18,如果傳入的值是age,則解析成的sql為order by age
- #方式底層采用預(yù)編譯方式PreparedStatement,能夠很大程度防止sql注入;$方式底層只是Statement,無法防止Sql注入。
- $方式一般用于傳入數(shù)據(jù)庫對(duì)象,例如傳入表名.
- 一般能用#的就別用$注意點(diǎn):MyBatis排序時(shí)使用order by 動(dòng)態(tài)參數(shù)時(shí)需要注意,用$而不是#
Spring MVC 的運(yùn)行流程:
- 用戶發(fā)起請(qǐng)求到前端控制器(DispatcherServlet),該控制器會(huì)過濾出哪些請(qǐng)求可以訪問Servlet、哪些不能訪問。就是url-pattern的作用,并且會(huì)加載springmvc.xml配置文件。
- 前端控制器會(huì)找到處理器映射器(HandlerMapping),通過HandlerMapping完成url到controller映射的組件,簡(jiǎn)單來說,就是將在springmvc.xml中配置的或者注解的url與對(duì)應(yīng)的處理類找到并進(jìn)行存儲(chǔ),用map<url,handler>這樣的方式來存儲(chǔ)。
- HandlerMapping有了映射關(guān)系,并且找到url對(duì)應(yīng)的處理器,HandlerMapping就會(huì)將其處理器(Handler)返回,在返回前,會(huì)加上很多攔截器。
- DispatcherServlet拿到Handler后,找到HandlerAdapter(處理器適配器),通過它來訪問處理器,并執(zhí)行處理器。
- 執(zhí)行處理器
- 處理器會(huì)返回一個(gè)ModelAndView對(duì)象給HandlerAdapter
- 通過HandlerAdapter將ModelAndView對(duì)象返回給前端控制器(DispatcherServlet)
- 前端控制器請(qǐng)求視圖解析器(ViewResolver)去進(jìn)行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(jsp),其實(shí)就是將ModelAndView對(duì)象中存放視圖的名稱進(jìn)行查找,找到對(duì)應(yīng)的頁面形成視圖對(duì)象
- 返回視圖對(duì)象到前端控制器。
- 視圖渲染,就是將ModelAndView對(duì)象中的數(shù)據(jù)放到request域中,用來讓頁面加載數(shù)據(jù)的。
- 通過第8步,通過名稱找到了對(duì)應(yīng)的頁面,通過第10步,request域中有了所需要的數(shù)據(jù),那么就能夠進(jìn)行視圖渲染了。最后將其返回即可。
Spring MVC 常用的 5 個(gè)注解:
- @Controller:@Controller用于標(biāo)記在一個(gè)類上,使用它標(biāo)記的類就是一個(gè)SpringMVC Controller對(duì)象。分發(fā)處理器將會(huì)掃描使用了該注解的類的方法,并檢測(cè)該方法是否使用了@RequestMapping注解。@Controller只是定義了一個(gè)控制器類,而使用@RequestMapping注解的方法才是真正處理請(qǐng)求的處理器。
- @RequestMapping :@RequestMapping是一個(gè)用來處理請(qǐng)求地址映射的注解,可用于類或方法上。用于類上,表示類中的所有響應(yīng)請(qǐng)求的方法都是以該地址作為父路徑。用于方法上,方法的返回值會(huì)通過視圖解析器解析為實(shí)際的物理視圖。
-
@ResponseBody:@ResponseBody用于將Controller的方法返回的對(duì)象,通過適當(dāng)?shù)腍ttpMessageConverter轉(zhuǎn)換為指定格式后,寫入到Response對(duì)象的body數(shù)據(jù)區(qū)。
注意:返回的數(shù)據(jù)是其他某種格式的數(shù)據(jù)時(shí)(如json、xml等)才使用;
- @RequestParam:@RequestParam用于將請(qǐng)求參數(shù)區(qū)數(shù)據(jù)映射到功能處理方法的參數(shù)上,用例:
@RequestMapping("/testRequestParam") public String testRequestParam(@RequestParam("id") int id) { System.out.println("testRequestParam " + id); return "success"; } - @Resource和@Autowired:都是做bean的注入時(shí)使用
共同點(diǎn):兩者都可以寫在字段和setter方法上。兩者如果都寫在字段上,那么就不需要再寫setter方法。
不同點(diǎn):
@Autowired為Spring提供的注解,需要導(dǎo)入包org.springframework.beans.factory.annotation.Autowired;@Autowired注解是按照類型(byType)裝配依賴對(duì)象,默認(rèn)情況下它要求依賴對(duì)象必須存在,如果允許null值,可以設(shè)置它的required屬性為false。如果我們想使用按照名稱(byName)來裝配,可以結(jié)合@Qualifier注解一起使用。如下:
public class HelloWorld{
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要導(dǎo)入,但是Spring支持該注解的注入。@Resource默認(rèn)按照ByName自動(dòng)注入,由J2EE提供,需要導(dǎo)入包javax.annotation.Resource。@Resource有兩個(gè)重要的屬性:name和type,而Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。所以,如果使用name屬性,則使用byName的自動(dòng)注入策略,而使用type屬性時(shí)則使用byType自動(dòng)注入策略。如果既不制定name也不制定type屬性,這時(shí)將通過反射機(jī)制使用byName自動(dòng)注入策略。
注意:最好是將@Resource放在setter方法上,因?yàn)檫@樣更符合面向?qū)ο蟮乃枷耄ㄟ^set、get去操作屬性,而不是直接去操作屬性。
IOC,AOP的實(shí)現(xiàn)原理:
IOC:控制反轉(zhuǎn),是一種設(shè)計(jì)模式。一層含義是控制權(quán)的轉(zhuǎn)移:由傳統(tǒng)的在程序中控制依賴轉(zhuǎn)移到由容器來控制;第二層是 依賴注入 (DI)
DI:依賴注入,將相互依賴的對(duì)象分離,在spring配置文件中描述他們的依賴關(guān)系,調(diào)用setter方法來注入(反射的話太消耗性能)。他們的依賴關(guān)系只在使用的時(shí)候才建立。簡(jiǎn)單來說就是不需要總是NEW一個(gè)對(duì)象了,只需要一個(gè)或多個(gè)對(duì)象(由你定義的策略決定,一般是單例),統(tǒng)一由容器進(jìn)行管理。
AOP:面向切面,是一種編程思想,是對(duì)OOP面向?qū)ο蟮难a(bǔ)充和完善。將系統(tǒng)中非核心的業(yè)務(wù)提取出來,進(jìn)行單獨(dú)處理。比如事務(wù)、日志和安全等。這個(gè)簡(jiǎn)單來說就是可以在一段程序之前或者之后做一些事。實(shí)現(xiàn)AOP的技術(shù),主要分為兩大類:一是采用動(dòng)態(tài)代理技術(shù),利用截取消息的方式,對(duì)該消息進(jìn)行裝飾,以取代原有對(duì)象行為的執(zhí)行(jdk動(dòng)態(tài)代理:必須至少實(shí)現(xiàn)一個(gè)接口,底層利用反射機(jī)制,效率較低;cglib動(dòng)態(tài)代理:原理是使用ASM字節(jié)碼技術(shù)對(duì)指定的業(yè)務(wù)類生成一個(gè)子類,并覆蓋業(yè)務(wù)方法實(shí)現(xiàn)代理,采用繼承的方式,所以不能對(duì)final修改的類進(jìn)行代理);二是采用靜態(tài)代理的方式,在代碼中顯示地實(shí)現(xiàn)一個(gè)業(yè)務(wù)實(shí)現(xiàn)類的指定代理,在代理類中對(duì)同名的業(yè)務(wù)方法進(jìn)行包裝(不修改原有的業(yè)務(wù)代碼),用戶通過代理類調(diào)用被包裝過的業(yè)務(wù)方法,但會(huì)導(dǎo)致代碼冗余。目前這幾種代理方式并沒有高低之分,只是應(yīng)用的場(chǎng)景不同。
Spring 的AOP和IOC都是為了解決系統(tǒng)代碼耦合度過高的問題。使代碼重用度高、易于維護(hù)。
AOP和IOC并不是spring中特有的,只是spring把他們應(yīng)用的更靈活方便。
Spring DI 常用的三種方式:
常用的注入方式主要有三種:構(gòu)造方法注入,setter注入,接口注入。
總結(jié)
以上是生活随笔為你收集整理的Java SSM框架面试题「建议收藏」(java注释@)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用 SAP CDS view 中的
- 下一篇: 如何基于 SAP CDS view 生成