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