點(diǎn)擊一個(gè)網(wǎng)站跳轉(zhuǎn)到圖片怎么做的淘寶關(guān)鍵詞排名查詢工具免費(fèi)
1.循環(huán)依賴
循環(huán)依賴其實(shí)就是循環(huán)引用,也就是兩個(gè)或者兩個(gè)以上的 Bean 互相持有對(duì)方,最終形成閉環(huán)。比如A 依賴于B,B又依賴于A
?
Spring中循環(huán)依賴場(chǎng)景有:
prototype 原型 bean循環(huán)依賴
構(gòu)造器的循環(huán)依賴(構(gòu)造器注入)
Field 屬性的循環(huán)依賴(set注入)
其中,構(gòu)造器的循環(huán)依賴問(wèn)題無(wú)法解決,在解決屬性循環(huán)依賴時(shí),可以使用懶加載,spring采用的是提前暴露對(duì)象的方法。
2.三級(jí)緩存解決循環(huán)依賴問(wèn)題

?
①Spring容器初始化ClassA通過(guò)構(gòu)造器初始化對(duì)象后提前暴露到Spring容器中的singletonFactorys(三級(jí)緩存中)。
②ClassA調(diào)用setClassB方法,Spring首先嘗試從容器中獲取ClassB,此時(shí)ClassB不存在Spring 容器中。
③Spring容器初始化ClassB,ClasssB首先將自己暴露在三級(jí)緩存中,然后從Spring容器一級(jí)、二級(jí)、三級(jí)緩存中一次中獲取ClassA 。
④獲取到ClassA后將自己實(shí)例化放入單例池中,實(shí)例 ClassA通過(guò)Spring容器獲取到ClassB,完成了自己對(duì)象初始化操作。
⑤這樣ClassA和ClassB都完成了對(duì)象初始化操作,從而解決了循環(huán)依賴問(wèn)題。
3.Bean的注解
@Component 通?的注解,可標(biāo)注任意類為 Spring 組件
@Service 在業(yè)務(wù)邏輯層使用(service層)
@Repository 在數(shù)據(jù)訪問(wèn)層使用(dao層)
@Controller 在展現(xiàn)層使用,控制器的聲明(controller層)
?
?●注入bean的注解
@Autowired:默認(rèn)按照類型來(lái)裝配注入,@Qualifier:可以改成名稱
@Resource:默認(rèn)按照名稱來(lái)裝配注入,JDK的注解,新版本已經(jīng)棄用
?
●@Autowired注解原理
@Autowired的使用簡(jiǎn)化了我們的開發(fā),實(shí)現(xiàn) AutowiredAnnotationBeanPostProcessor 類,該類實(shí)現(xiàn)了 Spring 框架的一些擴(kuò)展接口。? 實(shí)現(xiàn) BeanFactoryAware 接口使其內(nèi)部持有了 BeanFactory(可輕松的獲取需要依賴的的 Bean)。? 實(shí)現(xiàn) MergedBeanDefinitionPostProcessor 接口,實(shí)例化Bean 前獲取到 里面的 @Autowired 信息并緩存下來(lái);? 實(shí)現(xiàn) postProcessPropertyValues 接口, 實(shí)例化Bean 后從緩存取出注解信息,通過(guò)反射將依賴對(duì)象設(shè)置到 Bean 屬性里面。
?
●@SpringBootApplication注解等同于下面三個(gè)注解:
?
?@SpringBootConfiguration: 底層是Configuration注解,說(shuō)白了就是支持JavaConfig的方式來(lái)進(jìn)行配置
?@EnableAutoConfiguration:開啟自動(dòng)配置功能
?@ComponentScan:就是掃描注解,默認(rèn)是掃描當(dāng)前類下的package
4.@SpringMVC
@Controller 聲明該類為SpringMVC中的Controller
@RequestMapping 用于映射Web請(qǐng)求
@ResponseBody 支持將返回值放在response內(nèi),而不是一個(gè)頁(yè)面,通常用戶返回json數(shù)據(jù)
@RequestBody 允許request的參數(shù)在request體中,而不是在直接連接在地址后面。
@PathVariable 用于接收路徑參數(shù)
@RequestMapping("/hello/{name}")申明的路徑,將注解放在參數(shù)中前,即可獲取該值,通常作為Restful的接口實(shí)現(xiàn)方法。
●SpringMVC原理

