首页 > 其他分享 >spring,自定义注解,工厂模式,策略模式优化 if else,jdk1.7

spring,自定义注解,工厂模式,策略模式优化 if else,jdk1.7

时间:2023-02-19 23:37:52浏览次数:46  
标签:mhm dto 自定义 spring 模式 org import com public


最近项目中使用mqtt监听消息,再根据消息做各种处理,使用大量的if else,代码异常难维护,

参考的地址找不到了。。。

 

以下为实现:

接收mqtt的接口类

package com.mhm.mqttlistener;

import org.apache.log4j.Logger;

public interface MqttService {

public void send(String topic, String content) throws Exception;

public void handler(String message) throws Exception;

}

 

接收mqtt消息的实现类

package com.mhm.mqttlistener;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.mhm.dto.api.mqtt.MqttCmdDto;
import com.mhm.mqttlistener.executor.MqttExecutor;


@Component
public class MqttServiceImpl implements MqttService {

@Autowired
private MqttPahoMessageHandler mqttHandler;

@Autowired
MqttExecutor mqttExecutor;

static final Logger log = Logger.getLogger(MqttService.class);

@Override
public void send(String topic, String content) throws Exception {
// 构建消息
Message<String> messages = MessageBuilder.withPayload(content)
.setHeader(MqttHeaders.TOPIC, topic).build();
// 发送消息
mqttHandler.handleMessage(messages);
}

@Override
public void handler(String message) throws Exception {
// log.info("收到消息:" + message);

// KuaiyueCmdDto cmdDto = JSON.parseObject(message, KuaiyueCmdDto.class);
if(!StringUtils.isBlank(message)) {
// MqttMsgExecutor servcice = new MqttMsgExecutor();
mqttExecutor.process(message);
} else {
log.info("消息为空");
}

}

}

 

把打了注解的类遍历出来后放入map,(注解类在下面)

package com.mhm.mqttlistener.executor;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.annotation.PostConstruct;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import com.mhm.enumeration.EnumMqttMsgtype;
import com.mhm.framework.aspect.mqttmsgtype.MqttmsgtypeAspect;
import com.mhm.utils.SpringContextHolder;

@Service
public class MqttExecutorFactory {

private static Map<EnumMqttMsgtype, MqttExecutorService> mqttMsgTypeMap = new ConcurrentHashMap<>();

// SpringContextHolder springContextHolder;

//工厂将 Spring 装配的相关的 Bean 用 Map 保存起来
@PostConstruct
public void init() {

Map<String, Object> beanMap = SpringContextHolder.getApplicationContext().getBeansWithAnnotation(MqttmsgtypeAspect.class);

for(Object service : beanMap.values()) {
MqttmsgtypeAspect annotation = service.getClass().getAnnotation(MqttmsgtypeAspect.class);
mqttMsgTypeMap.put(annotation.value(), (MqttExecutorService)service);
}
}

public MqttExecutorService createMqttExecutor(EnumMqttMsgtype msgtype) {
return mqttMsgTypeMap.get(msgtype);
}
}

 

pring-application.xml中加入SpringContextHolder的声明

<bean id="springContextHolder" class="com.mhm.utils.SpringContextHolder"
lazy-init="false"></bean>
package com.mhm.utils;

import java.util.Map;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import com.mhm.mng.GroupInfoMng;


public class SpringContextHolder implements ApplicationContextAware {

private static ApplicationContext applicationContext;


//实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextHolder.applicationContext = applicationContext;
}


//取得存储在静态变量中的ApplicationContext.
public static ApplicationContext getApplicationContext() {
checkApplicationContext();
return applicationContext;
}


//从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
checkApplicationContext();
return (T) applicationContext.getBean(name);
}

//从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
//从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
//如果有多个Bean符合Class, 取出第一个.
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<T> clazz) {
checkApplicationContext();
@SuppressWarnings("rawtypes")
Map beanMaps = applicationContext.getBeansOfType(clazz);
if (beanMaps!=null && !beanMaps.isEmpty()) {
return (T) beanMaps.values().iterator().next();
} else{
return null;
}
}

private static void checkApplicationContext() {
if (applicationContext == null) {
throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");
}
}

}

 

