欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析Java模板方法的一種使用方式

 更新時(shí)間:2023年02月23日 10:27:54   作者:Tangjiacheng  
模板方法說白了就是將一段代碼模板化,將通用的代碼段抽取出來,并提供一些自定義的接口去定制的特定位置的某些業(yè)務(wù)功能。本文主要來和大家聊聊它的一種使用方式,希望對(duì)大家有所幫助

為什么我會(huì)想到使用模板方法呢?

在日常開發(fā)中,我們經(jīng)常需要使用編程式事務(wù)來解決一些實(shí)在的業(yè)務(wù)問題。以Hibernate框架為例(其實(shí)對(duì)于ORM框架來說,都大同小異。我們公司使用的是Hiberante,所以這里就以Hibernate為例了),我們實(shí)現(xiàn)一個(gè)編程式事務(wù)如下:

SessionFactory sessionFactory = (SessionFactory) applicationContext.getBean("sessionFactory");
Session session = sessionFactory.openSession();
try {
    session.beginTransaction();
    String sql = "update table set A = :a where id = :id";
    session.createNativeQuery(sql)
            .setParameter("a", "a")
            .setParameter("id", id)
            .executeUpdate();
    session.getTransaction().commit();
} catch (Exception e) {
    session.getTransaction().rollback();
} finally {
    session.close();
}

我們看上述的代碼是不是有一種很亂的感覺,還要自己去寫try{}catch{}finally{}。而且當(dāng)我們代碼中有很多地方都應(yīng)用了編程式事務(wù)的話,那么我們的代碼會(huì)顯得有些臃腫。尤其對(duì)于我這種強(qiáng)迫癥患者來說,哈哈??!

既然如此,我們肯定要想一種方式去優(yōu)化一下,至少讓它看起來更優(yōu)美一些。我這里選擇使用模板方法來改造一下。

什么是模板方法設(shè)計(jì)模式?

模板方法說白了就是將一段代碼模板化,將通用的代碼段抽取出來,并提供一些自定義的接口去定制的特定位置的某些業(yè)務(wù)功能。

根據(jù)我的理解,模板方法的核心思想就是 重寫 。我們在模板中的指定位置提供一個(gè)外部可編輯的接口,讓調(diào)用者可以根據(jù)需求去隨意重寫這個(gè)接口來達(dá)到他的目的。

其實(shí)在Spring中也廣泛使用的模板方法,當(dāng)我們學(xué)習(xí)Spring源碼的時(shí)候會(huì)發(fā)現(xiàn),實(shí)際上Bean的生命周期中就使用了模板方法。我們可以根據(jù)自己的需求在Bean生命周期的各個(gè)階段去做一些事情。

代碼優(yōu)化

首先我們先維護(hù)一個(gè)抽象的模板類,這個(gè)類里包含了三個(gè)公開的方法,用來提供為調(diào)用者去定制使用。

public abstract class TransactionManagerTemplate {

    /**
     * 處理事務(wù)中的實(shí)際要處理的業(yè)務(wù)代碼
     */
    public void handle() {}

    /**
     * 異常處理
     */
    public void exceptionHandle() {}

    /**
     * finally處理
     */
    public void finallyHandle() {}

}

然后我們創(chuàng)建一個(gè)事務(wù)管理器,封裝一個(gè)runTransaction方法,里面就包含了上面那邊不忍直視的代碼。然后我們將Session和抽象的模板類作為參數(shù)傳入

并且將抽象的模板類中的三個(gè)公開方法填入到try{}catch{}finally{}中的各個(gè)位置。

@Component
public class TransactionManager {

    @Autowired
    private ApplicationContext applicationContext;

    /**
     * 默認(rèn)SessionFactory
     */
    public static final String DEFAULT_SESSION_FACTORY = "sessionFactory";


    /**
     * 執(zhí)行事務(wù)
     * @param session
     * @param transactionManagerTemplate
     *
     * 使用案例:
     * Session session = transactionManager.getSession();
     * transactionManager.runTransaction(session, new TransactionManagerTemplate() {
     *     // 實(shí)際要重寫的接口
     * });
     */
    public void runTransaction(Session session, TransactionManagerTemplate transactionManagerTemplate) {
        try {
            session.beginTransaction();
            transactionManagerTemplate.handle();
            session.getTransaction().commit();
        } catch (Exception e) {
            transactionManagerTemplate.exceptionHandle();
            session.getTransaction().rollback();
        } finally {
            transactionManagerTemplate.finallyHandle();
            session.close();
        }
    }

    /**
     * 獲取默認(rèn)SessionFactory
     * @return
     */
    public SessionFactory getSessionFactory() {
        return getSessionFactory(DEFAULT_SESSION_FACTORY);
    }

    /**
     * 獲取指定SessionFactory
     * @param beanName      指定SessionFactory的BeanName
     * @return
     */
    public SessionFactory getSessionFactory(String beanName) {
        SessionFactory sessionFactory = (SessionFactory) applicationContext.getBean(beanName);
        if(sessionFactory == null) {
            throw new BAPException("不存在BeanName為【{}】的SessionFactory", beanName);
        }
        return sessionFactory;
    }

