ICHARM
Spring工厂模式
Spring工厂模式

Java项目中都比较注重设计模式,工厂模式是Spring中核心设计模式之一,简单理解就是对象的创建和管理由框架来完成,使用过程中只需要传入固定标识,然后取出相应的实例,在调用相应的方法。下面从一个具体的例子来解释。

理财系统中涉及的交易过程,比如转入、转出、消费、退款等流程都会存在超时或者失败(向异常补偿表中插一条数据),这时系统需要进行的相应的补偿操作(重复执行),现在想通过一个job实现对所有业务流程的补偿操作。

通常的实现思路很简单,一个switch case语句,判断异常所属的业务类型,接着调用对应的方法进行补偿。

下面使用工厂模式来实现这个功能:

Step 1. 创建一个interface接口,规范补偿执行方法名,然后所有的业务补偿实现这个接口

ExceptionService
keyboard_arrow_down

package me.icharm.service.intf.exception;

public interface ExceptionService {

    /**
     * 交易补偿接口,各个类型交易根据交易请求标识,进行补偿操作
     * @param bizFk 外部交易标识
     * @return dto 返回补偿结果
     */
    RespExceptionTaskDto compenTransaction(String bizFk);
}

Step 2. 各业务各自实现这个接口的具体补偿过程(实现上面的接口)。

Step 3. 新建一个工厂类并实现InitializingBean,关键。

ExceptionFactory
keyboard_arrow_down

package me.icharm.service.impl.exception;

import me.icharm.enums.constants.exception.ExceptionCompenTaskEnums.BizCode;
import me.icharm.service.intf.exception.ExceptionService;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * 补偿任务工厂类
 */
@Service("exceptionFactory")
public class ExceptionFactory implements InitializingBean {

    // 买入
    @Autowired
    @Qualifier("bankBuyService")
    private ExceptionCompenService bankBuyService;

    // 卖出
    @Autowired
    @Qualifier("bankSellService")
    private ExceptionCompenService bankSellService;

    // ... 注入所有业务的具体补偿实现类

    // 用于存放所有业务实现service实例的Map
    private Map<String, ExceptionCompenService> serviceMap = new HashMap<String, ExceptionCompenService>();

    // 根据业务类型,获取对应service实例
    public ExceptionCompenService createProcessor(String bizCode) {
        return serviceMap.get(bizCode);
    }

    /** 
     * 重写Spring框架的InitializingBean的afterPropertiesSet来实现由Spring接管各业务补偿实例
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        // 购买
        serviceMap.put(BizCode.BUY.code, bankBuyService);
        // 支取
        serviceMap.put(BizCode.DRAW.code, bankSellService);
        // ...put 所有的业务补偿类实例
    }

Step 4. 补偿Job中调用ExceptionFactory 中createProcessor来获取具体的业务补偿实例,在调用补偿方法,实现补偿。

ExceptionTaskJob.java
keyboard_arrow_down

package me.icharm.service.job.exception;

import me.icharm.dao.dmo.exception.ExceptionTask;
import me.icharm.service.enums.constants.exception.ExceptionCompenTaskEnums.BizCode;
import me.icharm.service.intf.exception.ExceptionTaskServcice;
import me.icharm.service.impl.exception.ExceptionFactory;

import java.util.List;

@Service("exceptionTaskJob")
public class ExceptionTaskJob {

    /**
     * JOB BIZ ID
     */
    private static final String BIZ_JOB_ID = "EXCEPTION_TASK_JOB";

    /**
     * 注入异常补偿Service
     */
    @Autowired
    private ExceptionTaskServcice exceptionTaskServcice;

    /**
     * 注入工厂
     */
    @Autowired
    private ExceptionFactory exceptionFactory;

    /**
     * JOB业务处理方法
     */
    public void executeInvoke() {
        // 从异常补偿表中取异常数据
        List compenList = exceptionTaskServcice.queryExceptionDataList();

        for (ExceptionTask task : compenList) {
            // 处理补偿业务
            ExceptionService compen = exceptionFactory.createProcessor(task.getBizCode());
            compen.compenTransaction(task)
        }
    }
}

 

发表评论

textsms
account_circle
email

ICHARM

Spring工厂模式
Java项目中都比较注重设计模式,工厂模式是Spring中核心设计模式之一,简单理解就是对象的创建和管理由框架来完成,使用过程中只需要传入固定标识,然后取出相应的实例,在调用相应的方法…
扫描二维码继续阅读
2018-12-12