图平台技术点

一、编码规范

1、基于Optional的空值优雅处理:是时候优雅的和NullPointException说再见了

 

二、数据库访问

1、JPA   

     官方文档:JPA Query Methods

       jpa sql日志

# hibernate 源码中 打印sql的类:org.hibernate.engine.jdbc.spi.SqlStatementLogger
# hibernate 源码中 打印sql绑定参数的类:org.hibernate.type.descriptor.sql.BasicBinder
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=debug logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace

2、QueryDSL

      1)APT机制:聊聊如何运用JAVA注解处理器(APT)

      2)QueryDSL:QueryDSL——比SpringData JPA更面向对象

                              SpringBoot环境下QueryDSL-JPA的入门及进阶

 

三、springboot

1、核心机制

      SpringBoot核心机制解读系列三、ApplicationListener

2、定时调度

     1)基于@Scheduled:SpringBoot实现固定、动态定时任务   https://juejin.cn/post/7013234573823705102

     2)基于@Scheduled:设置线程池   https://www.cnblogs.com/coderacademy/p/18058208

     3)基于quartz:  https://cloud.tencent.com/developer/article/1640190

3、CommandLineRunner  与 ApplicationRunner

      SpringBoot2.x基础篇:使用CommandLineRunner或ApplicationRunner

4、事务提交或回滚后执行后续动作    https://developer.aliyun.com/article/1047724

      spring中事务执行完成后/回滚后执行

