首页 文章 精选 留言 我的

精选列表

搜索[模块切片],共10000篇文章
优秀的个人博客,低调大师

通用代码模块设计

一个大的系统,在代码的复用肯定是必不可少的,它能解决: 统一的响应处理(可以对外提供统一的响应对象包装) graph LR HTTP-->|HttpRequest|RestController RestController-->|HttpResponse -> JSON|HTTP 统一的异常处理(可以将业务异常统一收集处理) graph TB subgraph 处理过程 AdCommonException -->|RestControllerAdvice| HttpRequest end subgraph HttpResponse RestControllerAdvice -->|统一返回| JSON end 通用代码定义、配置定义(通用的配置信息放在统一的代码管理中,便于维护和更新) 创建项目 mscx-ad-common POM文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>mscx-ad</artifactId> <groupId>com.sxzhongf</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <packaging>jar</packaging> <groupId>com.sxzhongf</groupId> <artifactId>mscx-ad-common</artifactId> <version>1.0-SNAPSHOT</version> <name>Common-Service</name> <description>公共逻辑 and 帮助类</description> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> <!-- --> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> </dependencies> <!--maven编译插件--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 项目结构 vo (统一响应对象package) advice (bean 增强package ) > Spring支持五种类型的增强或通知(Advice) > - Before(方法执行前) `org.apringframework.aop.MethodBeforeAdvice` > - AfterReturning(方法返回后) `org.springframework.aop.AfterReturningAdvice` > - After-throwing(异常抛出后) `org.springframework.aop.ThrowsAdviceArround`环绕,即方法前后 `org.aopaliance.intercept.MethodInterceptor` > 引介,不常用 `org.springframework.aop.IntroductionInterceptor` > 具体可参考:[细说advice,advisor](https://www.jianshu.com/p/1dd6a26c881b) annotation config exception utils export 通用响应编码 创建通用返回对象 /** * @Data是下属注解的组合注解 * * @see Getter * @see Setter * @see RequiredArgsConstructor * @see ToString * @see EqualsAndHashCode * @see lombok.Value */ @Data @NoArgsConstructor //无参构造函数 @AllArgsConstructor //全参构造函数 public class CommonResponse<T> implements Serializable { private Integer code = 0; private String message = "success"; /** * 具体的数据对象信息 */ private T data; public CommonResponse(Integer code, String message) { this.code = code; this.message = message; } public CommonResponse(T data) { this.data = data; } } 在advice包中实现对响应的统一拦截com.sxzhongf.ad.common.advice.CommonResponseDataAdvice,参考 ResponseBodyAdvice, RestControllerAdvice 可查看源码org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice @RestControllerAdvice public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> { /** * 判断是否需要对响应进行处理 * * @return false -> 不处理,true -> 处理 */ @Override public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> converterType) { // // //获取当前处理请求的controller的方法 // String methodName = methodParameter.getMethod().getName().toLowerCase(); // // 不拦截/不需要处理返回值 的方法 // String method = "login"; //如登录 // //不拦截 // return !method.equals(methodName); // 如果类上标记了@IgnoreResponseAdvice,则不拦截 if (methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreResponseAdvice.class)) { return false; } // 如果方法上标记了@IgnoreResponseAdvice,则不拦截 if (methodParameter.getMethod().isAnnotationPresent(IgnoreResponseAdvice.class)) { return false; } //对响应进行处理,执行beforeBodyWrite方法 return true; } /** * 目的 拦截CommonResponse * * @param body 原始的Controller需要返回的数据 */ @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { CommonResponse<Object> commonResponse = new CommonResponse<>(); if (null == body) { return commonResponse; } else if (body instanceof CommonResponse) { commonResponse = (CommonResponse<Object>) body; } else { commonResponse.setData(body); } return commonResponse; } } 我们在annotation包下面添加一个注解com.sxzhongf.ad.common.annotation.IgnoreResponseAdvice,用它来标柱是否需要支持上面的统一返回拦截。 /** * IgnoreResponseAdvice for 标示需要忽略拦截动作 * * @author <a href="mailto:magicianisaac@gmail.com">Isaac.Zhang</a> */ //ElementType.TYPE 表示该注解可用于class //ElementType.METHOD 表示可用于方法 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface IgnoreResponseAdvice { } 通用异常处理 异常处理也是统一的,那么同样就要使用到RestControllerAdvice,同时,需要使用的Spring 的ExceptionHandler进行异常处理 创建统一异常拦截类 /** * GlobalExceptionAdvice for 全局统一异常拦截 * * @author <a href="mailto:magicianisaac@gmail.com">Isaac.Zhang</a> * @see RestControllerAdvice * @see ExceptionHandler */ @RestControllerAdvice public class GlobalExceptionAdvice { /** * 对 {@link AdException} 进行统一处理 * {@link ExceptionHandler} 对指定的异常进行拦截 * 可优化: * 定义多种类异常,实现对应的异常处理, * 例如: * <ul> * <li> * 推广单元操作异常,抛出 AdUnitException * </li> * <li> * Binlog 解析异常,抛出 BinlogException * </li> * </ul> * 拦截Spring Exception 使用 {@link ExceptionHandler}注解 */ @ExceptionHandler(value = AdException.class) public CommonResponse<String> handlerAdException(HttpServletRequest request, AdException ex) { CommonResponse<String> response = new CommonResponse<>(-1, "business error"); response.setData(ex.getMessage()); return response; } } 创建通用异常类 /** * AdException for 统一异常处理类 * * @author <a href="mailto:magicianisaac@gmail.com">Isaac.Zhang</a> */ public class AdException extends Exception { public AdException(String message) { super(message); } } 通用配置信息 通过HTTP消息转换器HttpMessageConverter,实现对象转换,Java Object -> HTTP 数据流 新增WebConfiguration,我们通过实现org.springframework.web.servlet.config.annotation.WebMvcConfigurer来定制和修改Spring MVC的配置信息。 /** * WebConfiguration for 对Spring的配置和行为进行定制修改 * * @author <a href="mailto:magicianisaac@gmail.com">Isaac.Zhang</a> * @see WebMvcConfigurer */ @Configuration public class WebConfiguration implements WebMvcConfigurer { /** * 匹配路由请求规则 */ @Override public void configurePathMatch(PathMatchConfigurer configurer) { } /** * 注册自定义的Formatter 和 Convert */ @Override public void addFormatters(FormatterRegistry registry) { } /** * 添加静态资源处理器 */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { } /** * 添加自定义视图控制器 */ @Override public void addViewControllers(ViewControllerRegistry registry) { } /** * 添加自定义方法参数处理器 */ @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { } /** * 配置消息转换器 */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { //清空所有转换器 converters.clear(); // Java Obj -> Json Obj (http header: application/json) converters.add(new MappingJackson2HttpMessageConverter()); } }

优秀的个人博客,低调大师

《深入理解Nginx:模块开发与架构解析》一1.6 Nginx的命令行控制

1.6 Nginx的命令行控制 在Linux中,需要使用命令行来控制Nginx服务器的启动与停止、重载配置文件、回滚日志文件、平滑升级等行为。默认情况下,Nginx被安装在目录/usr/local/nginx/中,其二进制文件路径为/usr/local/nginc/sbin/nginx,配置文件路径为/usr/local/nginx/conf/nginx.conf。当然,在configure执行时是可以指定把它们安装在不同目录的。为了简单起见,本节只说明默认安装情况下的命令行的使用情况,如果读者安装的目录发生了变化,那么替换一下即可。(1)默认方式启动直接执行Nginx二进制程序。例如: /usr/local/nginx/sbin/nginx 这时,会读取默认路径下的配置文件:/usr/local/nginx/conf/nginx.c

优秀的个人博客,低调大师

[076][核心模块]构建优雅的Java异常处理框架:从错误码到全局异常处理

在现代Web应用开发中,异常处理是保证系统健壮性和可维护性的关键环节。一个设计良好的异常处理框架不仅能统一错误响应格式,还能简化业务代码,提升开发效率。本文将从实际代码出发,深入剖析一套基于Spring Boot的异常处理框架,涵盖错误码设计、异常体系、全局拦截器以及最佳实践,帮助读者构建属于自己的高质量异常处理方案。

优秀的个人博客,低调大师

[070][Web模块]Spring MVC TOTP 二次认证拦截器:设计与源码深度解析

在现代 Web 应用中,仅凭账号密码进行身份验证已难以满足安全需求。基于时间的一次性密码(TOTP, Time-Based One-Time Password)作为多因素认证(MFA)的常见形式,被广泛应用于银行、支付、后台管理等敏感场景。本文将基于一套实际项目中的 TotpAuthHandlerInterceptor 拦截器及 @TotpAuth 注解源码,深入剖析如何在 Spring MVC 框架中优雅地实现 TOTP 二次认证,并探讨其设计思路、实现细节及潜在改进方向。

优秀的个人博客,低调大师

《〈落实算法安全主体责任基本情况〉撰写实务:主体、组织与制度三模块拆解》

算法备案填报里,主体信息环节的核心材料是《落实算法安全主体责任基本情况》。它排在自评估报告之前,是审核方了解"这家企业有没有能力管好这个算法"的第一份材料。很多团队把精力全押在自评估报告上,这份材料用十分钟填完,结果在主体信息环节就被退回。这篇拆解它的撰写实务。

优秀的个人博客,低调大师

[064][缓存模块]两级缓存实战:基于 Caffeine 和 Redis 的多级缓存设计与实现

在微服务和分布式系统中,缓存是提升性能、降低数据库压力的核心手段。然而,单一缓存方案往往难以两全:本地缓存(如 Caffeine、Guava)虽然访问速度极快(纳秒级),但无法在多个服务实例间共享,且受限于堆内存;远程缓存(如 Redis)虽然支持跨节点共享、容量可扩展,但网络 I/O 和序列化开销带来了数十毫秒的延迟。两级缓存(多级缓存) 应运而生——将本地缓存作为一级(L1),远程缓存作为二级(L2),兼顾速度与共享,既降低热点数据访问延迟,又减少对后端存储的压力。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册