<tr id="ieeco"><small id="ieeco"></small></tr>
<acronym id="ieeco"></acronym>

自定義注解的方式的使用場景:解決業務分發

實際項目中我們可以用自定義注解解決很多事情!

解決業務分發

最近在做的一個項目,對接科大訊飛語音平臺,他們平臺上面的調用地址只能填一個,所以我項目上需要做到一個接口處理很多業務場景,如果我用傳統方式處理,那么我可能需要些大量的if else或者switch等語法糖,這里我們可以使用自定義注解解決,廢話少說直接上代碼。

  1. 首先創建我們的自定義注解
  • 控制器/類注解,注解到類上面 ,用于我們查找我們需要的類
package com.jx.fly.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 控制器注解
 *
 * @author xiaojian
 * @date 2019/5/9
 **/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ControllerAnnotation {
}
  • 方法注解,注解到方法上面,用于找到我們需要的方法,這里我們加上標識值
package com.jx.fly.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 方法注解
 *
 * @author xiaojian
 * @date 2019/5/9
 **/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodAnnotation {
    String value();
}
  1. 創建方法緩存類,我們的系統啟動的時候就將我們加了注解的的方法保存到這個類里面,以便我們使用標識值去獲取調用
package com.jx.fly.main.model.method;

import lombok.Data;

import java.lang.reflect.Method;

/**
 * @author xiaojian
 * @description
 * @date 2019/5/9
 **/
@Data
public class MethodObj {
    private Method method;
    private Object obj;
}

  1. 創建系統啟動監聽類,這里的主要作用就是在系統啟動的時候通過我們的自定義注解找到我們需要的方法保存到上一步的MethodObj模型里面
package com.jx.fly.common.listener;

import com.jx.fly.common.annotation.ControllerAnnotation;
import com.jx.fly.common.annotation.MethodAnnotation;
import com.jx.fly.common.cache.MethodCache;
import com.jx.fly.main.model.method.MethodObj;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.lang.reflect.Method;
import java.util.Map;

/**
 * @author xiaojian
 * @description 系統啟動監聽
 * @date 2019/4/29
 **/
@Service
@Transactional(rollbackFor = Exception.class,readOnly = true)
public class SysStartListener implements CommandLineRunner, ApplicationContextAware {

    private ApplicationContext applicationContext;
    @Value(value = "${websocket.port}")
    private int webSocketPort;

    @Override
    public void run(String... args) throws Exception {
        this.loadAnnotation();
    }

    public void loadAnnotation() {
        Map<String, Object> map = applicationContext.getBeansWithAnnotation(ControllerAnnotation.class);
        if (map == null) {
            return;
        }
        for (Object obj : map.values()) {
            for (Method method : obj.getClass().getMethods()) {
                if (method.isAnnotationPresent(MethodAnnotation.class)) {
                    String cmd = method.getAnnotation(MethodAnnotation.class).value();
                    MethodObj ref = new MethodObj();
                    ref.setMethod(method);
                    ref.setObj(obj);
                    MethodCache.setMethod(cmd, ref);
                }
            }
        }
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}
  1. 創建接收任務的類,也就是我們的業務處理類,根據業務量的大小自行增加,這里的方法標識值取的是1,根據業務自行的換成枚舉類即可
package com.jx.fly.module.controller;

import com.jx.fly.common.annotation.ControllerAnnotation;
import com.jx.fly.common.annotation.MethodAnnotation;
import com.jx.fly.common.enums.SocketCommandEnum;
import com.jx.fly.common.result.ResultModel;
import com.jx.fly.common.utils.ResponseUtil;
import com.jx.fly.main.model.req.ReqModel;
import com.jx.smart.common.model.labor.attendance.project.LaborProjectConfigModel;
import org.springframework.stereotype.Component;

import static com.jx.fly.common.enums.MethodCommandEnum.*;

/**
 * 業務1
 *
 * @author zhongxiaojian
 * @date 2019-05-18
 **/
@ControllerAnnotation()
@Component
public class ExitController {

    /**
     * @param body
     * @return
     */
    @MethodAnnotation("1")
    public Object count(String body){
    	//業務的處理......
        return null;
    }
}

  1. 創建分發任務的類,也就是唯一入口
package com.jx.fly.main.controller;

import cn.hutool.log.StaticLog;
import com.alibaba.fastjson.JSON;
import com.jx.fly.common.annotation.SignAnnotation;
import com.jx.fly.common.cache.MethodCache;
import com.jx.fly.common.utils.ResponseUtil;
import com.jx.fly.main.model.method.MethodObj;
import com.jx.fly.main.model.req.ReqModel;
import com.jx.fly.module.mapper.LaborProjectConfigMapper;
import com.jx.smart.common.model.labor.attendance.project.LaborProjectConfigModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.lang.reflect.InvocationTargetException;

/**
 * 業務入口
 * @author xiaojian
 * @date 2019/5/8
 **/
@RestController
@RequestMapping("/fly")
public class MainController {

    @Value("${enableTest}")
    private boolean enableTest;
    @Autowired
    private LaborProjectConfigMapper laborProjectConfigMapper;

    /**
     * 業務處理分發
     * @param signature
     * @param body
     * @return
     */
    @PostMapping("/main")
    public Object handle(@RequestHeader("Signature") String signature,
                         @RequestBody String body){
        //業務分發  
        MethodObj ref = MethodCache.getMethod("1");
            try {
                LaborProjectConfigModel laborProjectConfigModel = laborProjectConfigMapper.selectById(projectId);
                return ref.getMethod().invoke(ref.getObj(),body);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            return null;
    }
}
相關推薦
??2020 CSDN 皮膚主題: 編程工作室 設計師:CSDN官方博客 返回首頁
彩票送彩金