5、从上下文获取 HttpServletRequest

    public static HttpServletRequest getCurrentRequest() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (requestAttributes == null) {
            return null;
        }
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
        return servletRequestAttributes.getRequest();
    }

 6、Intercepter使用ant路径语法(/**/test/**)需要实例化:AntPathMatcher,否则excludePathPatterns只能匹配绝对路径(路径不需要上下文)

@Configuration
public class ServerConfiguration implements WebMvcConfigurer {

    @Bean
    public AuthInterceptor authInterceptor() {
        return new AuthInterceptor();
    }

    @Bean
    public AntPathMatcher patternMatcher() {
        return new AntPathMatcher();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(authInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns(
                        "/health",
                        "/**/test/**"
                );
    }

}

 7、bean生命周期

     可注入的接口方法见:  BeanFactory 注释文档

     常用接口方法:

           ApplicationContextAware  -> setApplicationContext()

           InitializingBean   -> afterPropertiesSet()

8、动态加载与注册bean(详见deepseek回答)

       如何在外部触发调用时(非启动时)动态加载类及注册为bean?

      示例:

      DynamicBeanService.java

public class DynamicBeanRegistrar implements BeanDefinitionRegistryPostProcessor {
    private ConfigurableListableBeanFactory beanFactory;

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
        this.beanFactory = (ConfigurableListableBeanFactory) registry;
    }

    public void registerBean(String beanName, Class<?> beanClass) {
        BeanDefinitionBuilder builder = BeanDefinitionBuilder
            .rootBeanDefinition(beanClass);
        ((DefaultListableBeanFactory) beanFactory)
            .registerBeanDefinition(beanName, builder.getBeanDefinition());
    }

    public void registerBeanFromClassPath(String beanName, String className) 
        throws ClassNotFoundException {
        Class<?> clazz = Class.forName(className);
        registerBean(beanName, clazz);
    }
}
View Code

     DynamicBeanController.java

RestController
@RequestMapping("/api/beans")
public class DynamicBeanController {
    @Autowired
    private DynamicBeanService beanService;

    @PostMapping("/register")
    public String registerBean(@RequestParam String className, 
                             @RequestParam String beanName) {
        try {
            beanService.registerBean(className, beanName);
            return "Bean注册成功: " + beanName;
        } catch (Exception e) {
            return "注册失败: " + e.getMessage();
        }
    }
}
View Code

       

     对于动态注册的bean,aop会生效吗?

     https://www.cnblogs.com/MattCheng/p/18898812

9、链路追踪

     在spring cloud项目中,可以引入依赖 spring-cloud-starter-sleuth 实现链路追踪,参见:分布式服务调用链路跟踪——Spring Cloud Sleuth + Zipkin

     若不引入依赖 spring-cloud-sleuth-zipkin,不会有系统间交互(如上报链路到zipkin),此时可作为生成为维护traceid的工具类,使用方法详见deepseek回答:在引入spring-cloud-starter-sleuth项目中,如何获取到traceId?

    

四、springcloud gateway

1、过滤器

 

五、Guava

1、图

  Google Guava中的Graph图形计算入门

       简单图算法类:com.google.common.graph.Graphs

2、缓存

     Java开发利器Guava Cache之使用篇

3、线程池

     增加线程超时和回调功能:Guava——扩展原生JDK线程

4、工具类

     

 

六、Redis

 1、redis 命令  

       redis command

2、redis集群状态查询:

redis-cli -h 29.x.x.x -p 7007 -a pwd -c 集群模式命令行
redis-cli -h 29.x.x.x -p 7045 -a xxx cluster info 打印集群的信息
redis-cli -h 29.x.x.x -p 7045 -a xxx cluster nodes 列出集群当前已知的所有节点(node),以及这些节点的相关信息
redis-cli --cluster check 29.x.x.x:6379 -a xxx 槽点检测

3、jedis

      redis实战第十三篇 jedis连接redis cluster

4、SpringBoot集成Redis   

      SpringBoot集成Redis(全网最全)

5、spring cache

      Spring Boot 3 整合 Spring Cache 与 Redis 缓存实战

 6、springboot redis 发布订阅

      Spring boot整合Redis实现发布订阅(超详细)

 

七、多数据源

一、gds

1)定义接口类

 

二、es

 

八、其他

1、文件

     1)目录分隔符: java.io.File.separator

      2)临时目录:org.apache.commons.io.FileUtils.getTempDirectoryPath()

2、shiro

      官网:  https://shiro.apache.org/reference.html

      分布式session方案1: spring boot shiro+session+redis 实现登录会话、会话保持、分布式session共享

      分布式session方案2: SHIRO-REDIS

  分布式session方案3: EnterpriseCacheSessionDAO

 3、openfeign

       官网: Spring Cloud OpenFeign

       其他: SpringCloud OpenFeign 全功能配置详解(一文吃透OpenFeign)

4、elasticsearch       RestHighLevelClient

5、cypher过滤规则与拼接

     Filters & LogicFilter & FieldFilter

     GraphCypherBuilder

6、动态修改日志级别(slf4j + logback)

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
loggerContext.getLogger(“org.hibernate.SQL”).setLevel(Level.DEBUG);

 7、用户主目录

      -Duser.home   

    • ‌作用‌:设置 Java 程序运行时的 ‌用户主目录‌ 路径。
    • ‌典型场景‌:
      访问用户专属配置文件、缓存文件或私有数据(如 ~/.app/config 目录)。
    • ‌默认值‌:
      由操作系统自动提供(例如:Windows 的 C:\Users\<用户>,Linux/macOS 的 /home/<用户>

      -Duser.dir

    • ‌作用‌:设置 Java 程序运行时的 ‌当前工作目录‌ 路径。
    • ‌典型场景‌:
      读取程序启动位置的相对路径文件(如 ./data/file.txt)。
    • ‌默认值‌:
      由启动 Java 进程时的命令行路径决定(例如:在 /project 下执行 java -jar app.jar,则值为 /project

      容易产生误解的地方:nacos本地缓存配置默认路径为用户主目录,linux下为:/home/<用户>/nacos,实际由-Duser.home决定,当配置了该参数,在用户家目录是找不到nacos缓存配置的

8、es url search

     1)url中的空格和'+'是等价的: q=a:123 AND b:456   <==>  q=a:123+AND+b:456

     2)q参数不加双引号为分词查询(查询参数会分词,逻辑关系为:or),加双引号为短语包含精确查询:q=tzid:"TZ_aa0011"

      若不加引号,  TZ_aa0011在ik分词器下会切分为(tz_aa0011,tz,aa,0011),会查询出不符合期望的结果

9、Arthas   官网

      1)基础使用: arthas诊断工具的使用(基础篇)

           classLoaderHash 可通过 sc -d 命令获取

      2)技术原理

10、权限菜单与审计日志

      1)通过 sys_resource 表 配置功能菜单,通过 url 字段管控用户接口访问权限

      2)通过拦截器记录url配置的接口作为审计日志,通过operation_item_template动态拼接操作项,也可通过node_type_enable_log字段配置非功能菜单项但需记录审计日志

11、截图服务僵尸进程原因及解决方法

      1)解决 Docker + selenium + chromedriver + chrome 会出现僵尸进程的问题

      2)docker,孤儿进程和僵尸进程

      3)Docker和孤儿进程、僵尸进程

 

posted @ 2024-06-05 12:04  Matt_Cheng  阅读(24)  评论(0)    收藏  举报