?
①客戶端(瀏覽器)發(fā)送請(qǐng)求,直接請(qǐng)求到 DispatcherServlet 。
②DispatcherServlet 根據(jù)請(qǐng)求信息調(diào)? HandlerMapping ,解析請(qǐng)求對(duì)應(yīng)的 Handler 。
③解析到對(duì)應(yīng)的 Handler (也就是 Controller 控制器)后,開始由HandlerAdapter 適配器處理。
④HandlerAdapter 會(huì)根據(jù) Handler 來(lái)調(diào)?真正的處理器開處理請(qǐng)求,并處理相應(yīng)的業(yè)務(wù)邏輯。
⑤處理器處理完業(yè)務(wù)后,會(huì)返回?個(gè) ModelAndView 對(duì)象, Model 是返回的數(shù)據(jù)對(duì)象
⑥ViewResolver 會(huì)根據(jù)邏輯 View 查找實(shí)際的 View 。
⑦DispaterServlet 把返回的 Model 傳給 View (視圖渲染)。
⑧把 View 返回給請(qǐng)求者(瀏覽器)
5.@SpringMybatis
@Insert : 插入sql ,和xml insert sql語(yǔ)法完全一樣
@Select : 查詢sql, 和xml select sql語(yǔ)法完全一樣
@Update : 更新sql, 和xml update sql語(yǔ)法完全一樣
@Delete : 刪除sql, 和xml delete sql語(yǔ)法完全一樣
@Param : 入?yún)?/p>
@Results : 設(shè)置結(jié)果集合@Result : 結(jié)果
@ResultMap : 引用結(jié)果集合
@SelectKey : 獲取最新插入id
?
Q:mybatis如何防止sql注入?
A:簡(jiǎn)單的說(shuō)就是#{}是經(jīng)過(guò)預(yù)編譯的,是安全的,${}是未經(jīng)過(guò)預(yù)編譯的,僅僅是取變量的值,是非安全的,存在SQL注入。在編寫mybatis的映射語(yǔ)句時(shí),盡量采用**“#{xxx}”這樣的格式。如果需要實(shí)現(xiàn)動(dòng)態(tài)傳入表名、列名,還需要做如下修改:添加屬性statementType="STATEMENT",同時(shí)sql里的屬有變量取值都改成${xxxx}**
●Mybatis和Hibernate的區(qū)別
?
?Hibernate 框架:
Hibernate是一個(gè)開放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,建立對(duì)象與數(shù)據(jù)庫(kù)表的映射。是一個(gè)全自動(dòng)的、完全面向?qū)ο蟮某志脤涌蚣堋?/p>
?
?Mybatis框架:
Mybatis是一個(gè)開源對(duì)象關(guān)系映射框架,原名:ibatis,2010年由谷歌接管以后更名。是一個(gè)半自動(dòng)化的持久層框架。
?
●區(qū)別:
★開發(fā)方面
在項(xiàng)目開發(fā)過(guò)程當(dāng)中,就速度而言:
hibernate開發(fā)中,sql語(yǔ)句已經(jīng)被封裝,直接可以使用,加快系統(tǒng)開發(fā);
Mybatis 屬于半自動(dòng)化,sql需要手工完成,稍微繁瑣;
但是,凡事都不是絕對(duì)的,如果對(duì)于龐大復(fù)雜的系統(tǒng)項(xiàng)目來(lái)說(shuō),復(fù)雜語(yǔ)句較多,hibernate 就不是好方案。
?
★sql優(yōu)化方面
Hibernate 自動(dòng)生成sql,有些語(yǔ)句較為繁瑣,會(huì)多消耗一些性能;
Mybatis 手動(dòng)編寫sql,可以避免不需要的查詢,提高系統(tǒng)性能;
?
★對(duì)象管理比對(duì)
Hibernate 是完整的對(duì)象-關(guān)系映射的框架,開發(fā)工程中,無(wú)需過(guò)多關(guān)注底層實(shí)現(xiàn),只要去管理對(duì)象即可;
Mybatis 需要自行管理映射關(guān)系