Enum消息类型

package com.mhm.enumeration;

public enum EnumMqttMsgtype {

/**
* 开灯
*/
OPEN("开灯"),

/**
* 关灯
*/
CLOSE("关灯"),

/**
* 调光
*/
DIMMER("调光"),


/**
* NULL
*/
NULL("空");

private String desc;

EnumMqttMsgtype(String desc) {
this.desc = desc;
}

public String getDesc() {
return desc;
}

public void setDesc(String desc) {
this.desc = desc;
}

}

 

MqttExecutor ,处理消息入口类

package com.mhm.mqttlistener.executor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.cz.highland.dto.OnenetPushDataDto;
import com.mhm.dto.api.mqtt.MqttCmdDto;
import com.mhm.enumeration.EnumMqttMsgtype;

@Component
public class MqttExecutor {

@Autowired
MqttExecutorFactory mqttExecutorFactory;

public void process(String message) {

try {
MqttCmdDto cmdDto = JSON.parseObject(message, MqttCmdDto.class);

EnumMqttMsgtype msgtype = EnumMqttMsgtype.valueOf(cmdDto.getMsgType() == null ? "NULL" : cmdDto.getMsgType().toUpperCase());
MqttExecutorService myMqttService = mqttExecutorFactory.createMqttExecutor(msgtype);
myMqttService.execute(cmdDto);

} catch (Exception ex) {
ex.printStackTrace();
}
}
}

 

ExecutorBase ,每个子处理类的基类

package com.mhm.mqttlistener.executor;

import org.apache.commons.lang3.StringUtils;

import com.mhm.dto.api.mqtt.MqttCmdDto;

public class ExecutorBase {

protected String generateCodes(MqttCmdDto dto) {

StringBuilder code = new StringBuilder();
if(dto.getSnGroup() != null && !dto.getSnGroup().isEmpty()) {
for (int i = 0; i < dto.getSnGroup().size(); i++) {
if(StringUtils.isBlank(code)) {
code.append(dto.getSnGroup().get(i).getSerialNumber());
} else {
code.append(",").append(dto.getSnGroup().get(i).getSerialNumber());
}
}
}

return code.toString();
}
}

 

MqttExecutorService ,子处理类的接口

package com.mhm.mqttlistener.executor;

import com.mhm.dto.api.mqtt.MqttCmdDto;

public interface MqttExecutorService {

public void execute(MqttCmdDto dto);

}

 

开灯的处理子类

package com.mhm.mqttlistener.executor.impl;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.mhm.dto.BusinessRtnMsg;
import com.mhm.dto.OperatorDto;
import com.mhm.dto.api.mqtt.MqttCmdDto;
import com.mhm.entity.Userinfo;
import com.mhm.enumeration.EnumMqttMsgtype;
import com.mhm.framework.aspect.mqttmsgtype.MqttmsgtypeAspect;
import com.mhm.framework.common.Constants;
import com.mhm.mng.CommandMng;
import com.mhm.mqttlistener.executor.ExecutorBase;
import com.mhm.mqttlistener.executor.MqttExecutorService;
import com.mhm.utils.LedConstants;


@Component("myMqttOpen")
@MqttmsgtypeAspect(value = EnumMqttMsgtype.OPEN)
public class ExecutorServiceImpl_Open extends ExecutorBase implements MqttExecutorService {

@Autowired
private CommandMng commandMng;

@Override
public void execute(MqttCmdDto dto) {
System.out.println("open...");

// 需判断该topic是否对该资源有open操作

String codes = generateCodes(dto);

OperatorDto operatorDto = new OperatorDto();
operatorDto.setOperatorType(Constants.INT_VALUE2);
operatorDto.setClient(LedConstants.LOG_CLIENT_MQTT);
operatorDto.setNodeLevel(LedConstants.CONTROLLER_NODE_TYPE); // setNodeLevel必须在SetControllerType之前
operatorDto.setControllerType(Constants.INT_VALUE0);
operatorDto.setParam1(codes);
operatorDto.setParam2("1");

Userinfo user = new Userinfo(1);

BusinessRtnMsg brmsg = commandMng.cmd_api_v2_switchLight(user, operatorDto);


}

}

 

