jenkins自动部署(远程编译、部署)
d48bd0ddc063aeaf3bab315a49123e70ffa7da57bf41fc98c48d8148adab7704caeb0af84501eeda033f87f129f8f297dd50dc1bf7829ed957912d2b3d48492e68e866e68ad0a6a104e8bcde9ed5b64b21a9e08b9675d6214fa006de804ed08b5f77542ef3eeeac6f0112534aafba4549fb348159971e5e91d93d40bda8c792774790bc3b0737b7b6365b0cab6657dcd0430659ce63859cb32731854cefb98c0b5f38c0c76be4bd4b8de3f4716ae2186ab0d35f3384e303ec525eda395b958bf45704040aeee646bf468b9fa25f0b9b0890200725fa57d9560e719296a48fc63dc3e3fec033d0c5133fcffc250aa81c74fdcfee73bc55a7ed ...
Spring如何解决循环依赖
前言Spring的解决循环依赖是有前置条件的,要解决循环依赖我们首先要了解Spring Bean对象的创建过程和依赖注入的方式。
什么是循环依赖通俗来讲,就是A依赖B或者B依赖A,或者C依赖自己本身,或是三个以上,例如A依赖B,B依赖C,C又依赖A。如下图:
Spring实例Bean的本质Spring在实例化一个bean的时候,是首先递归的实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回,然后反递归的将获取到的bean设置为各个上层bean的属性的。
循环依赖主要场景
什么情况下循环依赖可以被解决
Spring解决循环依赖是有前置条件的
出现循环依赖的Bean必须要是单例(singleton),如果依赖prototype则完全不会有此需求。依赖注入的方式不能全是构造器注入的方式。
解决方式Spring是通过三级缓存来解决上述问题的:
一级缓存: singletonObjects存储的是所有创建好了的单例Bean二级缓存:earlySingletonObjects完成实例化,但是还未进行属性注入及初始化的对象三级缓存:singletonFacto ...
jar包docker镜像作成
jar项目打包成docker镜像部署介绍部署jar项目,可以mvn clean package之后,直接放到启动路径下即可,今天给大家介绍创建docker镜像,使用docker镜像启动容器运行部署jar项目的方式,可以尝试尝试,原理和使用直接拖动部署一样,不过是使用的docker容器而已,内部还是使用的是jdk作为基础镜像。
docker安装可以参考docker-linux安装教程
编写dockerfile并发布FROM maven:3.6.3-openjdk-11-slim AS builderWORKDIR "/server"# 主要文件COPY ./settings.xml /tmp/ck-web-back/settings.xmlCOPY ./pom.xml /tmp/ck-web-back/pom.xmlCOPY ./src /tmp/ck-web-back/src/# package jarRUN cd /tmp/ck-web-back && mvn clean package --settings ./settings.xml -Dm ...
数组对象分组引发的思考
通常做法
循环数组,找到指定相同的key,进行分组
比如下面的代码:
const people = [ {name: 'test1', age: 25, sex:'male', tel: '17853538076'}, {name: 'test2', age: 23, sex:'female', tel: '17853538071'}, {name: 'test3', age: 22, sex:'male', tel: '17853538072'}, {name: 'test4', age: 25, sex:'female', tel: '17853538073'}, {name: 'test5', age: 22, sex: ...
Spring AOP
AOP的定义AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。
面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术,如下图所示:
AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。
AOP的作用AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。
主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性。
简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。
AOP的应用场景AOP可以拦截指定的方法,并且对方法增强,比如:事务、日志、权限、性能监测等增强,而且无需侵入到业务代码中, ...
什么是浏览器缓存
定义
浏览器缓存(Brower Caching)是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。
浏览器是如何判断是否使用缓存的
1.浏览器第一次加载资源,服务器返回200,浏览器将资源文件从服务器上请求下载下来,并把response header及该请求的返回时间一并缓存;
2.下一次加载资源时,先比较当前时间和上一次返回200时的时间差,如果没有超过cache-control设置的max-age,则没有过期,命中强缓存,不发请求直接从本地缓存读取该文件(如果浏览器不支持HTTP1.1,则用expires判断是否过期);如果时间过期,则向服务器发送header带有If-None-Match和If-Modified-Since的请求
3.服务器收到请求后,优先根据Etag的值判断被请求的文件有没有做修改,Etag值一致则没有修改,命中协商缓存,返回304;如果不一致则有改动,直接返回新的资源文件带上新的Etag值并返回200;;
4.如果服务器收到的请求没有Etag值,则将If-Modified-Since和被请求文件 ...
for 循环与 forEach 的区别?
知识点
for 循环可以使用 break 跳出循环,但 forEach 不能。
for 循环可以控制循环起点(i初始化的数字决定循环的起点), forEach 只能默认从索引 0 开始。
for 循环过程中支持修改索引(修改 i ),但 forEach 做不到(底层控制 index 自增,无法左右它)。
什么是事件轮询(EventLoop)
定义
一个用来等待和发送消息和事件的程序结构。
知识点
所有任务都在主线程上执行,形成一个执行栈。
主线程发现有异步任务,如果是微任务就把他放到微任务的消息队列里,如果是宏任务就把他放到宏任务的消息队列里。
执行栈所有同步任务执行完毕。
执行微任务队列,之后再执行宏任务队列。
轮询第 4 步。
什么是PromiseLike
问题描述
如何判断一个值是不是PromiseLike?
代码实现/** * 判断一个值是不是PromiseLike */function isPromiseLike(value) { return (value !== null && (typeof value === 'object' || typeof value === 'function') && typeof value.then === 'function')}
前端代码docker镜像作成
Vue项目打包成docker镜像部署(以vue举例)介绍部署Vue项目,可以build之后,直接放到nginx下面即可,今天给大家介绍创建docker镜像,使用docker镜像启动容器运行部署Vue项目的方式,可以尝试尝试,原理和使用nginx部署一样,不过是使用的docker容器而已,内部还是使用的是nginx作为基础镜像。
docker安装可以参考docker-linux安装教程
编写dockerfile并发布# dokcerfile# build stageFROM node:lts-alpine as build-stageWORKDIR /appCOPY package*.json ./# sass单独设置拉取地址(速度快的话可以不用)RUN npm set sass_binary_site https://npm.taobao.org/mirrors/node-sassRUN npm config set registry https://registry.npm.taobao.org/RUN npm installCOPY . .RUN npm run build# pr ...