# java_standard **Repository Path**: yinglonglll/java_standard ## Basic Information - **Project Name**: java_standard - **Description**: 个人java开发标准 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-07-26 - **Last Updated**: 2024-05-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java_standard > 项目文件的命名与结构目录已经尽可能优化,基本可以根据类找类轻而易举找到对应的相关类; > 但防止个人健忘,简单抛砖提醒一些功能的实现涉及哪些部分,写的并不全面 ## 1. common > 利用原生功能实现额外的功能 ### 1.1 注入值对象PPO > 简介:等价于`system`模块的`entity`实体类,自定义对象数据在`param-staticcPPO.yml`中再装配到`Bean`中取值,由于`@PropertySource`源码默认只对`.properties`文件解析,故需再次配置`Bean`以支持对`.yml`文件的解析 > > 1. 应用类: > - `common->modules->entity->ppo` > 2. 涉及类: > - `YamlPropertySourceFactory` > - `param-staticPPO.yml` ### 1.2 动静态值Properties > 简介:常规静态获取`.Properties`文件的值,作为`param-staticPPO.yml`获取值的补充手段;动态获取值是根据不同系统环境获取不同值如项目路径值,保证记录实际动态值到`param-dynamicKV.properties`以便查看 > > 1. 应用类: > - `ComPropertiesController` > - `DynamicPPO` > 2. 涉及类: > - `WUtilDynamicProperties` > - `WUtilStaticProperties` > - `param-dynamicKV.properties` > - `param-staticKV.properties` ### 1.3 限流注解@AOP > 简介:通过`redis`限流解决高并发访问同接口方法之一,限制同一用户或ip地址高频访问接口 > > 1. 应用类: > - `ComLimiterController` > 2. 涉及类: > - `Limit` > - `LimitAspect` > - `LimiterConfig` > - 开启redis-server服务 ### 1.4 方法日志打印@Log > 简介: > > 1. 应用类: > - `ComLogController` > 2. 涉及类: > - `Log` > - `LogAspect`(关联了@ApiOperation注解) ### 1.5 AOP异常捕获@ApiOperation > 简介:通过`AOP`的形式对所有含`@ApiOperation`注解的方法进行`try-catch`代理执行且异常捕获 > > 1. 应用类: > - 因关联`@ApiOperation`,故任意添加`@ApiOperation`注解的方法都被代理 > 2. 涉及类 > - `LogAspect`(关联了@ApiOperation注解) ### 1.5 注解异常捕获exception-error > 简介:`@RestControllerAdvice`与`@ExceptionHandler`的搭配使用 > > 1. 应用类: > - `ComExceptionController` > - `ComHttpErrorController` > 2. 涉及类: > - `common->modules->exception` ### 1.6 日志规范配置Log4j2 > 1. 应用类: > - `ComLog4J2Controller` > 2. 涉及类: > - `log4j2.xml` ### 1.7 正则校验VO属性@Regex > 简介:规范的`Controller`层对外提供的接口时有`VO`对象,`@Regex`则是对`VO`装配属性进行正则格式校验,保证数据的有效及规范性。 > > 1. 应用类: > - `ComGlobalVarController` > - `BaseVO` > 2. 涉及类: > - `GlobalVarServiceImpl` > - `GlobalVarService` > - `IUtilHttp` ### 1.8 注解调用方法ioc > 简介:从bean对象获取方法使用,可搭配注解如`@PreAuthorize`使用,而不是从类中取方法使用 > > 1. 应用类: > - `ComIocController` > 2. 涉及类: > - `IocServiceImpl` > - `IocService` ### 1.9 复数Bean注入对象animal > 简介:当一个接口有复数实现类,又想注入同一个对象时使用 > > 1. 应用类: > - `ComAnimalController` > 2. 涉及类: > - `AnimalService` > - `CatImpl` > - `DogImpl` ### 2.0 内部类集成写法inner > 简介:当一个设计类和实体类需要多个类组成时,或多类明显方法级别不一样时,由于不具备复用性或分级方法,故将其整合一起 > > 1. 应用类: > - `MemberClass` > - `InnerIUtilCookie` ### 2.1 接口定义default;function > 简介:因接口的定义是最基础且容易设计的部分,故对接口的定义需详细了解,保证接口具备最大的兼容性 > > 1. 应用类:`ComThreadPoolController` ### 2.2 统一资源设计UO > 简介:项目全局使用的优化设计结构 > > 1. 应用类: > - `ResponseResultUO` > - 若想返回json字符串无转义符号,则直接返回jsonObject就行,不用转jsonString再返回 > - `TableRowsLockUO` ### 2.3 Controller层作用域Scope > 简介:根据不同的业务场景,选择不同的类的设计模式,特殊场景可减少访问压力等 > > 1. 应用类: > - `ComScopeController` > 2. 涉及类: > - `BeanInstanceImpl` ### 2.4 双重常量类constants > 简介:单常量类仅有解耦常量赋值作用,但双重常量类使用时不仅可以解耦常量赋值,还可以避免字符重复赋值 > > 1. 应用类 > - `ConstantControllerPrefix` > - `ConstantPermissionPrefix` ### 2.5 枚举有限类enums > 简介:明确范围数量的常量值可通过枚举类统一管理,但枚举类本身是变量而不是常量 > > 1. 应用类: > - `EnumPermissionPrefix` ### 2.6 工具分I/W类单例管理 > 简介:IUtilXxx的同级方法统一用单例模式管理,WUtilXxx为整体功能而拆分不同级方法而统一管理 > > 1. 应用类: > - `IUtilEncrypt`:工具加密类有很多种方式,都是同级方法 > - `WUtilRedis`:工具redis类只有redis的相关方法,都为redis而服务的方法 ### 2.7 全局常量Bean注入 > 简介:统一管理注入Bean名 > > 1. 应用类: > - `ConstantGlobalBean` ### 2.8 redis实现分库实例存储 > 简介:分库实例存储方式间接实现了模拟Map中key过期的概念,一个分库可看作为一个Map来进行存储 > > 1. 应用类: > - `RedisConfigMultiple` > - `ConstantRedisDb` ### 2.9 spring/redis整合fastjson2 > 简介:设置Spring,Redis默认序列化方式为`fastjson2`,提高Spring接口注解中序列化/反序列化的速度,提供诸如Redis序列化/反序列化的速度;使用原生API来手动序列化数据操作再存储的如`rabbitmq` > > 1. 应用类: > - `WebMvcConfigurerConfig` > - `RedisConfigMultiple` > - `WUtilRabbitMq` ## 2. system ### 2.1 权限Controller > 简介:基于 访问Url-->Controller层Url 和 SpringSecurity 的配置,使得特定Url前缀具有权限访问的功能 > > 1. 应用类: > - `UrlFilter` > - `FilterConfig` > - `SecurityConfig` > - `UserPermission` > 2. 涉及类: ### 2.2 双实现Service > 简介:Impl类是具体业务的实现,但有时复杂的处理逻辑会把原先清晰的业务逻辑复杂化,故将业务逻辑和处理逻辑解耦,InnerImpl为业务实现类,Impl为调用业务实现类的处理逻辑类,常搭配@Resource注入Impl > > 1. 应用类: > - `QuartzServiceImpl` > - `InnerQuartzServiceImpl` ### 2.1 填充字段Entity > 简介:基于MybatisPlus实现共用字段统一填充的逻辑 > > 1. 应用类: > - `FillMetaObjectHandler` > - `DataSourceConfig` > 2. 涉及类: ### 2.2 CRUD日志存储 > 简介:基于MybatisPlus实现的 CRUD日志存储 到数据库中 > > 1. 应用类: > - `SqlUpdateInterceptor(查询sql不保存到数据库中)` > - `DataSourceConfig` > 2. 涉及类: ### 2.3 DTOVO转换实现 > 简介:基于mapstruct实现 entity<-->dto,dto<-->vo 转换 > > 1. 应用类: > - `system-->modules-->service-->mapstrct` > - 如`QuartzMapperVO`不符合`mapstruct`自动转换的格式时,需手动实现装转换逻辑及调用 > 2. 涉及类: ### 2.4 定时器配置Quartz > 简介:项目中Quartz逻辑是使用官方API自行设计实现的定时器功能,非官方规范步骤(嫌表多) > > 1. 应用类: > - `QuartzConfig` > - `QuartzController` > 2. 涉及类: ### 2.5 动态线程池 > 1. 应用类: > - `ComTreadPoolController` > 2. 涉及类: > - `ThreadPoolConfig` > - `CustomizeThreadPoolConfig` > - `DefaultThreadPoolConfig` ### 2.6 代码自动生成 > 简介:基于MybatisPlus 按库表自动生成相应的三层结构 > > 1. 测试类: > - `TestAutoGenerate` ### 2.7 前端4种POST方式 > 简介:ajax,原生XmlHttpRequest,axios > > 1. 应用类: > - `testDownload.html` ### 2.8 Boot整合jwt > 1. 需要时在SecurityConfig开启相关代码,不需要时换回默认session机制注释jwt相关代码即可 > > - `SecurityConfig` > > 1/4,2/4,3/4,4/4 ### 2.8 Boot整合nacos > 1. 先开启nacos 服务端应用服务 > > 2. 再整合nacos(如下是两种配置文件新建方式,任选其一,yml内容都一致) > > ```yml > # public->Group(DEFAULT_GROUP)->DataId(java_standard.application-dev.yml) > # ==========生产环境nacos参数配置========== > DB_HOST: localhost > DB_PORT: 3306 > DB_NAME: java_standard > DB_USER: root > DB_PWD: 54lulutiya > > MGDB_HOST: localhost > MGDB_PORT: 27017 > MGDB_NAME: java_standard > > REDIS_DB: 0 > REDIS_HOST: 127.0.0.1 > REDIS_PORT: 6379 > REDIS_PWD: > > MQ_HOST: 127.0.0.1 > MQ_VIRTUAL_HOST: HakuHost > MQ_PORT: 5672 > MQ_USERNAME: guest > MQ_PASSWORD: guest > > MAIL_USER: 948706806@qq.com > MAIL_PWD: zdpaoxrsngwabche > # ==========生产环境nacos具体配置文件========== > enable: > mq: false > redis: true > mongodb: false > security: false > knife4j: > # 开启增强配置 > enable: true > # 开启生产环境屏蔽,默认是false,避免经常修改enable值 > production: true > # 开启Swagger的Basic认证功能,默认是false > basic: > enable: true > # Basic认证用户名 > username: admin > # Basic认证密码 > password: admin > # Mybatis-plus参数说明:https://blog.csdn.net/Huang_ZX_259/article/details/122562231 > mybatis-plus: > # entity包路径 > typeAliasesPackage: com.zzj.modules.entity > # MyBatis 原生配置 > configuration: > # 开启表下划线命名-->Java属性驼峰命名 > mapUnderscoreToCamelCase: true > # 开启sql日志 > # log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl > # 控制台 打印sql > log-impl: org.apache.ibatis.logging.stdout.StdOutImpl > # 日志名称的前缀 > log-prefix: > # MyBatis-Plus 全局配置 > global-config: > db-config: > # 逻辑删及设置默认值(deleted字段是数据库自定义字段) > logic-delete-field: delete_flag > logic-not-delete-value: 0 > logic-delete-value: 1 > spring: > datasource: > type: com.alibaba.druid.pool.DruidDataSource > # druid参数说明:https://blog.csdn.net/zhuhaoyu6666/article/details/104217498 > # druid参数使用:https://blog.csdn.net/sinat_30262477/article/details/78720190 > # druid简单配置:https://www.cnblogs.com/telwanggs/p/7484854.html > druid: > #启动连接池 > enable: true > driver-class-name: com.mysql.cj.jdbc.Driver > url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:java_standard}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false > username: ${DB_USER:root} > password: ${DB_PWD:54lulutiya} > # 初始连接数 > initial-size: 50 > # 最小连接数 > min-idle: 10 > # 最大连接数 > max-active: 200 > # 获取连接超时时间,设置max-wait后默认启用公平锁 > max-wait: 60000 > # 使用非公平锁 > use-unfair-lock: true > # 超时时间(以秒数为单位) > remove-abandoned-timeout: 180 > # 连接有效性检测时间 > time-between-eviction-runs-millis: 60000 > # 连接在池中最小生存的时间:连接保持空闲而不被驱逐的最小时间 > min-evictable-idle-time-millis: 45000 > # 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作 > keepAlive: true > # 连接在池中最大生存的时间:连接保持空闲而不被驱逐的最大时间 > max-evictable-idle-time-millis: 90000 > # 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除 > test-while-idle: true > # 申请连接时执行validationQuery检测连接是否有效,如果检验失败,则从池中去除连接并尝试取出另一个 > test-on-borrow: false > # 归还连接时执行validationQuery检测连接是否有效, > test-on-return: false > # 检测连接是否有效(druid监控页面间隔刷新信息时会执行 validation-query,oracle为 select 1 from dual) > validation-query: SELECT 'X' > # PSCache对支持游标的数据库性能提升巨大,如oracle,但在mysql下建议关闭 > # 1.一个连接池中有多个数据库连接,每一个连接执行一个PreparedStatement且单独拥有的PSCache。故连接池中占空间最大的就是PSCache(占用95%以上的空间大小),JVM中连接池的内存开销可以大致计算: > # JVM内存占用大小=(连接池1中的连接数*PSCache大小*平均每个PS的内存占用)+(连接池2中的连接数*PSCache大小*平均每个PS的内存占用)+(连接池3中的连接数*PSCache大小*每个PS的内存占用) > # 2.是否打开PSCache(是否缓存Prepared Statement),并且指定每个连接上PSCache的大小 > pool-prepared-statements: true > # 最大打开的prepared-statement数量,建议对应 max-active > max-open-prepared-statements: 200 > # 设置PSCache的大小,越大会导致JVM内存开销越大 > max-pool-prepared-statement-per-connection-size: 50 > # 允许访问底层连接 > access-to-underlying-connection-allowed: true > # 活跃连接堆跟踪 > active-connection-stack-trace: > # 活跃连接列表 > active-connections: > # 统计web请求(web-stat-filter的Yml配置无法生效,故DataSourceConfig手动实现装配值逻辑) > use-local-session-state: true > web-stat-filter: > enabled: true > url-pattern: /* > exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' > # 开启session统计功能 > session-stat-enable: true > # session的最大个数,默认100 > session-stat-max-count: 1000 > # cookie名称 > principal-cookie-name: > # session名称 > principal-session-name: > # 监控URL 调用的SQL列表 > profile-enable: true > # 开启druid后台监控功能 > stat-view-servlet: > enabled: true > url-pattern: '/druid/*' > reset-enable: false > login-username: admin > login-password: admin > allow: > deny: > # 开启spring监控(需导入 spring-aop 依赖) > aop-patterns: 'com.zzj.modules.mapper.*,com.zzj.modules.service.*' > # 先开启过滤器功能 > filters: stat,wall,slf4j > # 后配置过滤器功能(不配置则生效默认配置) > filter: > # stat过滤器:统计监控信息 > stat: > # 开启自定义配置(开启后stat的配置才会生效,wall等同理) > enabled: true > # 开启连接堆跟踪 > connection-stack-trace-enable: true > # 开启合并相同查询语句(参数不同时用?代替) > merge-sql: true > # 开启慢SQL(日志输出级别为ERROR) > log-slow-sql: true > # log-slow-sql为true时生效,多久(ms)才定义为慢SQL > slow-sql-millis: 50 > db-type: mysql > wall: > # 1.开启防火墙(提供SQL的检查和过滤等功能,默认对混合SQL(批量SQL)进行拦截) > enabled: true > # 2.对被认为是攻击的SQL进行LOG.Error输出 > log-violation: true > # 3.对被认为是攻击的SQL抛出SQLException > throw-exception: false > # 4.默认防火墙对象中执行混合SQL与防火墙功能是冲突的,若兼具两者功能则需自定义防火墙对象,参考:https://blog.51cto.com/u_3172968/5420499 > config: > multi-statement-allow: true > # JDBC设置 > # 是否允许是否允许调用Connection.getMetadata方法,这个方法调用会暴露数据库的表信息 > metadata-allow: true > # 日志输出类型只有4种,源码中分别是 druid.sql.Statement,druid.sql.ResultSet,druid.sql.Connection,druid.sql.DataSource,但每种输出类型种含多种日志输出方式 > slf4j: > # 开启 抽象门面日志 配置,不开启 具体日志框架 配置,故日志输出时搭配lombok的@Slf4j输出即可 > enabled: true > statement-create-after-log-enabled: false > statement-close-after-log-enabled: false > result-set-open-after-log-enabled: false > result-set-close-after-log-enabled: false > connection-connect-before-log-enabled: false > connection-connect-after-log-enabled: false > data: > mongodb: > # 多IP集群部署:mongodb://user:pwd@ip1:port1,ip2:port2/database > uri: mongodb:${MGDB_USER_PWD}//${MGDB_HOST_PORT}/${MGDB_NAME} > redis: > # Lettuce是基于Netty框架的事件驱动的Redis客户端,其方法调用是异步的,线程安全的,所以多个线程可以操作单个Lettuce连接来完成各种操作,同时Lettuce也支持连接池,Redis默认使用。 > # Jedis是同步的,非线程安全的,需要每个线程一个Jedis实例,所以一般通过连接池来使用Jedis > lettuce: > pool: > # 连接池最大阻塞等待时间(使用负值表示没有限制) > max-wait: 1000 > # 连接池中的最大空闲连接 > max-idle: 300 > min-idle: 3 > # 连接池最大连接数(使用负值表示没有限制) > max-active: 1000 > #数据库索引 > database: ${REDIS_DB:0} > host: ${REDIS_HOST:127.0.0.1} > port: ${REDIS_PORT:6379} > password: ${REDIS_PWD:} > #连接超时时间 > timeout: 5000 > rabbitmq: > host: ${MQ_HOST:127.0.0.1} > port: ${MQ_PORT:5672} > username: ${MQ_USERNAME:guest} > password: ${MQ_PASSWORD:guest} > #需在RabbitMq页面中手动新建自定义名为 HakuHost 虚拟主机,若不想新建则改为 "/" 其中"/"是 RabbitMq 的默认路径 > virtual-host: ${MQ_VIRTUAL_HOST:HakuHost} > #确认消息已发送到交换机(Exchange) > publisher-confirm-type: CORRELATED > #确认消息已发送到队列(Queue) > publisher-returns: true > #在消费端中设置 prefetch=n ,表示一次从队列中获取 n 条消息。其余消息存放在队列中,以实现削峰填谷的功能,建议搭配线程池异步执行 > #不设置prefetch会导致消费端不设限获取队列消息,可能导致OOM或者导致服务器内存不足影响其它进程的正常运行 > listener: > direct: > prefetch: 1 > acknowledge-mode: auto > simple: > prefetch: 1 > acknowledge-mode: auto > thymeleaf: > prefix: classpath:/templates/ > encoding: UTF-8 > #Spring Aop默认使用的JDK动态代理;其中true表示基于类的代理(CGLIB)将使用,false表示默认基于接口的代理(JDK) > #JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类, 并覆盖其中方法实现增强, > #但因为采用的是继承,所以不能对final修饰的类进行代理,此处设为true是尽可能保证类被aop代理,继而避免无法代理产生的冲突,此处属于优化选项 > aop: > auto: true > #MailSenderAutoConfiguration自动配置类中host加载先于nacos,故host必须具体配置在项目application.yml中 > mail: > host: ${MAIL_HOST:smtp.189.cn} > username: ${MAIL_USER:13544089087@189.cn} > #HOST对应主机的授权码,如QQ邮箱的授权码 > password: ${MAIL_PWD:fW$5yF(2U(2eB)4w} > #设置项目是否支持热部署 > devtools: > restart: > #1.正常情况下关闭,保证param-dynamicKV.yml正常修改不会重启项目 > #2.若需开启热部署,来检测class文件变动:此处设为true,还需将Idea中File->Settings->Build,Exclusion,Deployment->Compiler->build project automatically->取消勾选并重启Idea, > # 随后不重启项目刷新页面即可观察改动代码逻辑 > enabled: false > ``` > > ```yaml > # 新创建命名空间dev,再配置列表中点击 命名空间 dev ,再从里面新增配置 > # dev->配置管理(命名空间)(35238aab-2f19-410c-9a7a-1e9daf5a0a5c)->Group(DEFAULT_GROUP) > # ->DataId(java_standard.dev.application.yml) > # ==========生产环境nacos参数配置========== > DB_HOST: localhost > DB_PORT: 3306 > DB_NAME: java_standard > DB_USER: root > DB_PWD: 54lulutiya > > MGDB_HOST: localhost > MGDB_PORT: 27017 > MGDB_NAME: java_standard > > REDIS_DB: 0 > REDIS_HOST: 127.0.0.1 > REDIS_PORT: 6379 > REDIS_PWD: > > MQ_HOST: 127.0.0.1 > MQ_VIRTUAL_HOST: HakuHost > MQ_PORT: 5672 > MQ_USERNAME: guest > MQ_PASSWORD: guest > > MAIL_USER: 948706806@qq.com > MAIL_PWD: zdpaoxrsngwabche > # ==========生产环境nacos具体配置文件========== > enable: > mq: false > redis: true > mongodb: false > security: false > knife4j: > # 开启增强配置 > enable: true > # 开启生产环境屏蔽,默认是false,避免经常修改enable值 > production: true > # 开启Swagger的Basic认证功能,默认是false > basic: > enable: true > # Basic认证用户名 > username: admin > # Basic认证密码 > password: admin > # Mybatis-plus参数说明:https://blog.csdn.net/Huang_ZX_259/article/details/122562231 > mybatis-plus: > # entity包路径 > typeAliasesPackage: com.zzj.modules.entity > # MyBatis 原生配置 > configuration: > # 开启表下划线命名-->Java属性驼峰命名 > mapUnderscoreToCamelCase: true > # 开启sql日志 > # log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl > # 控制台 打印sql > log-impl: org.apache.ibatis.logging.stdout.StdOutImpl > # 日志名称的前缀 > log-prefix: > # MyBatis-Plus 全局配置 > global-config: > db-config: > # 逻辑删及设置默认值(deleted字段是数据库自定义字段) > logic-delete-field: delete_flag > logic-not-delete-value: 0 > logic-delete-value: 1 > spring: > datasource: > type: com.alibaba.druid.pool.DruidDataSource > # druid参数说明:https://blog.csdn.net/zhuhaoyu6666/article/details/104217498 > # druid参数使用:https://blog.csdn.net/sinat_30262477/article/details/78720190 > # druid简单配置:https://www.cnblogs.com/telwanggs/p/7484854.html > druid: > #启动连接池 > enable: true > driver-class-name: com.mysql.cj.jdbc.Driver > url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:java_standard}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false > username: ${DB_USER:root} > password: ${DB_PWD:54lulutiya} > # 初始连接数 > initial-size: 50 > # 最小连接数 > min-idle: 10 > # 最大连接数 > max-active: 200 > # 获取连接超时时间,设置max-wait后默认启用公平锁 > max-wait: 60000 > # 使用非公平锁 > use-unfair-lock: true > # 超时时间(以秒数为单位) > remove-abandoned-timeout: 180 > # 连接有效性检测时间 > time-between-eviction-runs-millis: 60000 > # 连接在池中最小生存的时间:连接保持空闲而不被驱逐的最小时间 > min-evictable-idle-time-millis: 45000 > # 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作 > keepAlive: true > # 连接在池中最大生存的时间:连接保持空闲而不被驱逐的最大时间 > max-evictable-idle-time-millis: 90000 > # 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除 > test-while-idle: true > # 申请连接时执行validationQuery检测连接是否有效,如果检验失败,则从池中去除连接并尝试取出另一个 > test-on-borrow: false > # 归还连接时执行validationQuery检测连接是否有效, > test-on-return: false > # 检测连接是否有效(druid监控页面间隔刷新信息时会执行 validation-query,oracle为 select 1 from dual) > validation-query: SELECT 'X' > # PSCache对支持游标的数据库性能提升巨大,如oracle,但在mysql下建议关闭 > # 1.一个连接池中有多个数据库连接,每一个连接执行一个PreparedStatement且单独拥有的PSCache。故连接池中占空间最大的就是PSCache(占用95%以上的空间大小),JVM中连接池的内存开销可以大致计算: > # JVM内存占用大小=(连接池1中的连接数*PSCache大小*平均每个PS的内存占用)+(连接池2中的连接数*PSCache大小*平均每个PS的内存占用)+(连接池3中的连接数*PSCache大小*每个PS的内存占用) > # 2.是否打开PSCache(是否缓存Prepared Statement),并且指定每个连接上PSCache的大小 > pool-prepared-statements: true > # 最大打开的prepared-statement数量,建议对应 max-active > max-open-prepared-statements: 200 > # 设置PSCache的大小,越大会导致JVM内存开销越大 > max-pool-prepared-statement-per-connection-size: 50 > # 允许访问底层连接 > access-to-underlying-connection-allowed: true > # 活跃连接堆跟踪 > active-connection-stack-trace: > # 活跃连接列表 > active-connections: > # 统计web请求(web-stat-filter的Yml配置无法生效,故DataSourceConfig手动实现装配值逻辑) > use-local-session-state: true > web-stat-filter: > enabled: true > url-pattern: /* > exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' > # 开启session统计功能 > session-stat-enable: true > # session的最大个数,默认100 > session-stat-max-count: 1000 > # cookie名称 > principal-cookie-name: > # session名称 > principal-session-name: > # 监控URL 调用的SQL列表 > profile-enable: true > # 开启druid后台监控功能 > stat-view-servlet: > enabled: true > url-pattern: '/druid/*' > reset-enable: false > login-username: admin > login-password: admin > allow: > deny: > # 开启spring监控(需导入 spring-aop 依赖) > aop-patterns: 'com.zzj.modules.mapper.*,com.zzj.modules.service.*' > # 先开启过滤器功能 > filters: stat,wall,slf4j > # 后配置过滤器功能(不配置则生效默认配置) > filter: > # stat过滤器:统计监控信息 > stat: > # 开启自定义配置(开启后stat的配置才会生效,wall等同理) > enabled: true > # 开启连接堆跟踪 > connection-stack-trace-enable: true > # 开启合并相同查询语句(参数不同时用?代替) > merge-sql: true > # 开启慢SQL(日志输出级别为ERROR) > log-slow-sql: true > # log-slow-sql为true时生效,多久(ms)才定义为慢SQL > slow-sql-millis: 50 > db-type: mysql > wall: > # 1.开启防火墙(提供SQL的检查和过滤等功能,默认对混合SQL(批量SQL)进行拦截) > enabled: true > # 2.对被认为是攻击的SQL进行LOG.Error输出 > log-violation: true > # 3.对被认为是攻击的SQL抛出SQLException > throw-exception: false > # 4.默认防火墙对象中执行混合SQL与防火墙功能是冲突的,若兼具两者功能则需自定义防火墙对象,参考:https://blog.51cto.com/u_3172968/5420499 > config: > multi-statement-allow: true > # JDBC设置 > # 是否允许是否允许调用Connection.getMetadata方法,这个方法调用会暴露数据库的表信息 > metadata-allow: true > # 日志输出类型只有4种,源码中分别是 druid.sql.Statement,druid.sql.ResultSet,druid.sql.Connection,druid.sql.DataSource,但每种输出类型种含多种日志输出方式 > slf4j: > # 开启 抽象门面日志 配置,不开启 具体日志框架 配置,故日志输出时搭配lombok的@Slf4j输出即可 > enabled: true > statement-create-after-log-enabled: false > statement-close-after-log-enabled: false > result-set-open-after-log-enabled: false > result-set-close-after-log-enabled: false > connection-connect-before-log-enabled: false > connection-connect-after-log-enabled: false > data: > mongodb: > # 多IP集群部署:mongodb://user:pwd@ip1:port1,ip2:port2/database > uri: mongodb:${MGDB_USER_PWD}//${MGDB_HOST_PORT}/${MGDB_NAME} > redis: > # Lettuce是基于Netty框架的事件驱动的Redis客户端,其方法调用是异步的,线程安全的,所以多个线程可以操作单个Lettuce连接来完成各种操作,同时Lettuce也支持连接池,Redis默认使用。 > # Jedis是同步的,非线程安全的,需要每个线程一个Jedis实例,所以一般通过连接池来使用Jedis > lettuce: > pool: > # 连接池最大阻塞等待时间(使用负值表示没有限制) > max-wait: 1000 > # 连接池中的最大空闲连接 > max-idle: 300 > min-idle: 3 > # 连接池最大连接数(使用负值表示没有限制) > max-active: 1000 > #数据库索引 > database: ${REDIS_DB:0} > host: ${REDIS_HOST:127.0.0.1} > port: ${REDIS_PORT:6379} > password: ${REDIS_PWD:} > #连接超时时间 > timeout: 5000 > rabbitmq: > host: ${MQ_HOST:127.0.0.1} > port: ${MQ_PORT:5672} > username: ${MQ_USERNAME:guest} > password: ${MQ_PASSWORD:guest} > #需在RabbitMq页面中手动新建自定义名为 HakuHost 虚拟主机,若不想新建则改为 "/" 其中"/"是 RabbitMq 的默认路径 > virtual-host: ${MQ_VIRTUAL_HOST:HakuHost} > #确认消息已发送到交换机(Exchange) > publisher-confirm-type: CORRELATED > #确认消息已发送到队列(Queue) > publisher-returns: true > #在消费端中设置 prefetch=n ,表示一次从队列中获取 n 条消息。其余消息存放在队列中,以实现削峰填谷的功能,建议搭配线程池异步执行 > #不设置prefetch会导致消费端不设限获取队列消息,可能导致OOM或者导致服务器内存不足影响其它进程的正常运行 > listener: > direct: > prefetch: 1 > acknowledge-mode: auto > simple: > prefetch: 1 > acknowledge-mode: auto > thymeleaf: > prefix: classpath:/templates/ > encoding: UTF-8 > #Spring Aop默认使用的JDK动态代理;其中true表示基于类的代理(CGLIB)将使用,false表示默认基于接口的代理(JDK) > #JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类, 并覆盖其中方法实现增强, > #但因为采用的是继承,所以不能对final修饰的类进行代理,此处设为true是尽可能保证类被aop代理,继而避免无法代理产生的冲突,此处属于优化选项 > aop: > auto: true > #MailSenderAutoConfiguration自动配置类中host加载先于nacos,故host必须具体配置在项目application.yml中 > mail: > host: ${MAIL_HOST:smtp.189.cn} > username: ${MAIL_USER:13544089087@189.cn} > #HOST对应主机的授权码,如QQ邮箱的授权码 > password: ${MAIL_PWD:fW$5yF(2U(2eB)4w} > #设置项目是否支持热部署 > devtools: > restart: > #1.正常情况下关闭,保证param-dynamicKV.yml正常修改不会重启项目 > #2.若需开启热部署,来检测class文件变动:此处设为true,还需将Idea中File->Settings->Build,Exclusion,Deployment->Compiler->build project automatically->取消勾选并重启Idea, > # 随后不重启项目刷新页面即可观察改动代码逻辑 > enabled: false > ``` > > 3. 启动类注解 ## 3. tool ### 3.1 excel表实现 > 按功能分类,不按类型分类 ## 4.概念科普 ### 4.1 常用Base基类 > 1. Base类:唯一建议使用抽象类来实现的类,减少类的建立 ### 4.2 DSO,PPO,RSO,VO,DTO常用概念 > 1. 对象概念类: > - DSO设计对象:健全的设计类,可调用 > - PPO属性对象:配置文件自动注入值,与数据库自动注入实体类DO中类型 > - RSO资源对象:与PPO,DO平级的实体类,但无提前值注入,拿来即用 > 2. 实体概念类: > - DTO传输对象:减少传输实体类无用属性值 > - VO视觉对象:检验实体类属性格式 ### 1.10 枚举类的3种形式 > 1. 枚举类: ### 1.14 实现类的2种形式 > 1. Impl 类: ### 1.15 接口的3种形式 > 1. I 类: ### 1.16 工具类的形式 > 1. IUtil类:integrate整合工具类 > 2. WUtil类:wrapper包装工具类