java后端
文章平均质量分 60
菜鸟的传奇人生
这个作者很懒,什么都没留下…
展开
-
Groovy规则引擎与Java集成
groovy规则引擎与Java集成原创 2022-07-19 17:28:31 · 2050 阅读 · 0 评论 -
关于InheritableThreadLocal和TransmittableThreadLocal
最近经常遇到在调试和处理预发报警时的串租户问题,最终都归因到InheritableThreadLocal和TransmittableThreadLocal的使用上,做一次总结在Thread类中有一个私有变量inheritableThreadLocals,在线程创建时会去执行init方法,init方法里有一个将父线程中变量传递到子线程的过程,然而,InheritableThreadLocal只有在线程创建初始化的时候才会有父子线程传递的过程,但是在线程池中,业务线程(父线程)只是将任务对象(实现了Runnab原创 2022-07-07 18:11:23 · 398 阅读 · 0 评论 -
线程上下文的那些事儿
一、背景在实际代码开发中,有些时候,单个线程执行任务非常多的时候,后一个步输入是前一个步骤的输出,若是一直带着一个参数传递,就会显得很冗余,于是就有了线程上下文的设计,每个线程会有不同的参数实例。二、实现ThreadLocal作为一个线程私有化的类,内部有一个私有变量ThreadLocalMap,其已每个线程Thread.currentThread()作为key,这样就可以保证线程的独立性。因此我们可以利用ThreadLocal进行线程上下文的构建。新建一个上下文的类:import java.io原创 2022-04-19 15:19:41 · 240 阅读 · 0 评论 -
spring通过applicationContext获取bean
一、背景在我们实际开发中,通常通过@Autowired和@Resource来进行bean的获取,其中Autowired默认ByType,Resource默认ByName获取,但是我们如果需要动态的获取bean时,就需要直接借助ApplicationContext的getBean方法进行获取二、实现在实现中,自定义一个类实现ApplicationContextAware接口@Servicepublic class ContextUtil implements ApplicationContextAw原创 2022-04-19 15:03:38 · 5668 阅读 · 1 评论 -
spring ApplicationEventPublisher实现发布-订阅模式
一、背景在实际的项目开发过程中,经常碰到一块业务需要监听另一块的业务执行的结果进行变动,这时候,设计一个较为可扩展、可用性强的发布订阅模式代码架构就显得尤为重要二、代码架构代码架构:三、基础事件定义接口:public interface BaseEvent { Integer getEventId(); String getEventName(); String getEventType();}示例事件:@Datapublic class AddEvent i原创 2022-01-19 16:56:37 · 746 阅读 · 0 评论 -
分发策略+工厂设计模式的简易实现
一、背景我们在实际的业务开发中,经常会遇到这样的场景,对于不同的type,有同样的业务操作流程,只不过其中的某些操作需要根据type的不同特殊处理,这时候如果我们直接if,else判断来实现业务的话,势必会带来代码冗余重复的问题。说的太抽象,还是直接上代码吧二、简易工厂设计模式的实现业务背景:实现一个计算系统,计算类型有加、减、乘、除,计算前先做校验,计算完后打印日志。(1)新建Springboot项目项目目录(2)枚举类:四种运算,加减乘除@Getter@AllArgsConstruct原创 2021-05-27 15:44:44 · 501 阅读 · 1 评论 -
spring整合es,logstash,mysql实践
一、ElasticSearch简介Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并是一种流行的企业级搜索引擎。...原创 2021-05-26 20:22:51 · 498 阅读 · 1 评论 -
持续学习之:Springboot整合redis
一、redis简介redis是一个非关系型数据库,它能够存储字符串和五种不同类型之间的值的映射,key值只能字符串,value可以是五种不同数据类型:字符串、列表、集合、哈希、有序集合。redis相对于其他数据库,是基于内存的操作,因此其存取速度极快,被广泛应用于缓存方向。除了缓存之外,redis还常被用于分布式架构中锁的实现,用于保证多机多线程中共享资源的线程安全问题。这篇文章主要对redis在缓存中的具体应用做详细介绍,做一个springboot整合redis的简单实践。二、redis下载安装实验原创 2021-05-07 13:02:00 · 358 阅读 · 2 评论 -
rocketMq的高可用和高可靠机制
一、什么是高可用和高可靠高可用:描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性高可靠:运行时间能够满足预计时间的一个系统或组件二、rocketMq的高可用性rocketMq的分布式集群是通过主从的配合来达到高可用性的,在broker的配置文件中:brokerId为0表示这个broker是master,大于0表示这个broker是slave,同时brokerRole参数也会说明这个broker是master还是slave,master角色的broker支持读和写,而s原创 2021-05-04 12:32:39 · 840 阅读 · 0 评论 -
rocketMq集群模式和广播模式的区别
最近在学习rocketMq的时候,给两个不同的consumer设置了同一个groupName,这两个consumer所订阅的topic和tag也完全相同,但是producer放进mq中的消息却没有被两个consumer都消费到@Servicepublic class Consumer { @Value("${rocketmq.producer.group}") private String groupName; @Value("${rocketmq.name-server}")原创 2021-04-29 17:59:16 · 6037 阅读 · 0 评论 -
springboot整合rocketMq
一、消息队列前面一篇博文提到消息队列的三大作用:(1)解耦(2)异步(3)削峰限流当下主流的消息队列主要有Kafka、ActiveMQ、RabbitMQ、RocketMQrocketMq以其高吞吐量,支持分布式,可支撑大量的topic而成为一些公司的首选(实习的公司用的rocketMq),下面就做一个Springboot整合rocketMq的实践吧二、下载安装、启动rocketMq下载地址:下载地址安装:unzip rocketmq-all-4.8.0-bin-release.zip原创 2021-04-26 22:30:05 · 1612 阅读 · 2 评论 -
反射在Java中的应用
在我们平时的项目开发中,虽然很少用到反射机制,但实际上很多设计、开发都与反射机制有关,例如利用反射实现工厂设计模式,利用反射实现动态代理,利用反射获取注解信息等等,下面就基于这三种应用进行相关的描述一、利用反射实现工厂设计模式interface IMessage { public void send();}class NetMessage implements IMessage { @Override public void send() { System.原创 2020-12-13 16:01:08 · 351 阅读 · 0 评论 -
谈谈红黑树
一、什么是红黑树红黑树是一种平衡而叉树,是为了达到logn的查询性能而采取的一种数据结构试想若是用数组 [1,2,3,4,5,6,7,8]来构建一棵二叉树(一般以数组的第一个元素为根节点),那么构建的二叉树如下所示:那这样一棵二叉树就和普通的链表结构没什么分别,查询性能为n红黑树就是在这样的背景下提出的一种用于平衡二叉树的一种手段。二、红黑树的特点(1)节点要么是红色,要么是黑色(2)根节点必须是黑色(3)每个叶子节点必须是黑色(4)如果一个节点是红色的,则它的子节点必须是黑色的(5)原创 2020-12-12 21:41:30 · 207 阅读 · 0 评论 -
反射与工厂设计模式
一、什么是反射Java是先编译再运行的语言,而反射可以让我们在程序运行时动态加载类并获取类的详细信息,本质是JVM得到java.lang.Class对象之后,再对class对象进行反编译,从而获取对象的各种信息二、获取Class对象的三种方式(1)Object里的getClass方法获取(2)每个数据类型(包括基本的数据类型)都有一个静态的class属性(3)通过class类的静态方法forName三、根据class对象反射实例化对象利用class.getDeclaredConstruc原创 2020-12-12 16:36:15 · 478 阅读 · 2 评论 -
springboot实现token登录
一、Controller层login接口进行账密验证,验证成功返回tokencontroller:@PostMapping("/login") public Result<TokenStatus> login(@RequestBody LoginVO loginVO, HttpServletRequest request) { Result<TokenStatus> result = new Result<>(); UserDO原创 2020-12-03 12:20:35 · 7809 阅读 · 1 评论 -
浅谈消息队列
一、什么是消息队列当程序系统发现某些任务耗费时间且优先级较低,迟点完成也不影响整个任务,就把这个任务丢给消息队列二、消息队列的作用(1)解耦举个例子,系统A能够生产一个消息,而系统B、C、D都要用到这个消息,倘若不用消息队列,直接在系统A中定义系统B、C、D对这个消息的使用,那么势必会带来系统A和系统B、C、D代码的耦合问题,如果哪天系统B或者C或者D突然又不用这个消息了,又要在系统A中进行修改。而引入消息队列,系统A只负责产生消息丢个消息队列,其他系统对这个消息的使用则不需要关心,这样则实现了系统原创 2020-10-28 14:37:43 · 224 阅读 · 0 评论 -
来谈一谈Java中的正则表达式
正则表达式是一种强大而灵活的文本处理工具,使用正则表达式,我们能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。一旦找到了匹配这些模式的部分,你就能够随心所欲的对它们进行处理(来自Java编程思想第四版的描述)。各种语言对正则表达式的支持都有着异曲同工之妙,但提供的API却不尽相同。一、String类中的利用正则表达式的三个方法(1)matches方法public boolean matches(String regex)该方法只有一个参数,即正则字符串,返回boolean类型,tr原创 2020-10-09 16:20:30 · 215 阅读 · 0 评论 -
Java中使用+号连接字符串和使用StringBuilder的append方法连接字符串的联系和区别
一、使用+连接字符串的底层原理我们先来看看这样一段代码public class Main { public static void main(String[] args) { String mango = "mango"; String s = "abc" + mango + "def" + 47; System.out.println(s); }}我们用jdk自带的工具javap来反编译以上代码:javap -c Main这里原创 2020-10-09 11:24:42 · 629 阅读 · 0 评论 -
学习下XML的约束模块DTD
一、什么是DTDDTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。DTD的实例:<!DOCTYPE NEWSPAPER [<!ELEMENT NEWSPAPER (ARTICLE+)><!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)><!ELEMENT HEADLINE (#PCDATA)><!ELEMENT B原创 2020-10-07 17:44:04 · 265 阅读 · 1 评论 -
来谈谈xml
一、什么是XMLXML是指可扩展性标记语言(eXtensible Markup Language)标记型:用标签来定义的语言,例如HTML,XML等可扩展:标签可以由自己来定义,也可以用中文标签,如:<person></person> <猫></猫>xml有两个版本:1.0和1.1,但我们一般用的都是1.0,因为1.1不能向下兼容二、XML的用途用于不同系统之间传输数据用于表示生活中有关系的数据经常用在配置文件中比如可以原创 2020-10-07 11:57:14 · 191 阅读 · 0 评论 -
Java异常
一、异常概念在程序中,错误可能产生于程序员没有预料到的各种情况,或者超出程序员可控范围的环境,例如用户的坏数据、试图打开一个不存在的文件等。为了能够及时有效地处理程序中的运行错误,Java 专门引入了异常类。二、异常继承图运行异常:也就是非检查异常,编译器不进行检查,只有运行时出现错误才抛出异常非运行时异常:检查异常,就是在程序编译阶段jvm就会检查程序是否对该异常进行了处理,如果未处理,则编译不能通过。编译时异常通常定义的是发生几率较高并具有预见性的异常,程序员进行事先处理。...原创 2020-10-06 10:56:17 · 129 阅读 · 0 评论 -
JavaWeb之监听器
一、JavaWeb中的监听器事件源:(三大域)ServletContext(1)生死监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用(2)属性监听:ServletContextAttributeListener,它有三个方法,一个在添加属性时调用,一个在改变属性时调用,一个在移除属性时调用HttpSession(1)生死监听: HttpSessionListener,它有两个方法,一个在出生时调用,一个在死亡时调用(2)属性监听:原创 2020-10-05 16:50:28 · 386 阅读 · 0 评论 -
过滤器的三种常见的应用场景
一、执行目标资源之前做预处理操作,例如设置编码,这种Filter一般都会放行,只是再目标资源之前做一些准备工作当我们想要设置响应报文的编码方式时,就可以实现一个Filter来对所有的请求进行设置,如下public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {原创 2020-10-05 10:35:14 · 1373 阅读 · 0 评论 -
过滤器概念和实现
一、什么是过滤器它会在一组资源(jsp,servlet,css,html)前面出现,它可以让请求得到目标资源,也可以让请求得不到目标资源。也就是说过滤器有拦截请求的能力。二、javax.servlet包中的Filter接口我们来看看这个接口中的方法:三个方法,也就是过滤器的三个生命周期函数,init方法在服务器启动时执行,doFilter在拦截请求时执行,destroy方法在服务器关闭时执行FilterConfig:FilterConfig与ServletConfig类似,用于获取过滤器的名原创 2020-10-05 10:16:04 · 1200 阅读 · 0 评论 -
Servlet,GenericServlet和HttpServlet关系详解
一、关系图二、源码解析Servlet,GenericServlet,HttpServlet是实现servlet的三个方法,其中Servlet是一个接口,它有五个方法,各种方法的作用在另一篇博客Servlet介绍与使用中已有介绍其中ServletConfig接口用于获取servlet的配置信息,包括servlet的名字,servlet的初始化参数名和参数值等等,而该接口的实现由servlet容器tomcat自行实现,我们无需关心,下图是ServletConfig的接口源码:我们再较之于Gener原创 2020-09-30 15:53:37 · 1307 阅读 · 0 评论 -
Servlet介绍与实现
一、什么是servlet?servlet是JavaWeb三大组件之一,servlet的作用是处理请求,服务器会把接收到的请求交给servlet处理,在servlet中通常需要:接收请求数据处理请求完成响应每个请求都对应着每一个不同的servlet,通常我们会去继承HttpServlet来实现Servlet二、接口Servlet中的五大方法其中init(),service(),destroy()三个方法是生命周期方法,这三个方法一般由servlet容器tomcat调用,init方法会在se原创 2020-09-30 11:31:22 · 636 阅读 · 0 评论 -
springboot根据模板导出word
我们经常在进行前后端设计的时候需要对前端下载请求进行相应,对响应报文进行封装成word供下载,下面基于springboot对这一过程进行介绍一、准备word模板,用于设置导出时的样式二、pom.xml文件中引入依赖 <dependency> <groupId>cn.afterturn</groupId> <art...原创 2020-03-21 11:31:38 · 4923 阅读 · 13 评论