- 博客(460)
- 资源 (4)
- 收藏
- 关注
原创 ApplicationContextAware接口的作用
前言在我们开发Spring项目时,不管是使用别人的开源框架,还是使用自己公司框架,或者是自己搭建框架的时候,会见到ApplicationContextAware这个接口,可能最常见的是如下代码public class PermitAllUrlProperties implements InitializingBean, ApplicationContextAware {这是我在搭建自己的微服务框架SpringSecurityOAuth2这部分的代码时使用到的场景,那么下面就针对这个Applicati
2021-04-08 21:47:58 4845 1
原创 匿名内部类引用变量必须为final
示例代码public class Hello { public static void main(String[] args) { final String str="haha"; new Thread() { @Override public void run() { System.out.println(str); } }.start(); }}以上代码就是典型的匿名内部类引用变量必须使用final修饰!这里必须使用final修饰的原因是因为java中
2021-03-29 20:38:21 1997 3
原创 设置软件位开机自启
前言由于工作需要前几天跟我们公司实施去了客户现场调试,然后有一个需求是要求客户大屏系统开机后重启打开浏览器访问我们给他们开发好的系统!本文将使用开机自启谷歌并访问指定网址为例!编写bat脚本cd /d "C:\Program Files (x86)\Google\Chrome\Application"start chrome.exe --kiosk www.baidu.com–kiosk 指定全屏启动测试双击bat文件启动将这个bat文件添加为开机自启1.cmd打开regedit
2021-03-29 09:46:23 267
原创 JDK1.8新特性四大内置核心函数
/** * Consumer<T> :消费型接口 * void accept(T t) * Supplier<T t> :供给型接口 * T get(); * Function<T t,R r> :函数型接口 * R apply(T t); * Predicate<T t> :断言型接口 * boolean test(T t); .
2021-03-28 20:08:41 359
原创 JDK1.8新特性(Lambda表达式)
为什么使用Lambda表达式Lambda是一个匿名函数,我们可以吧Lambda表达式理解为一段可以传递代码(将代码像数据一样进行传递)。可以写出更加简单、更灵活的代码。作为一种更紧凑的代码风格,是Java的语言表达能力得到了提升。...
2021-03-28 20:07:23 268
原创 设计模式之(策略模式)
策略模式在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中 我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。介绍意图: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。主要解决: 在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。何时使用: 一个系统有许多许多类,而区分它们的只是他们直接的行为。
2021-03-28 14:52:17 232 1
原创 Spring Security OAuth2.0授权链接对应源码位置
前言看过我往期文章的道友应该知道,在20年11月份的时候写过Spring Security和Spring Security OAuth2.0搭建整合一些问题即源码流程分析!但是今天调试框架的时候既然忘了Spring Security OAuth2.0授权链接的源码位置,害,年纪大了脑子不好使了!源码位置/oauth/tokenorg.springframework.security.oauth2.provider.endpoint/oauth/token_keyorg.springframew
2021-03-26 23:27:03 611
原创 feign远程调用RequestParam.value() was empty on parameter 0
在我们写SpringMVC项目是一些细节导致出现这个问题;SpringMVC中接口为了少按几下键盘会写成这样 //Post @RequestParam 带参 @PostMapping("/t5") public R t5(@RequestParam String param) { log.info("t5===>"+"开始"); log.info("t5入参===>"+param); log.info("t5===>"+"结束"); return R.ok();
2021-03-24 01:11:27 3691
原创 JAVA线程池
为什么使用线程池降低资源消耗,提高线程利用率,降低创建和销毁线程的消耗。提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,在执行。提高线程的可管理性,线程是稀缺资源,使用线程可统一分配调优监控线程池参数corePoolSize代表核心线程数,也就是正常情况创建工作的线程数,这些线程创建后并不会消除,而是一种常驻线程maxinumPoolSize代表最大线程数,它于核心线程数相对应,代表最大允许被创建的线程数,比如当前任务较多,将核心线程数都用完了,还无法满足需求时,此时就会创
2021-03-10 22:58:09 209
原创 Netty常见面试题
概览:Netty 是什么?为什么要用 Netty?Netty 应用场景了解么?Netty 核心组件有哪些?分别有什么作用?EventloopGroup 了解么?和 EventLoop 啥关系?Bootstrap 和 ServerBootstrap 了解么?NioEventLoopGroup 默认的构造函数会起多少线程?Netty 线程模型了解么?Netty 服务端和客户端的启动过程了解么?Netty 长连接、心跳机制了解么?Netty 的零拷贝了解么?Netty 是什么?Ne
2021-03-08 00:42:55 497
原创 Spring AOP实现流程、源码分析
前言AOP字面意思解释就是面向切面编程,面向切面编程是一种编程模型,我们知道JAVA是面向对象的也就是OOP,OOP这种面向对象的编程适用于定义纵向的关系,但是并不适用定义横向的关系。那么应对这种OOP的存在的这些不利,AOP面向切面的编程模型作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。AO
2021-03-07 23:28:52 849 2
原创 BeanFactory和FactoryBean的区别、作用
前言这个问题也是属于Spring面试中经常被问东西,那么这篇文章就来梳理一下!区别、作用BeanFactory:BeanFactory也是个工厂,Spring中的Bean都是BeanFactory生产进行管理的,特殊的Bean除外,如FactoryBean实现的!BeanFactory是实现IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。BeanFactory是一个接口,提供IOC容器最基本的形式,也就是给Spring实现IOC容器提供规范的,并不
2021-02-25 18:32:16 610
原创 Spring Bean的生命周期
前言Spring框架在面试过程中是必问,Spring Bean的生命周期也是高频问题,结合了一些资料,梳理了一下Spring Bean的生命周期的流程,如下图。首先这些调用的类型可以归为4大类,当然也有归结为3大类的4大类归结Bean自身的方法:包括两个调用Init-method()、destroy-method()Bean级生命周期接口方法:实现BeanNameAware、BeanFactoryAware、InitializingBean、DisposableBean接口容器级生命周期接口
2021-02-24 23:30:37 423
原创 Spring循环依赖源码分析
前言这篇文章不讲过多的废话,循环依赖简介请看Spring中的循环依赖问题,这篇文章中有循环依赖的描述源码分析1.入口这里的入口方法是在AbstractApplicationContext类中的refresh()方法中的finishBeanFactoryInitialization(beanFactory);这行代码!这个方法是初始化所有剩余非懒加载单例对象!2.进入finishBeanFactoryInitialization此处调用的preInstantiateSingletons
2021-02-23 20:07:20 265
原创 Spring中的循环依赖问题
前言Spring中的循环依赖其实是一个非常简单的东西,在面试过程中会经常被问到,一般面试官会问Spring中循环依赖问题怎么解决,或者是A类一个属性指向B,B类中一个属性指向A这种问题再Spring中怎么解决。嘿嘿,这要是真的从怎么解决的角度入手那就真的掉坑里了。都是在问怎么解决,又没说让你解决,都说了是Spring中。那么当然问的是Spring是怎么解决的!我们只需要说明循环依赖时怎么产生的,以及Spring是怎么解决的,加分项,为什么需要三级缓存!搞定这些Spring循环依赖没什么问题!什么是循环依
2021-02-21 23:02:54 261 1
原创 idea无法下载源码 Sources not found for: org.springframework:spring-context:5.1.5.RELEAS
近段时间一直在研究源码层面的东西,在调试Spring源代码的时候,发现idea无法下载Spring的源代码,只能看到idea反编译过来的代码,有点头痛,又懒得去Spring官网下载,害!下载源代码报错提示如下Sources not found for: org.springframework:spring-context:5.1.5.RELEAS解决这个问题很简单,如下命令行执行如下命令mvn dependency:resolve -Dclassifier=sources源码搞定!
2021-02-21 20:29:51 7351 13
原创 Spring源码分析(流程梳理)
前言近期过年,在家待业,想闲着也是闲着,干脆充充电,撸撸Spring的源码玩玩,一提到Spring那么脑子里就会出现IOC和AOP首先需要先搞定IOC,IOC先搞懂了,那么理解AOP就更加简单了!IOCIOC大部分人都知道是容器,翻译过来是控制反转...
2021-02-20 20:24:05 501 1
原创 程序员赚外快的方式
前言IT这个行业,就是个围城,里面都想逃离,外面的人千方百计想进来,外面的人想进来无非就是看中我们这个行业的工资高罢了,里面的人想出去,无非就是工作压力大,技术更新迭代块,随着年龄的增长,有点力不从心罢了!这个行业的天花板很高,甚至是特别高!年薪百万不是梦。就怕没有做这个梦的本事!行业中90%程序员其实都是码农,甚至是码畜!话说的有点难听,但是这就是行业的事实!我们出来混,无非就是为了赚钱,那么下面我将给大家推荐几个程序员接私活,赚外快的平台,拿走不谢!祝大家在工作之余也能像下面这位大佬一样!渠道
2021-02-19 23:49:10 1550 3
原创 微信红包封面免费领取,自定义个性化红包封面
前言在新年到来之际,携码帮帮全体成员给大家拜年,祝天下所有程序员2021万事大吉,共创未来,码上成功!免费领取方式领取方式1扫描这个小程序,玩两把游戏直接获取,这个小程序中可以免费领取下面这些精美的红包封面重点是没有广告植入的!而且还不限量!再也不用担心手慢抢不到了。领取方式2这里列举一些,复制这些序列号直接可以领取,数量有限,先到先得!oEmd2HpXprA mKSLBj7aiCD roX6D6inuHZ hsYOMzpqOuL e575770980E pdiqgLsY1lR
2021-02-12 02:43:03 2102
原创 Uniapp微信小程序授权的登录前后端全套
前言用Uniapp写的小程序要上线了,结果微信不过审,我也觉得很奇怪!驳回信息如下这么一说的话确实,因为之前的写的代码获取用户openid的时候必须要是调试模式,我还以为是没上线的问题!这下好了,上线都不让上,哪还有后面的故事。之前的写法uni.login({ provider: 'weixin', success: function(res) { console.log(res) let appid = '' let secret = ''
2021-02-04 17:23:32 2446 1
原创 服务器配置Https协议
前言最近出了点状况,打乱了我原本的节奏,2021年1月28,这天是个沉痛的一天,值得牢记这一天,但是人生还得继续,该写的代码还是要写呀,小程序要上线,开发基本进入尾声了,开始准备小程序的上线之路!之前就知道小程序上线需要HTTPS这玩意,写代码的时候也没时间弄这个,这不要上线弄弄么!就是这个鸟!这里要加HTTPS那肯定是后端http服务器加了,我们后端用的是基于SpringBoot二开的若依框架开发的,说白了就是拿诺依的后台改改得了!顺瓜摸藤的弄弄!阿里云白嫖证书申请1.申请不要钱的SSL证书
2021-02-02 21:25:13 905
原创 VUE编写插件上传npm
前言这篇文章是准备不写的,因为之前写过uniapp插件上传npm,然后加上在手写VUE步骤条组件这篇文章中有提到后期会将这个步骤条组件上传到npm仓库,然后我就用上传uniapp插件的方式试着上传VUE这个插件,上传是能上传,结果在VUE项目中npm安装的这个插件的时候就无法安装,于是我就再思考,哦原来这个uniapp插件上传和VUE插件上传还不一样,于是就有了这篇文章!开干1.创建一个空VUE项目之前创建VUE项目的时候,应该用的是下面这个命令vue init webpack you-proje
2021-01-27 18:34:01 478
原创 VUE步骤条组件
前言最近和朋友一起做一个关于程序员赚外快的项目,找了个UI出了个界面,这个美术妹子声音贼好听,御姐类型的,爱了爱了!这个美术妹子估计不知道我是做后端的,前端不是特别专业,她也不问我能不能做出这种效果就把界面搞完了,这就有点难为我了!写到发布问题这个界面的时候有一个步骤条这个功能,我试着写了一下,大致上是这么个意思,但是我觉得不是特别完美,然后我就想偷懒看看有没有现成的组件,找了一些博文,要么是样式不符合,要么就是用图片实现的,局限性太大了,那么我就劳苦一下吧,写了这个VUE插件!请看下图!关于vue-
2021-01-26 21:56:41 8215 4
原创 Maven整合MyBatis
1.新建Maven工程2.导入依赖 <dependencies> <dependency><!--单元测试--> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency>
2021-01-22 18:04:13 681
原创 分布式任务调度平台XXL-JOB
前言定时任务在开发中经常用到,Spring也为我们提供了非常方便的注解来开启定时任务,之前有一篇文章简单介绍了Spring的定时任务,基本代码如下;@Component@EnableScheduling//开启定时任务public class SpringScheduleHandler { @Scheduled(cron = "0/5 * * * * *") //这个cron 表达式不用死记,在线生成网址 https://cron.qqe2.com/ public void
2021-01-20 18:43:52 377
原创 SpringCloud Stream整合RocketMQ
前言SpringCloud Stream整合的时候还是有一些坑的,请保持和我使用的版本一致!前期准备好RocketMQ环境!搭建教程往期文章RocketMQ搭建!搭建项目1.创建SpringBoot工程2.添加pom依赖 <groupId>com.tao</groupId> <artifactId>rocket-stream</artifactId> <version>0.0.1-SNAPSHOT</version
2021-01-19 22:36:46 3913 4
原创 RocketMQ源码分析-Consumer
消息消费概述消息消费以组的模式开展,一个消费组内可以包含多个消费者,每一个消费者组可订阅多个主题,消费组之间有ff式和广播模式两种消费模式。集群模式,主题下的同一条消息只允许被其中一个消费者消费。广播模式,主题下的同一条消息,将被集群内的所有消费者消费一次。消息服务器与消费者之间的消息传递也有两种模式:推模式、拉模式。所谓的拉模式,是消费端主动拉起拉消息请求,而推模式是消息达到消息服务器后,推送给消息消费者。RocketMQ消息推模式的实现基于拉模式,在拉模式上包装一层,一个拉取任务完成后开始下一个拉取任
2021-01-19 19:56:18 268
原创 SpringCloud Stream快速入门
前言在微服务的开发过程中,经常会用到消息中间件,通过消息中间件在服务于服务之间传递消息,不管你使用的是哪款消息中间件,比如RabbitMQ,Kafka和RocketMQ,那么消息中间件和服务之间都会有一定的耦合,这个耦合性是指原来使用RabbitMQ,现在由于其他原因要替换成RocketMQ,那么我们的微服务就需要修改代码,变动会比较大,因为市面上各种消息中间件还是存在一定的区别,如果我们使用SpringCloud Stream来整合我们的消息中间件,那么这样就可以降低微服务和消息中间件的耦合性,做到轻松
2021-01-19 19:55:57 309
原创 RocketMQ源码分析-消息存储
消息存储核心类private final MessageStoreConfig messageStoreConfig; //消息配置属性private final CommitLog commitLog; //CommitLog文件存储的实现类private final ConcurrentMap<String/* topic */, ConcurrentMap<Integer/* queueId */, ConsumeQueue>> consumeQueueTable;
2021-01-18 21:13:27 389
原创 RocketMQ源码分析-Producer
前言消息生产者的代码都在client模块中,相对于RocketMQ来讲,消息生产者就是客户端,也是消息的提供者。主要方法介绍//创建主题void createTopic(final String key, final String newTopic, final int queueNum) throws MQClientException;//根据时间戳从队列中查找消息偏移量long searchOffset(final MessageQueue mq, final long timesta
2021-01-18 20:40:20 214
原创 RocketMQ源码分析-NameServer
架构设计消息中间件的设计思路一般是基于主题订阅发布的机制,消息生产者(Producer)发送某一个主题到消息服务器,消息服务器负责将消息持久化存储,消息消费者(Consumer)订阅该兴趣的主题,消息服务器根据订阅信息(路由信息)将消息推送到消费者(Push模式)或者消费者主动向消息服务器拉去(Pull模式),从而实现消息生产者与消息消费者解耦。为了避免消息服务器的单点故障导致的整个系统瘫痪,通常会部署多台消息服务器共同承担消息的存储。那消息生产者如何知道消息要发送到哪台消息服务器呢?如果某一台消息服务器
2021-01-18 20:22:59 284
原创 RocketMQ源码分析-环境搭建
环境依赖JDK :1.8+MavenIntelliJ IDEA源码拉取从官方仓库 https://github.com/apache/rocketmq clone或者download源码。源码目录结构:broker: broker 模块(broke 启动进程)client :消息客户端,包含消息生产者、消息消费者相关类common :公共包dev :开发者信息(非源代码)distribution :部署实例文件夹(非源代码)example: Rocket
2021-01-18 18:46:54 337
原创 RocketMQ消费幂等
前言消息队列 RocketMQ 消费者在接收到消息以后,有必要根据业务上的唯一 Key 对消息做幂等处理的必要性。消费幂等的必要性在互联网应用中,尤其在网络不稳定的情况下,消息队列 RocketMQ 的消息有可能会出现重复,这个重复简单可以概括为以下情况:发送时消息重复当一条消息已被成功发送到服务端并完成持久化,此时出现了网络闪断或者客户端宕机,导致服务端对客户端应答失败。 如果此时生产者意识到消息发送失败并尝试再次发送消息,消费者后续会收到两条内容相同并且 Message ID 也相同的消息
2021-01-18 16:09:01 633 1
原创 RocketMQ死信队列
前言当一条消息初次消费失败,消息队列 RocketMQ 会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 RocketMQ 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。在消息队列 RocketMQ 中,这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)。死信特性死信消息具有以下特性不会再被消费者正常消费。
2021-01-18 16:07:08 7100
原创 RocketMQ消息重试
顺序消息的重试对于顺序消息,当消费者消费消息失败后,消息队列 RocketMQ 会自动不断进行消息重试(每次间隔时间为 1 秒),这时,应用会出现消息消费被阻塞的情况。因此,在使用顺序消息时,务必保证应用能够及时监控并处理消费失败的情况,避免阻塞现象的发生。无序消息的重试对于无序消息(普通、定时、延时、事务消息),当消费者消费消息失败时,您可以通过设置返回状态达到消息重试的结果。无序消息的重试只针对集群消费方式生效;广播方式不提供失败重试特性,即消费失败后,失败消息不再重试,继续消费新的消息。重试
2021-01-18 16:04:29 1487
原创 RocketMQ负载均衡
Producer负载均衡Producer端,每个实例在发消息的时候,默认会轮询所有的message queue发送,以达到让消息平均落在不同的queue上。而由于queue可以散落在不同的broker,所以消息就发送到不同的broker下,如下图:图中箭头线条上的标号代表顺序,发布方会把第一条消息发送至 Queue 0,然后第二条消息发送至 Queue 1,以此类推。整个的这个过程RocketMq的内部已经实现了,对于我们来说我们只需要发就完事了!Consumer负载均衡集群模式在集群消费模式下
2021-01-18 16:00:17 191
原创 RocketMQ高可用性机制
前言RocketMQ分布式集群是通过Master和Slave的配合达到高可用性的。Master和Slave的区别:在Broker的配置文件中,参数 brokerId的值为0表明这个Broker是Master,大于0表明这个Broker是 Slave,同时brokerRole参数也会说明这个Broker是Master还是Slave。Master角色的Broker支持读和写,Slave角色的Broker仅支持读,也就是 Producer只能和Master角色的Broker连接写入消息;Consumer可以
2021-01-18 15:51:18 201
原创 RocketMQ消息存储
前言分布式队列因为有高可靠性的要求,所以数据要进行持久化存储。消息生成者发送消息MQ收到消息,将消息进行持久化,在存储中新增一条记录返回ACK给生产者MQ push 消息给对应的消费者,然后等待消费者返回ACK如果消息消费者在指定时间内成功返回ack,那么MQ认为消息消费成功,在存储中删除消息,即执行第6步;如果MQ在指定时间内没有收到ACK,则认为消息消费失败,会尝试重新push消息,重复执行4、5、6步骤MQ删除消息存储介质关系型数据库DBApache下开源的另外一款MQ—
2021-01-18 15:15:12 859
原创 Dubbo搭建管理控制台(dubbo-admin)
搭建方式1直接搜索dubbo-admin.war找到下载链接,直接下载下载后得到dubbo-admin.war这个是一个war工程,需要tomcat容器,那么我们启动一个tomcat,软件包启动也好,docker启动也好Docker 安装 Tomcat,个人是个docker依赖患者!将dubbo-admin.war放到/tomcat/webapps/目录下,tomcat会自动解压得到dubbo-admin修改/dubbo-admin/WEB-INF/dubbo.properties重启t
2021-01-16 22:51:30 312
原创 zookeeper集群搭建
程序包下载官网下载地址这个官网做的仅次于linux镜像下载的网站搭建我这里搭建一个伪集群,也就是在同一台服务器上搭建3个节点,正式生产环境还是需要分别部署在三台服务器上的!这里搭建的时候节点个数需要是奇数!1.上传服务器、解压、创建集群目录#解压tar -zvxf zookeeper-3.4.6.tar.gz#修改zoo_sample.cfg为zoo.cfgcd cd zookeeper-3.4.6/conf/mv zoo_sample.cfg zoo.cfg#创建集群目录m
2021-01-16 15:08:51 197
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人