深圳寶安區(qū)最新通告泉州seo網(wǎng)站排名
Spring框架中的bean是單例的嗎?Spring框架中的單例bean是線程安全的嗎?
singleton : bean在每個(gè)Spring IOC容器中只有一個(gè)實(shí)例。
prototype:一個(gè)bean的定義可以有多個(gè)實(shí)例。
Spring bean并沒(méi)有可變的狀態(tài)(比如Service類和DAO類),所以在某種程度上說(shuō)Spring的單例bean是線程安全的
如果在bean中定義了可修改的成員變量,是要考慮線程安全問(wèn)題的,可以使用多例或者加鎖來(lái)解決
Spring中的事務(wù)是如何實(shí)現(xiàn)的
編程式事務(wù)控制:需使用TransactionTemplate來(lái)進(jìn)行實(shí)現(xiàn),對(duì)業(yè)務(wù)代碼有侵入性,項(xiàng)目中很少使用
聲明式事務(wù)管理:聲明式事務(wù)管理建立在AOP之上的。其本質(zhì)是通過(guò)AOP功能,對(duì)方法前后進(jìn)行攔截,將事務(wù)處理的功能編織到攔截的方法中,也就是在目標(biāo)方法開始之前加入一個(gè)事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)
Spring中事務(wù)失效的場(chǎng)景有哪些
異常捕獲處理,自己處理了異常,沒(méi)有拋出,解決:手動(dòng)拋出
拋出檢查異常,配置rollbackFor屬性為Exception
非public方法導(dǎo)致的事務(wù)失效,改為public
Spring的bean的生命周期
?
通過(guò)BeanDefinition獲取bean的定義信息
調(diào)用構(gòu)造函數(shù)實(shí)例化bean
bean的依賴注入
處理Aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware)
Bean的前置處理器BeanPostProcessor-前置
初始化方法(InitializingBean、init-method)
Bean的后置處理器BeanPostProcessor-后置
銷毀bean
Spring中的循環(huán)引用
循環(huán)依賴:循環(huán)依賴其實(shí)就是循環(huán)引用,也就是兩個(gè)或兩個(gè)以上的bean互相持有對(duì)方,最終形成閉環(huán)。比如A依賴于B,B依賴于A
循環(huán)依賴在spring中是允許存在,spring框架依據(jù)三級(jí)緩存已經(jīng)解決了大部分的循環(huán)依賴
一級(jí)緩存:單例池,緩存已經(jīng)經(jīng)歷了完整的生命周期,已經(jīng)初始化完成的bean對(duì)象
二級(jí)緩存:緩存早期的bean對(duì)象(生命周期還沒(méi)走完)
三級(jí)緩存:緩存的是ObjectFactory,表示對(duì)象工廠,用來(lái)創(chuàng)建某個(gè)對(duì)象的
//單實(shí)例對(duì)象注冊(cè)器
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {private static final int SUPPRESSED_EXCEPTIONS_LIMIT = 100;private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap(16);
}
構(gòu)造方法出現(xiàn)了循環(huán)依賴怎么解決?
使用@Lazy進(jìn)行懶加載,什么時(shí)候需要對(duì)象再進(jìn)行bean對(duì)象的創(chuàng)建
public A(@Lazy B b){System.out.println("A的構(gòu)造方法執(zhí)行了...");this.b = b ;
}
?Springboot自動(dòng)配置原理
在Spring Boot項(xiàng)目中的引導(dǎo)類上有一個(gè)注解@SpringBootApplication,其中@EnableAutoConfiguration是實(shí)現(xiàn)自動(dòng)化配置的核心注解。 該注解通過(guò)@Import注解導(dǎo)入對(duì)應(yīng)的配置選擇器。 內(nèi)部就是讀取了該項(xiàng)目和該項(xiàng)目引用的Jar包的的classpath路徑下META-INF/spring.factories文件中的所配置的類的全類名。 在這些配置類中所定義的Bean會(huì)根據(jù)條件注解所指定的條件來(lái)決定是否需要將其導(dǎo)入到Spring容器中。 條件判斷會(huì)有像@ConditionalOnClass這樣的注解,判斷是否有對(duì)應(yīng)的class文件,如果有則加載該類,把這個(gè)配置類的所有的Bean放入spring容器中使用。
?Spring框架常見注解(Spring、Springboot、Springmvc)
?
?
?Mybatis是否支持延遲加載?延遲加載的底層原理知道嗎?
延遲加載的意思是:就是在需要用到數(shù)據(jù)時(shí)才進(jìn)行加載,不需要用到數(shù)據(jù)時(shí)就不加載數(shù)據(jù)。
(查詢用戶的時(shí)候,把用戶所屬的訂單數(shù)據(jù)也查詢出來(lái),這個(gè)是立即加載 查詢用戶的時(shí)候,暫時(shí)不查詢訂單數(shù)據(jù),當(dāng)需要訂單的時(shí)候,再查詢訂單,這個(gè)就是延遲加載)
Mybatis支持一對(duì)一關(guān)聯(lián)對(duì)象和一對(duì)多關(guān)聯(lián)集合對(duì)象的延遲加載
在Mybatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false,默認(rèn)是關(guān)閉的
使用CGLIB創(chuàng)建目標(biāo)對(duì)象的代理對(duì)象
當(dāng)調(diào)用目標(biāo)方法時(shí),進(jìn)入攔截器invoke方法,發(fā)現(xiàn)目標(biāo)方法是null值,執(zhí)行sql查詢
獲取數(shù)據(jù)以后,調(diào)用set方法設(shè)置屬性值,再繼續(xù)查詢目標(biāo)方法,就有值了
Mybatis的一級(jí)、二級(jí)緩存用過(guò)嗎?
一級(jí)緩存: 基于 PerpetualCache 的 HashMap 本地緩存,其存儲(chǔ)作用域?yàn)?Session(指sqlSession),當(dāng)Session進(jìn)行flush或close之后,該Session中的所有Cache就將清空,默認(rèn)打開一級(jí)緩存
二級(jí)緩存是基于namespace和mapper的作用域起作用的,不是依賴于SQL session,默認(rèn)也是采用 PerpetualCache,HashMap 存儲(chǔ)。需要單獨(dú)開啟,一個(gè)是核心配置,一個(gè)是mapper映射文件
二級(jí)緩存需要緩存的數(shù)據(jù)實(shí)現(xiàn)Serializable接口
只有會(huì)話提交或者關(guān)閉以后,一級(jí)緩存中的數(shù)據(jù)才會(huì)轉(zhuǎn)移到二級(jí)緩存中?
當(dāng)某一個(gè)作用域(一級(jí)緩存 Session/二級(jí)緩存Namespaces)的進(jìn)行了新增、修改、刪除操作后,默認(rèn)該作用域下所有 select 中的緩存將被 clear。