关灯的处理子类:

package com.mhm.mqttlistener.executor.impl;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.mhm.dto.BusinessRtnMsg;
import com.mhm.dto.OperatorDto;
import com.mhm.dto.api.mqtt.MqttCmdDto;
import com.mhm.entity.Userinfo;
import com.mhm.enumeration.EnumMqttMsgtype;
import com.mhm.framework.aspect.mqttmsgtype.MqttmsgtypeAspect;
import com.mhm.framework.common.Constants;
import com.mhm.mng.CommandMng;
import com.mhm.mqttlistener.executor.ExecutorBase;
import com.mhm.mqttlistener.executor.MqttExecutorService;
import com.mhm.utils.LedConstants;


@Component("myMqttClose")
@MqttmsgtypeAspect(value = EnumMqttMsgtype.CLOSE)
public class ExecutorServiceImpl_Close extends ExecutorBase implements MqttExecutorService {

@Autowired
private CommandMng commandMng;

@Override
public void execute(MqttCmdDto dto) {
System.out.println("close...");

// 需判断该topic是否对该资源有open操作

String codes = generateCodes(dto);

OperatorDto operatorDto = new OperatorDto();
operatorDto.setOperatorType(Constants.INT_VALUE2);
operatorDto.setClient(LedConstants.LOG_CLIENT_MQTT);
operatorDto.setNodeLevel(LedConstants.CONTROLLER_NODE_TYPE); // setNodeLevel必须在SetControllerType之前
operatorDto.setControllerType(Constants.INT_VALUE0);
operatorDto.setParam1(codes);
operatorDto.setParam2("0");

Userinfo user = new Userinfo(1);

BusinessRtnMsg brmsg = commandMng.cmd_api_v2_switchLight(user, operatorDto);

}



}

 

 

 

标签:mhm,dto,自定义,spring,模式,org,import,com,public
From: https://blog.51cto.com/u_21817/6066942

相关文章

  • #yyds干货盘点#【愚公系列】2023年02月 微信小程序-Vant实现自定义tabBar
    前言小程序自定义tabBar官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html1、说明小程序自定义tabBar两种方式:一种采用......
  • Springcloud环境中bootstrap.yml加载原理
    如果是Springcloud项目,一般会将配置中心、注册中心等地址存入bootstrap.yml中,同时将其他的配置存入配置中心。也就是说bootstrap.yml的读取会比较靠前。下面研究其机......
  • 【Spring AOP】【一】Spring AOP源码解析文章导读
    1 前言IOC的一些东西我们说过了,这篇我们开始看看AOP,面向切面编程,他也是Spring的一个核心功能,他的作用就是给我们的Bean创建代理对象,进行功能增强,比如我们的事务、日志等......
  • 设计模式(十)----结构型模式之适配器模式
    1、概述如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插......
  • 抽象工厂模式
     packagecom.mhm.abstractfactory;importcom.mhm.simplefactory.Car;publicinterfaceBenzCarextendsCar{}packagecom.mhm.abstractfactory;publicclassBenzBussi......
  • 设计模式之观察者模式
    spring的观察者模式demo1.观察者模式与发布与订阅模式对比:观察者模式比较概念的解释是,目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口。具体观察......
  • SpringBoot文件上传
    文件上传引入依赖<!--文件上传--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifact......
  • 【Spring AOP】【二】Spring AOP源码解析-XML方式加载解析过程
    1 前言这篇我们看一下,我们的AOP代码是怎么被Spring加载的进去的,那么分两种一种是XML配置的,一种就是我们常用的注解,我们从源码先看下XML方式的都是怎么被加载解析的。2......
  • Spring-IOC、AOP、事务的说明
    今天来聊一聊我对spring框架的认识,本篇章中不详细讲解具体的使用方法和实现一、spring是什么?spring是一个java语言下的bean管理的基础框架。二、spring的常用功能有那......
  • SpringBoot升级到3.0
    SpringBoot3.0出来有一段时间了,一直没时间来整理,这次来看一下吧。SpringBoot可以轻松创建独立的、生产级的基于Spring的应用程序,您可以“直接运行”。1.SpringBoo......