    /**
     * 獲取默認(rèn)Session
     * @return
     */
    public Session getSession() {
        return getSessionFactory(DEFAULT_SESSION_FACTORY).openSession();
    }

    /**
     * 獲取指定SessionFactory下的Session
     * @param sessionFactoryBeanName      指定SessionFactory的BeanName
     * @return
     */
    public Session getSession(String sessionFactoryBeanName) {
        return getSessionFactory(sessionFactoryBeanName).openSession();
    }

}

我們在業(yè)務(wù)代碼中想要再次使用編程式事務(wù)時(shí),就可以通過如下方式調(diào)用:

Session session = transactionManager.getSession();
transactionManager.runTransaction(session, new TransactionManagerTemplate() {
    @Override
    public void handle() {
        // try中要添加的業(yè)務(wù)邏輯
    }

    @Override
    public void exceptionHandle() {
        // catch中要添加的業(yè)務(wù)邏輯
    }

    @Override
    public void finallyHandle() {
        // finally中要添加的業(yè)務(wù)邏輯
    }
});

看,這是不是更美觀了一些呀!

以上就是淺析Java模板方法的一種使用方式的詳細(xì)內(nèi)容,更多關(guān)于Java模板方法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 數(shù)據(jù)結(jié)構(gòu)之堆的概念與應(yīng)用

    Java 數(shù)據(jù)結(jié)構(gòu)之堆的概念與應(yīng)用

    堆是一顆完全二叉樹,在這棵樹中,所有父節(jié)點(diǎn)都滿足大于等于其子節(jié)點(diǎn)的堆叫大根堆,所有父節(jié)點(diǎn)都滿足小于等于其子節(jié)點(diǎn)的堆叫小根堆,堆雖然是一顆樹,但是通常存放在一個(gè)數(shù)組中,父節(jié)點(diǎn)和孩子節(jié)點(diǎn)的父子關(guān)系通過數(shù)組下標(biāo)來確定
    2021-10-10
  • 詳解Spring Boot 打包分離依賴JAR 和配置文件

    詳解Spring Boot 打包分離依賴JAR 和配置文件

    這篇文章主要介紹了Spring Boot 打包分離依賴JAR 和配置文件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • JavaWeb實(shí)現(xiàn)文件上傳下載功能實(shí)例解析

    JavaWeb實(shí)現(xiàn)文件上傳下載功能實(shí)例解析

    這篇文章主要為大家詳細(xì)介紹了JavaWeb中的文件上傳和下載功能的實(shí)現(xiàn),在Web應(yīng)用系統(tǒng)開發(fā)中,文件上傳和下載功能是非常常用的功能,需要的朋友可以參考下
    2015-08-08
  • Spring入門基礎(chǔ)之依賴注入

    Spring入門基礎(chǔ)之依賴注入

    Idea中使用@Autowire注解會(huì)出現(xiàn)提示黃線,強(qiáng)迫癥患者看著很難受,使用構(gòu)造器注入或者setter方法注入后可解決,下面我們一起來看看
    2022-07-07
  • 在idea中顯示springboot面板的方法

    在idea中顯示springboot面板的方法

    這篇文章主要介紹了在idea中顯示springboot面板的方法方便啟動(dòng)調(diào)試,本文通過代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • SpringBoot基于Sentinel在服務(wù)上實(shí)現(xiàn)接口限流

    SpringBoot基于Sentinel在服務(wù)上實(shí)現(xiàn)接口限流

    這篇文章主要介紹了SpringBoot基于Sentinel在服務(wù)上實(shí)現(xiàn)接口限流,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Springboot引入hibernate配置自動(dòng)建表并進(jìn)行增刪改查操作

    Springboot引入hibernate配置自動(dòng)建表并進(jìn)行增刪改查操作

    這篇文章主要介紹了Springboot引入hibernate配置自動(dòng)建表并進(jìn)行增刪改查,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • SpringSecurity自動(dòng)登錄流程與實(shí)現(xiàn)詳解

    SpringSecurity自動(dòng)登錄流程與實(shí)現(xiàn)詳解

    這篇文章主要介紹了SpringSecurity自動(dòng)登錄流程與實(shí)現(xiàn)詳解,所謂的自動(dòng)登錄是在訪問鏈接時(shí)瀏覽器自動(dòng)攜帶上了Cookie中的Token交給后端校驗(yàn),如果刪掉了Cookie或者過期了同樣是需要再次驗(yàn)證的,需要的朋友可以參考下
    2024-01-01
  • gateway基本配置教程

    gateway基本配置教程

    路由(Route)由一個(gè)ID,一個(gè)目標(biāo)URI(最終路由到的url地址),一組斷言(匹配條件判斷)和一組過濾器定義,這篇文章主要介紹了gateway基本配置,需要的朋友可以參考下
    2023-05-05
  • springboot連接sqllite遇到的坑及解決

    springboot連接sqllite遇到的坑及解決

    這篇文章主要介紹了springboot連接sqllite遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論