**
使用ThreadLocal來減低耦合,減少依賴
**
一.ThreadLocal是什么?
java.lang.ThreadLocal 該類提供了執行緒區域 (thread-local) 變數,用于在當前執行緒中共享資料,
二.ThreadLocaler有什么特點?
1 ThreadLocal工具類底層就是一個Map,key存放的當前執行緒,value存放需要共享的資料,
2 使用哪個執行緒存的,就只能使用哪個執行緒取
三.MySessionUtils類的改造
原代碼
SqlSession屬于Dao層代碼,不允許出現在Service層中,但是在Service層中可能會用到Mybatis,這樣就會造成高耦合
//Session工具類
public class MySessionUtils {
private static SqlSessionFactory sessionFactory;
//static 靜態代碼,在類加載的時候執行一次,且只執行一次
static{
// 》1 創建SqlSessionFactoryBuilder物件
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 》2 創建SqlSessionFactory物件
InputStream inputStream = MySessionUtils.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
sessionFactory = sqlSessionFactoryBuilder.build(inputStream);//加載核心組態檔 參1 輸入流
// 》3 加載SqlMapConfig.xml組態檔
}
public static SqlSession getSession() {
// 》4 創建SqlSession物件
SqlSession sqlSession = sessionFactory.openSession();
return sqlSession;
}
}
使用ThreadLocal進行改造
public class MySessionUtils2 {
private static SqlSessionFactory sessionFactory;
// 創建一個map來存放執行緒
public static ThreadLocal<SqlSession> map=new ThreadLocal<>();
//static 靜態代碼,在類加載的時候執行一次,且只執行一次
static{
// 》1 創建SqlSessionFactoryBuilder物件
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 》2 創建SqlSessionFactory物件
InputStream inputStream = MySessionUtils2.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
sessionFactory = sqlSessionFactoryBuilder.build(inputStream);//加載核心組態檔 參1 輸入流
// 》3 加載SqlMapConfig.xml組態檔
}
// 用ThreadLocal來降低耦合 定義一個集合來存盤執行緒,Map<Thread,Object>
public static SqlSession getSession() {
//查找local中已經存在的session
SqlSession sqlSession=map.get();
if (sqlSession!=null){
return sqlSession;
}
//session不存在時,創建session,并保存在Local中
else {
sqlSession = sessionFactory.openSession();
map.set(sqlSession);
return sqlSession;
}
// 》4 創建SqlSession物件
}
//提交關閉session,用ThreadLocal集合
public static void commitAndCloseSession(){
SqlSession sqlSession=map.get();
if(sqlSession!=null){
sqlSession.commit();
sqlSession.close();
//已經關閉了的session不能留在local
//要洗掉
map.remove();
}
}
}
執行一次MySessionUtils2 方法就是一個執行緒,在同一個執行緒中,在不同的方法里都可以呼叫其中的存放的session

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/160044.html
標籤:其他
下一篇:java中高級工程師面試匯總
