0. 自定义注解 标记处理器
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface DomainHandler {
String value() default "";
}
1. 工厂接口
public interface IDomainHandlerFactory {
/**
*
* @return
*/
public Map<String, IDoorHandler> getDomainHandlers();
public void setSocketHandlers(Map<String, IDoorHandler> domainHandlers);
/**
* 获取平台对应业务模型handler
* @param platform
* @return
*/
public IDoorHandler getDomainHandler(String platform);
}
2. 工厂实现
@Component
public class DomainHandlerFactory implements IDomainHandlerFactory {
private Map<String, IDoorHandler> domainHandlers = Maps.newHashMap();
@Override
public Map<String, IDoorHandler> getDomainHandlers() {
return domainHandlers;
}
@Override
public void setSocketHandlers(Map<String, IDoorHandler> domainHandlers) {
this.domainHandlers = domainHandlers;
}
@Override
public IDoorHandler getDomainHandler(String domainHandlerName) {
return domainHandlers.getOrDefault(domainHandlerName, null);
}
/**
* 注入spring上下文
*
* @param springContextUtil
*/
@Resource(name = "springContextUtil")
private void setSpringContextUtil(SpringContextUtil springContextUtil) {
this.loadHandlerFromSpringBeans(springContextUtil);
}
/**
* 初始化handler
*
* @param springContextUtil
*/
private void loadHandlerFromSpringBeans(SpringContextUtil springContextUtil) {
ApplicationContext applicationContext = springContextUtil.getApplicationContext();
String[] names = applicationContext.getBeanDefinitionNames();
Class<?> type;
for (String name : names) {
//获取到类对象
type = applicationContext.getType(name);
DomainHandler domainHandler = type.getDeclaredAnnotation(DomainHandler.class);
if (domainHandler != null && StringUtils.isNotEmpty(domainHandler.value())) {
try {
IDoorHandler handler = (IDoorHandler) applicationContext.getBean(name);
domainHandlers.put(domainHandler.value(), handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
3. SpringContextUtil 注入到spring上下文
public class SpringContextUtil implements ApplicationContextAware {
public static ApplicationContext applicationContext;
public SpringContextUtil() {
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
public <T> T getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
public static ApplicationContext getContext() {
return applicationContext;
}
public static Object getContextBean(String name) {
return applicationContext.getBean(name);
}
}
4. 门禁domain
public interface IDoorDomain {
/**
* 人员下发
*
* @param userAddDownRecord 参数
* @return 结果
*/
RestResult<String> addUserDown(UserAddDownRecord userAddDownRecord);
}
5. domain实现
@Slf4j
@Component
public class DoorDomainImpl implements IDoorDomain{
private final static String domainHandlerBegin = "DOMAIN-DOOR-";
@Autowired
private IDomainHandlerFactory domainHandlerFactory;
@Override
public RestResult<String> addUserDown(UserAddDownRecord userAddDownRecord) {
return ((IDoorHandler) domainHandlerFactory.getDomainHandler(domainHandlerBegin+"DAHUA_GATEWAY")).addUserDown(userAddDownRecord);
}
}
6. handler 接口
public interface IDoorHandler {
/**
* 新增人员
*
* @param userAddDownRecord
* @return 结果
*/
RestResult<String> addUserDown(UserAddDownRecord userAddDownRecord);
}
7. 处理handler 多品牌
@DomainHandler("DOMAIN-DOOR-DAHUA_GATEWAY")
@Component
@Slf4j
public class DoorDaHuaGatewayHandler implements IDoorHandler {
@Override
public RestResult<String> addUserDown(UserAddDownRecord userAddDownRecord) {
log.info("DAHUA_GATEWAY_userAddDownRecord:{}", JSON.toJSONString(userAddDownRecord));
return RestResult.wrapSuccessResponse(userAddDownRecord.getApiUserId());
}
}
8. 方法调用
@Autowired
private IDoorDomain iDoorDomain;
return iDoorDomain.addUserDown(record);
ps.策略模式 简单实现
if (eventType != null) {
Map<String, Function<String, String>> actionMappings = new HashMap<>();
actionMappings.put("door", (e) -> "daHuaIccCallBack/doorPush");
actionMappings.put("gate", (e) -> "daHuaIccCallBack/gatePush");
actionMappings.put("event", (e) -> "daHuaIccCallBack/eventBusinessPush");
return prefix + actionMappings.get(eventType).apply(eventType);
}