96SEO 2026-02-19 10:56 35
。

我自己非常注重搭建项目结构的起步过程#xff0c;应用命名规范、模块的划分、包的命名我觉得非常重要如果做的足够好别人导入项目后可能只需要10分钟就可以大概了解系统结构。
具体规范包括包命名、类的命名、接口命名、方法命名、变量命名、常量命名。
本文是研发规范第九讲通用类命名规范。
研发规范第九讲通用类命名规范重点1、管理类命名1.1、BootStrapStarter1.2、Processor1.3、Manager1.4、Holder1.5、Factory1.6、Provider1.7、Registrar1.8、Engine1.9、Service1.10、Task
3、回调类3.1、HandlerCallbackTriggerListener3.2、Aware
4、监控类4.1、Metric4.2、Estimator4.3、Accumulator4.4、Tracker
5、内存管理类5.1、Allocator5.2、Chunk5.3、Arena5.4、Pool
6、过滤检测类6.1、PipelineChain6.2、Filter6.3、Interceptor6.4、Evaluator6.5、Detector
7、结构类7.1、Cache7.2、Buffer7.3、Composite7.4、Wrapper7.5、Option,
Attribute7.6、Tuple7.7、Aggreatore7.8、Iterator7.9、Batch7.10、Limiter
9、解析类命名9.1、ConverterResolver9.2、Parser9.3、Customizer9.4、Formatter
10、网络类10.1、Packet10.2、Protocol10.3、Encoder、Decoder、Codec10.4、RequestResponse
11、其它11.1、UtilHelper11.2、ModeType11.3、InvokerInvocation11.4、Initializer11.5、FeturePromise11.6、Selector11.7、Reporter11.8、Constants11.9、Accessor11.10、Generator
写代码少不了对统一资源的管理清晰的启动过程可以有效地组织代码。
为了让程序运行起来少不了各种资源的注册、调度少不了公共集合资源的管理。
一般作为程序启动器使用或者作为启动器的基类。
通俗来说可以认为是main函数的入口。
applicationContext;PostConstructpublic
applicationContext.getBeansWithAnnotation(Extension.class);extensionBeans.values().forEach(extension
extensionRegister.doRegistration((ExtensionPointI)
setApplicationContext(ApplicationContext
messageCallbackSet;Autowiredprivate
mqAsyncRetryConsumer;Overridepublic
某一类功能的处理器用来表示某个处理过程是一系列代码片段的集合。
BinaryComparisonProcessorDemo车队订单处理器
convoyOrderQueryHService;public
getOrderInfoVOByUpdateTimeRange(Date
(ObjectUtils.anyNull(startTime,
表示持有某个或者某类对象的引用并可以对其进行统一管理。
多见于不好回收的内存统一处理或者一些全局集合容器的缓存。
SimpleCacheHolder.instance;}private
getInstance(ItemOperateSceneEnum
operateSceneEnum){ItemOptHandler
beanFactory.get(operateSceneEnum.getBeanName());if
(Objects.isNull(itemOptFactory))
!FixSkuImageMethod.STABLE_ITEM_ID.getCode().equals(fixMethod)||
!FixSkuImageMethod.FLEXIBLE_ITEM_ID.getCode().equals(fixMethod))
{Response.fail(请选择数据订正方式1、磐石调用业务id
(FixSkuImageMethod.FLEXIBLE_ITEM_ID.getCode().equals(fixMethod)
CollectionUtils.isEmpty(bizIds))
{Response.fail(缺少业务id请输入业务id);}return
Method。
它更高级一些把策略模式和方法工厂揉在了一块让人用起来很顺手。
Provider
ImJsonUtils.objToJson(platformItemSearchDto);MQResponse
mqTemplate.sendOrderMsg(MqConfigContant.CATEGORY_SCAN_TOPIC,
MqConfigContant.OPT_ITEM_CATEGORY_SCAN_TAG,
getCodeKey(platformItemSearchDto));if
ServiceException(【标准化类目扫描】平台商品待扫描下发MQ失败);}log.info(【发送消息结束,
MqConfigContant.CATEGORY_SCAN_TOPIC,
MqConfigContant.OPT_ITEM_CATEGORY_SCAN_TAG);}
PipelineOptionRegistrarDemo分布式事务注册器
DistributedTransactionRegistrar
DistributedTransactionPolicyProperties
distributedTransactionPolicyProperties(){return
DistributedTransactionPolicyProperties();}Beanpublic
distributedTransactionDao(){return
DistributedTransactionDao();}Beanpublic
distributedTransactionAspect(){return
DistributedTransactionAspect();}
一般是核心模块用来处理一类功能。
引擎是个非常高级的名词一般的类是没资格用它的。
C2DEngineDemo1审核流引擎主要用于节点的获取抽象类。
initEngine(CollectionProcessorRegisterE,
processorRegisters,CollectionPluginRegisterE,
PersistenceServiceDemo引入货代财务订单服务
AgentFinanceOrderInspectionService
为了完成一些统计类或者全局类的功能有些参数需要一传到底。
传播类的对象就可以通过统一封装的方式进行传递并在合适的地方进行拷贝或者更新。
如果你的程序执行有一些变量需要从函数执行的入口开始一直传到大量子函数执行完毕之后。
这些变量或者集合如果以参数的形式传递将会让代码变得冗长无比。
这个时候你就可以把变量统一塞到Context里面以单个对象的形式进行传递。
在Java中由于ThreadLocal的存在Context甚至可以不用在参数之间进行传递
传播繁殖。
用来将context中传递的值进行复制添加清除重置检索恢复等动作。
通常它会提供一个叫做propagate的方法实现真正的变量管理。
使用多核可以增加程序运行的效率不可避免的引入异步化。
我们需要有一定的手段获取异步任务执行的结果对任务执行过程中的关键点进行检查。
回调类API可以通过监听、通知等形式获取这些事件。
3.1、HandlerCallbackTriggerListener
触发器代表某类事件的处理属于Handler通常不会出现在类的命名中
Listener的应用更加局限通常在观察者模式中用来表示特定的含义。
AbstractConsumerChildrenCallBack
batchJobWriteFacade;Autowiredprivate
Maps.newHashMap();map.put(getConsumerId(),
ImConsumerEnhanceUtil.enhanceAll(getConsumerId(),
this));consumerManager.listenMessage(map);}Overridepublic
记录涨价免审日志*/Async(asyncApplicationEventThreadPool)EventListenerpublic
onGoodsUpdate(GoodsSkuUpdateEvent
Aware就是感知的意思一般以该单词结尾的类都实现了Aware接口。
拿Spring来说Aware
的目的是为了让bean获取Spring容器的服务。
具体回调方法由子类实现比如ApplicationContextAware。
它有点回调的意思。
ApplicationEventPublisherAwareDemo对mq进行trace增强
applicationContext;Overridepublic
applicationContext.getBeansWithAnnotation(mqConsumer.class);MapString,
Maps.newHashMap();consumerMap.forEach((beanName,
callback.getClass().getAnnotation(mqConsumer.class);if
{callbackMap.put(consumer.id(),
启动消费者监听配置]);consumerManager.listenMessage(callbackMap);log.info([MQ
setApplicationContext(ApplicationContext
现在的程序都比较复杂运行状态监控已经成为居家必备之良品。
监控数据的收集往往需要侵入到程序的边边角角如何有效的与正常业务进行区分是非常有必要的。
TopFrequencyAccumulator4.4、Tracker
如果你的应用用到了自定义的内存管理那么下面这些名词是绕不开的。
比如Netty、lucene就实现了自己的内存管理机制。
与存储相关通常表示内存分配器或者管理器。
如果你的程序需要申请有规律的大块内存allocator是你得不二选择。
RecyclingIntBlockAllocator5.2、Chunk
表示一块内存。
如果你想要对一类存储资源进行抽象并统一管理可以采用它。
英文是舞台、竞技场的意思。
由于Linux把它用在内存管理上发扬光大它普遍用于各种存储资源的申请、释放与管理。
为不同规格的存储chunk提供舞台好像也是非常形象的表示。
Runtime.getRuntime().availableProcessors();private
threadNum.getAndDecrement()),new
EventBusThreadPool.RewriteCallerRunsPolicy());}Overridepublic
TraceIdUtil.getCurrentTraceId();try
{TraceIdUtil.initTraceId(traceId);try
{TraceIdUtil.clearTraceId();}});}
{log.error([EventBusThreadPool-execute-error],
e);super.execute(command);}}Overridepublic
TraceIdUtil.getCurrentTraceId();try
{TraceIdUtil.initTraceId(traceId);try
{TraceIdUtil.clearTraceId();}});}
{log.error([EventBusThreadPool-submit-error],
线程池已经无法处理,重写饱和策略,跟CallerRunsPolicy一样,超出后需要调用者自己的线程处理,多了记录日志*/private
程序收到的事件和信息是非常多的有些是合法的有些需要过滤扔掉。
根据不同的使用范围和功能性差别过滤操作也有多种形式。
你会在框架类代码中发现大量这样的名词。
MVCTomcat等都有大量应用。
通过将某个处理过程加入到职责链的某个位置中就可以接收前面处理过程的结果强制添加或者改变某些功能。
就像Linux的管道操作一样最终构造出想要的结果。
职责链设计模式可以参考这篇文章JAVA设计模式第四讲行为型设计模式
DefaultResourceTransformerChain
clear(){ruleExecutors.clear();}/***
ruleExecutors){ruleExecutors.addAll(ruleExecutors);}/***
ruleExecutor){ruleExecutors.add(ruleExecutor);}
configureRuleExecutors(GeneralRuleExecutorRegistry
*/ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.BUSINESS_EXCEUTOR,new
*///平台级基本校验规则ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.BASE_EXCEUTOR,new
stockReadService,itemReadService,
categoryAttributeSyncAgent,instanceConfigAgent));//平台禁售规则校验ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.FORBID_SALE_EXCEUTOR,new
ForbidSaleExceutor());//敏感词规则校验ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.SENSITIVE_WORD_EXCEUTOR,new
SensitiveWordExceutor(sensitiveWordSyncAgent));/**
skuCoderuleExecutorRegistry.register(GeneralRuleExecutorRegistry.UNIQUE_CODE_EXCEUTOR,new
UniqueCodeExceutor(shopSyncAgent,
skuReadService));//给input对象附上keyAttrs,
backCategory的信息ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.OTHER_ATTRIBUTE_FILTER_BY_CATEGORY_EXECUTOR,new
O***rAttributeFilterByCategoryExecutor(categoryAttributeSyncAgent,backCategorySyncAgent));//
商品关键属性校验器(同店铺下,同关键属性的商品只能发布一个)ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.UNIQUE_KEY_ATTRS_EXCEUTOR,new
UniqueKeyAttrsExceutor(categoryAttributeSyncAgent,
configComponent,itemAttributeReadService,
keyAttrAllowChangeWhiteListConfiguration,spuSyncAgent,brandReadService));//标准类目下的item的input直接注入对应SPU的管控的属性值ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.ITEM_OTHER_ATTRIBUTE_INPUT_RULE_BY_ALI_SPU_EXECUTOR,new
ItemO***rAttributeInputRuleByAliSpuExecutor(categoryAttributeSyncAgent,
spuSyncAgent,shopSyncAgent));//标准类目下的item的output向output的规则里注入spu规则ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.ITEM_OTHER_ATTRIBUTE_OUTPUT_RULE_BY_ALI_SPU_EXECUTOR,
ItemO***rAttributeOutputRuleByAliSpuExecutor(backCategorySyncAgent,
*/ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.ITEM_SKU_ATTRIBUTE_RULE_BY_CATEGORY_EXECUTOR,
ItemSkuAttributeRuleByCategoryExecutor(categoryAttributeSyncAgent,
backCategorySyncAgent));//spuruleExecutorRegistry.register(GeneralRuleExecutorRegistry.SPU_OTHER_ATTRIBUTE_RULE_BY_CATEGORY_EXECUTOR,
SpuO***rAttributeRuleByCategoryExecutor(categoryAttributeSyncAgent,
属性值域不合规,就会导致对应的skus为空*/ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.SKU_RULE_BY_CATEGORY_EXECUTOR,new
SkuRuleByCategoryExecutor(categoryAttributeSyncAgent));//
在同店铺下是否存在)ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.OUT_OF_CONTROL_ATTRIBUTE_EXECUTOR,new
OutOfControlAttributeExecutor(brandReadService,
itemAttributeReadService));ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.ITEM_OTHER_ATTRIBUTE_RULE_BY_AG_CATEGORYEXECUTOR,new
ItemO***rAttributeRuleByAgCategoryExecutor(agCategoryAttributeReadService,instanceConfigAgent,
zcyCategoryInstanceConfigService));//
格式标题ruleExecutorRegistry.register(GeneralRuleExecutorRegistry.ITEM_FORMAT_TITLE_EXECUTOR,new
ItemFormatTitleExecutor(itemReadService,
过滤器用来筛选某些满足条件的数据集或者在满足某些条件的时候执行一部分逻辑。
如果和职责链连接起来则通常能够实现多级的过滤。
1、需要在resources目录下的META-INF/dubbo/添加com.alibaba.dubbo.rpc.Filter文件
2、然后配置dubboMonitorcn.gov.zcy.service.filter.DubboCheckMonitorFilter
{OverrideSuppressWarnings(all)public
ApolloConfigUtil.getBooleanProperty(item.dubbo.monitor.enable,
!RpcContext.getContext().isConsumerSide())
{log.error(DubboCheckMonitor发生异常,
数据预处理等添加校验器时需兼容考虑单发和批量发布的场景单发和批量在大部分场景下的规则一致.扩展性
PublishItemNumPreValidatorFilter
publishItemNumPreValidatorFilter;private
(CollectionUtils.isEmpty(preValidatorFilters))
preValidatorFilter.execute(publishFilterContext);if
Response.fail(filterResult.getCode(),
filterResult.getMessage());}}return
addFilter(PublishPreValidatorFilter
filter){preValidatorFilters.add(filter);}//
{addFilter(publishItemNumPreValidatorFilter);}
拦截器其实和Filter差不多。
不过在Tomcat中Interceptor可以拿到controller对象但filter不行。
拦截器是被包裹在过滤器中。
HttpRequestInterceptorDemo1Mybatis
afterCompletion(HttpServletRequest
会返回bool类型。
比如你传递进去一个非常复杂的对象或者字符串进行正确与否的判断。
探测器。
用来管理一系列探测性事件并在发生的时候能够进行捕获和响应。
比如Android的手势检测温度检测等。
除了基本的数据结构如数组、链表、队列、栈等其他更高一层的常见抽象类能够大量减少大家的交流并能封装常见的变化。
这个没啥好说的就是缓存。
大块的缓存。
常见的缓存算法有LRU(Redis)、LFU(caffeine
redisClientManager.get(redisBizType);if
{log.error(RedisCommonCache.getOrderLastSyncTime
SimpleCacheHolder.instance;}private
将相似的组件进行组合并以相同的接口或者功能进行暴露使用者不知道这到底是一个组合体还是其他个体。
用来表示配置信息。
说实话它和Properties的区别并不大但由于Option通常是一个类所以功能可以扩展的更强大一些。
它通常比Config的级别更小关注的也是单个属性的值。
Param一般是作为参数存在对象生成的速度要快一些。
元组的概念。
由于Java中缺乏元组结构我们通常会自定义这样的类。
聚合器可以做一些聚合计算。
比如分库分表中的summaxmin等聚合函数的汇集。
迭代器。
可以实现Java的迭代器接口也可以有自己的迭代方式。
在数据集很大的时候需要进行深度遍历迭代器可以说是必备的。
使用迭代器还可以在迭代过程中安全的删除某些元素。
StringCharacterIterator可以参考这篇文章JAVA设计模式第四讲行为型设计模式
限流器使用漏桶算法或者令牌桶Ratelimiter来完成平滑的限流。
TimeBasedLimiterDemo1Ratelimiter
限流-时段*/com.google.common.util.concurrent.RateLimiter
限流-默认*/com.google.common.util.concurrent.RateLimiter
buildKey(this.name);this.init();}private
ConfigService.getAppConfig();config.addChangeListener(e
TimeRateLimiter.this.refresh(),
异步执行规则校验asyncExecutor(apolloRuleKey,
将抽象部分与它的实现部分分离使它们都可以独立地变化。
策略模式。
相同接口不同实现类同一方法结果不同实现策略不同。
比如一个配置文件是放在xml里还是放在json文件里都可以使用不同的provider去命名。
AbstractDashboardStrategyBusinessOverviewVO
将一个类的接口转换为客户希望的另一个接口Adapter模式使得原本由于接口不兼容而不能一起工作的那些类一起工作。
不过相对于传统的适配器进行api转接如果你的某个Handler里面方法特别的多可以使用Adapter实现一些默认的方法进行适配。
那么其他类使用的时候只需要继承Adapter然后重写他想要重写的方法就可以了。
这也是Adapter的常见用法。
CardGridCursorAdapterDemoEventBus
t.getClass().getName());}SubscribeAllowConcurrentEventspublic
{failedHook().accept(event);}}/***
return*/SuppressWarnings(all)public
(ClassT)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];return
将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化对请求排队或记录请求日志以及支持可撤销的操作。
用来表示一系列动作指令用来实现命令模式封装一系列动作或者功能。
Action一般用在UI操作上后端框架可以无差别的使用。
在DDD的概念中CQRS的Command的C既为Command。
补偿逻辑,用于测试、后门接口补偿任务等,按需实现,没有强制逻辑**
表示一系列事件。
一般的在语义上ActionCommand等来自于主动触发
代理或者委托模式。
委托模式是将一件属于委托者做的事情交给另外一个被委托者来处理。
customerDoorsHService.add(customerDoorsHParam);...}
将一个复杂对象的构建与它的表示分离使得同样的构建过程可以创建不同的表示。
构建者模式的标准命名。
比如StringBuilder。
当然StringBuffer是个另类。
这也说明了规则是人定的人也可以破坏。
RequestBuilderDemoES使用构造者模式来生成参数
this;}queryBuilder.must(builder);return
this;}queryBuilder.should(builder);return
模板方法类的命名。
定义一个操作中的算法的骨架而将一些步骤延迟到子类中。
模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Stopwatch.createStarted();BizContextT
{//任务正在执行中log.warn(当前任务正在执行,本次执行忽略:
获取batchIdinitBatchId(context);//
{setStatus(ExecutorStatusEnum.ERROR);log.warn(获取巡检数据失败,
handleMistake(context);setStatus(ExecutorStatusEnum.END);log.info(巡检任务执行耗时:{}ms,
stopwatch.elapsed(TimeUnit.MILLISECONDS),
cloudServiceItemWriteApi;public
{//岛端创建基础商品需要将仓库编码置为nullif(Env.isIsland()){createCmd.clearWarehouseCode();createCmd.clearTransExpenses();Object
ItemPlatformGeneric.invokeParams(CloudServiceItemWriteApi.class,
JSONObject.parseObject(JSON.toJSONString(result),
TypeReferenceResponseItemIdDTO()
cloudServiceItemWriteApi.create(createCmd);}
写代码要涉及到大量的字符串解析、日期解析、对象转换等。
根据语义和使用场合的区别它们也分为多种。
转换和解析。
一般用于不同对象之间的格式转换把一类对象转换成另一类。
注意它们语义上的区别一般特别复杂的转换或者有加载过程的需求可以使用Resolver。
MustacheViewResolverDemo解析用户信息Resolver
GatewayContext.getAdminServiceParam();Long
(Objects.nonNull(serviceParam))
serviceParam.getUserId();}return
用来表示对某个对象进行特别的配置。
由于这些配置过程特别的复杂值得单独提取出来进行自定义设置。
DeviceFieldCustomizer9.4、Formatter
HttpProtocol10.3、Encoder、Decoder、Codec
一般用于网络请求的进和出。
如果你用在非网络请求的方法上会显得很怪异。
都表示工具类Util一般是无状态的Helper以便需要创建实例才能使用。
但是一般没有使用Tool作为后缀的。
makeKeyOfCachedCategoryList(Long
拆解key(依赖makeKeyOfCachedCategoryList)*/public
parseKeyOfCachedCategoryList(String
Long.parseLong(split[2]);rtn[1]
Long.parseLong(split[4]);return
看到mode这个后缀就能猜到这个类大概率是枚举。
它通常把常见的可能性都列到枚举类里面其他地方就可以引用这个Mode。
invoker是一类接口通常会以反射或者触发的方式执行一些具体的业务逻辑。
通过抽象出invoke方法可以在invoke执行之前对入参进行记录或者处理在invoke执行之后对结果和异常进行处理是AOP中常见的操作方式。
(CollectionUtils.isEmpty(contexts))
{return;}contexts.stream().collect(Collectors.groupingBy(context
context.getStatusChangeDTO().getApplyType())).forEach((type,
APPLY_MAP.get(AuditBizCode.from(type));apply.batchInvoke(applyContexts);});return;}
如果你的应用程序需要经过大量的初始化操作才能启动那就需要把它独立出来专门处理初始化动作。
ApplicationContextInitializerDemo数据源初始化
{dataSource.getConnection();log.info(started
Feture相当于一个占位符代表一个操作将来的结果。
一般通过get可以直接阻塞得到结果或者让它异步执行
但如果回调中嵌入了回调呢如果层次很深就是回调地狱。
Java中的
Promise用来解决回调地狱问题。
Promise是为了让代码变得优美而存在的。
根据一系列条件获得相应的同类资源。
它比较像Factory但只处理单项资源。
(SpiProviderSelector.class){if(instance
SpiProviderSelector();}}}return
封装了一系列get和set方法的类。
像lombok就有Accessors注解生成这些方法。
但Accessor类一般是要通过计算来完成get和set而不是直接操作变量。
这适合比较复杂的对象存取服务。
StompHeaderAccessor11.10、Generator
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback