)
1、Spring框架中的單例bean是線程安全的嗎候選人不是線程安全的。當多用戶同時請求一個服務時容器會給每個請求分配一個線程這些線程會并發(fā)執(zhí)行業(yè)務邏輯。如果處理邏輯中包含對單例狀態(tài)的修改比如修改單例的成員屬性就必須考慮線程同步問題。Spring框架本身并不對單例bean進行線程安全封裝線程安全和并發(fā)問題需要開發(fā)者自行處理。通常在項目中使用的Spring bean是不可變狀態(tài)如Service類和DAO類因此在某種程度上可以說Spring的單例bean是線程安全的。如果bean有多種狀態(tài)如ViewModel對象就需要自行保證線程安全。最簡單的解決辦法是將單例bean的作用域由“singleton”變更為“prototype”。import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; Service Scope(prototype) // 指定多例作用域 public class UserService { }2、什么是AOP候選人AOP即面向切面編程在Spring中用于將那些與業(yè)務無關(guān)但對多個對象產(chǎn)生影響的公共行為和邏輯抽取出來實現(xiàn)公共模塊復用降低耦合。常見的應用場景包括公共日志保存和事務處理。3、你們項目中有沒有使用到AOP我們之前在后臺管理系統(tǒng)中使用AOP來記錄系統(tǒng)操作日志。主要思路是使用AOP的環(huán)繞通知和切點表達式找到需要記錄日志的方法然后通過環(huán)繞通知的參數(shù)獲取請求方法的參數(shù)例如類信息、方法信息、注解、請求方式等并將這些參數(shù)保存到數(shù)據(jù)庫。4、Spring中的事務是如何實現(xiàn)的候選人Spring實現(xiàn)事務的本質(zhì)是利用AOP完成的。它對方法前后進行攔截在執(zhí)行方法前開啟事務在執(zhí)行完目標方法后根據(jù)執(zhí)行情況提交或回滾事務。5、Spring中事務失效的場景有哪些在項目中我遇到過幾種導致事務失效的場景如果方法內(nèi)部捕獲并處理了異常沒有將異常拋出會導致事務失效。因此處理異常后應該確保異常能夠被拋出。如果方法拋出檢查型異常checked exception并且沒有在Transactional注解上配置rollbackFor屬性為Exception那么異常發(fā)生時事務可能不會回滾。如果事務注解的方法不是公開public修飾的也可能導致事務失效。Spring 事務是AOP 動態(tài)代理實現(xiàn)的而Spring AOPJDK 代理 / CGLIB 代理只能攔截 public 方法6、Spring的bean的生命周期候選人Spring中bean的生命周期包括以下步驟通過BeanDefinition獲取bean的定義信息。加載 xml / 注解配置解析得到BeanDefinitionBean 元信息類名、屬性、scope 等調(diào)用構(gòu)造函數(shù)實例化bean。根據(jù) BeanDefinition通過反射調(diào)用構(gòu)造方法new 出 Bean 原始對象此時對象已經(jīng)存在但屬性還沒賦值。進行bean的依賴注入例如通過setter方法或Autowired注解。給對象屬性賦值。此時 Bean 對象有屬性了但還沒有初始化。處理實現(xiàn)了Aware接口的bean。執(zhí)行aware里面重寫的方法執(zhí)行BeanPostProcessor的前置處理器。調(diào)用初始化方法如實現(xiàn)了InitializingBean接口或自定義的init-method。執(zhí)行BeanPostProcessor的后置處理器可能在這里產(chǎn)生代理對象。AOP 代理通常就是在這里生成的。之后 Bean 就可以正常使用了單例 Bean 會放入單例池。最后是銷毀bean。7、Spring中的循環(huán)引用候選人循環(huán)依賴發(fā)生在兩個或兩個以上的bean互相持有對方形成閉環(huán)。Spring框架允許循環(huán)依賴存在并通過三級緩存解決大部分循環(huán)依賴問題一級緩存單例池緩存已完成初始化的bean對象。二級緩存緩存尚未完成生命周期的早期bean對象。三級緩存緩存ObjectFactory用于創(chuàng)建bean對象和bean的代理對象。只用二級緩存在普通無 AOP 場景下可以解決循環(huán)依賴但是一旦 bean 需要 AOP 代理二級緩存就會出現(xiàn)問題。所以 Spring 引入第三級緩存專門處理【需要 AOP 代理】的循環(huán)依賴場景。那具體解決流程清楚嗎候選人解決循環(huán)依賴的流程如下實例化A對象并創(chuàng)建ObjectFactory存入三級緩存。A在初始化時需要B對象開始B的創(chuàng)建邏輯。B實例化完成也創(chuàng)建ObjectFactory存入三級緩存。B需要注入A通過三級緩存獲取ObjectFactory生成A對象存入二級緩存。B通過二級緩存獲得A對象后B創(chuàng)建成功存入一級緩存。A對象初始化時由于B已創(chuàng)建完成可以直接注入BA創(chuàng)建成功存入一級緩存。清除二級緩存中的臨時對象A。8、構(gòu)造方法出現(xiàn)了循環(huán)依賴怎么解決候選人由于構(gòu)造函數(shù)是bean生命周期中最先執(zhí)行的Spring框架無法解決構(gòu)造方法的循環(huán)依賴問題??梢允褂肔azy懶加載注解延遲bean的創(chuàng)建直到實際需要時。9、SpringMVC的執(zhí)行流程候選人SpringMVC的執(zhí)行流程包括以下步驟用戶發(fā)送請求到前端控制器DispatcherServlet。DispatcherServlet調(diào)用HandlerMapping找到具體處理器。HandlerMapping返回處理器對象及攔截器如果有給DispatcherServlet。DispatcherServlet調(diào)用HandlerAdapter。HandlerAdapter適配并調(diào)用具體處理器Controller。Controller執(zhí)行并返回ModelAndView對象。HandlerAdapter將ModelAndView返回給DispatcherServlet。DispatcherServlet傳給ViewResolver進行視圖解析。ViewResolver返回具體視圖給DispatcherServlet。DispatcherServlet渲染視圖并響應用戶。10、Springboot自動配置原理候選人Spring Boot的自動配置原理基于SpringBootApplication注解它封裝了SpringBootConfiguration、EnableAutoConfiguration和ComponentScan。EnableAutoConfiguration是核心它通過Import導入配置選擇器讀取META-INF/spring.factories文件中的類名根據(jù)條件注解決定是否將配置類中的Bean導入到Spring容器中。11、Spring 的常見注解有哪些候選人Spring的常見注解包括聲明Bean的注解Component、Service、Repository、Controller。依賴注入相關(guān)注解Autowired、Qualifier、Resource。設(shè)置作用域的注解Scope。配置相關(guān)注解Configuration、ComponentScan、Bean。AOP相關(guān)注解Aspect、Before、After、Around、Pointcut。12、SpringMVC常見的注解有哪些候選人SpringMVC的常見注解有RequestMapping映射請求路徑。RequestBody接收HTTP請求的JSON數(shù)據(jù)。RequestParam指定請求參數(shù)名稱。PathVariable從請求路徑中獲取參數(shù)。ResponseBody將Controller方法返回的對象轉(zhuǎn)化為JSON。RequestHeader獲取請求頭數(shù)據(jù)。PostMapping、GetMapping等。13、Springboot常見注解有哪些候選人Spring Boot的常見注解包括SpringBootApplication由SpringBootConfiguration、EnableAutoConfiguration和ComponentScan組成。其他注解如RestController、GetMapping、PostMapping等用于簡化Spring MVC的配置。14、MyBatis執(zhí)行流程候選人MyBatis的執(zhí)行流程如下讀取MyBatis配置文件mybatis-config.xml。構(gòu)造會話工廠SqlSessionFactory。會話工廠創(chuàng)建SqlSession對象。操作數(shù)據(jù)庫的接口Executor執(zhí)行器。Executor執(zhí)行方法中的MappedStatement參數(shù)。輸入?yún)?shù)映射。輸出結(jié)果映射。15、Mybatis是否支持延遲加載候選人MyBatis支持延遲加載即在需要用到數(shù)據(jù)時才加載??梢酝ㄟ^配置文件中的lazyLoadingEnabled配置啟用或禁用延遲加載。16、延遲加載的底層原理知道嗎候選人延遲加載的底層原理主要使用CGLIB動態(tài)代理實現(xiàn)使用CGLIB創(chuàng)建目標對象的代理對象。調(diào)用目標方法時如果發(fā)現(xiàn)是null值則執(zhí)行SQL查詢。獲取數(shù)據(jù)后設(shè)置屬性值并繼續(xù)查詢目標方法。17、Mybatis的一級、二級緩存用過嗎候選人MyBatis的一級緩存是基于HashMap本地緩存作用域為sqlSession默認開啟。二級緩存需要單獨開啟作用域為Namespace或mapper默認也是采用HashMap存儲。18、Mybatis的二級緩存什么時候會清理緩存中的數(shù)據(jù)候選人當作用域一級緩存Session/二級緩存Namespaces進行了新增、修改、刪除操作后默認該作用域下所有select中的緩存將被清空。