Java
文章平均质量分 72
春刀c
这个作者很懒,什么都没留下…
展开
-
Java-ThreadLocal
Java-ThreadLocalThreadLocal是JDK包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。每一个线程都有自己的ThreadLocal变量副本创建如下的测试类,其中有两个静态内部类,Account用于展示ThreadLocal和普通属性在多线程下的值的区别;MyThread用来验证ThreadLocal是线程独原创 2021-05-15 21:55:51 · 242 阅读 · 0 评论 -
Java-ThreadPoolExecutor使用
Java-ThreadPoolExecutor使用线程池主要由以下4个核心组件组成。线程池管理器:用于创建并管理线程池工作线程:线程池中执行具体任务的线程任务接口:用于定义工作线程的调度和执行策略,只有线程实现了该接口,线程中的任务才能被线程池调度任务队列:存放待处理的任务,新的任务将会不断被加入队列中,执行完成的任务将从队列中移除ThreadPoolExecutor如下是线程池的构造方法public ThreadPoolExecutor(int corePoolSize,原创 2021-05-12 20:36:35 · 282 阅读 · 2 评论 -
Java-String字符串的内存结构
Java-String字符串的内存结构本文参考自:公众号 程序新视界原文链接:https://mp.weixin.qq.com/s/jC3Gv3Fi0bo0d7rP5ngqpw字符串通常的创建方式有两种:new关键字创建通过引号直接赋值这两种形式的字符串创建在内存上是有区别的。使用引号直接赋值使用引号直接赋值创建字符串时,会先去常量池中查找该字符串是否已经存在,如果不存在的话先在常量池创建对象,然后返回引用地址;如果存在,则直接返回。使用new关键字创建使用new关键字创建字原创 2021-05-12 20:34:42 · 400 阅读 · 3 评论 -
Java-synchronized关键字
Java-synchronized关键字synchronized关键字用于为Java对象、方法、代码块提供线程安全的操作。synchronized关键字是一种独占式的悲观锁,同时属于可重入锁。上面的关键词:悲观锁:每次读取数据时都认为别人会修改数据,所以每次读写数据时都会加锁,这样导致其他线程想要读写这个数据时就会阻塞、等待直到获取锁。Java中的每个对象都有个monitor对象,加锁就是在竞争monitor对象。对代码块加锁是通过在前后分别加上monitorenter和monitorex原创 2021-05-04 22:49:47 · 153 阅读 · 2 评论 -
Java-反射获取Class对象执行的代码块
反射获取Class对象执行的代码块本篇主要分析四种获取Class的对象的方法,在执行时会调用对应Class的什么方法.Java中通常用来获取Class对象的方法如下:Class.forName("com.tianhao.luo.cl.AClassForName"):使用Java.lang.Class类的forName()方法创建AClassForName.class:类名.class创建cClassObject.getClass():对象.getClass()创建ClassLoader.get原创 2021-04-27 21:38:07 · 425 阅读 · 0 评论 -
开源项目-蘑菇博客搭建
文章目录蘑菇博客Centos7安装准备工作那就开始吧centos镜像安装centos启动虚拟机连接外网Centos环境配置1.yum仓库配置2.创建新用户boothost2.安装Docker3.安装docker-compose4.安装git5.安装jdk6.安装maven蘑菇博客代码地址:https://gitee.com/moxi159753/mogu_blog_v2Centos7安装下载地址:http://mirrors.aliyun.com/centos/7/isos/x86_64/原创 2021-04-25 21:56:25 · 1897 阅读 · 0 评论 -
RocketMQ入门-源码启动Namesrv和Broker
RocketMQ源码启动Namesrv和Broker[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PDhwKM7j-1619104340654)(C:%5Ctypora_pic%5C009-RocketMQ%E6%BA%90%E7%A0%81%E5%90%AF%E5%8A%A8%E9%A1%B9%E7%9B%AE%5Cimage-20210422223737414.png#pic_center)]本篇主要讲解内容包括:配置环境信息将RocketMQ源码中的namesrv原创 2021-04-22 23:16:07 · 613 阅读 · 1 评论 -
Java-JDK动态代理与CGLIB动态代理
JDK动态代理与CGLIB动态代理使用CGLIB时,需要在pom中引入依赖:<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.3.0</version></dependency>JDK动态代理要使用JDK动态代理必须要知道原创 2021-04-21 09:28:16 · 178 阅读 · 0 评论 -
Java-子父类初始化顺序
子父类初始化顺序Java基础知识科普:Java中的对象有两种类型:编译时类型和运行时类型。编译时类型指在声明对象时所采用的类型,运行时类型指为对象赋值所才采用的类型。在如下代码中,person对象的编译时类型为Person,运行时类型为Student,因此无法在编译时获取在Student类中定义的方法:Person person = new Student();原题背景:在头条上看到如下的一道题。请问输出的结果是什么?public class Test { static class原创 2021-04-18 22:17:07 · 391 阅读 · 2 评论 -
Java后端-Postman发布后端接口
准备工作:POSTMAN Version 8.0.9客户端一个可用的电子邮箱导出已有api数据(适用于已有api但未登录Postman)点击设置2. 点击data并导出登录Postman若无账号自行注册点击登录,已有登录记录会保存在浏览器中登录成功后,点击workspace;能看见操作的记录发布接口已有api文件使用上面导出的数据再重新导入,点击设置按钮,切换到data页签下,导入json文件下面实际操作新建项目并补充接口信息并发布创建项目文件夹集合,并原创 2021-03-29 16:18:26 · 505 阅读 · 1 评论 -
MyBatis入门-MyBatis脏数据的产生和避免
MyBatis脏数据的产生和避免二级缓存虽然能提高应用效率,减轻数据库服务器的压力,但是如果使用不当,很容易产生脏数据。脏数据的产生MyBatis的二级缓存是和命名空间绑定的,所以通常清空下每一个Mapper映射文件都有自己的二级缓存,不同Mapper的二级缓存互不影响。在常见的数据库操作中,多表联合查询非常多,由于关系型数据库的设计,使得很多时候需要关联多个表才能获取想要的数据。在关联多表查询时肯定会将该查询放到某个命名空间下的映射文件中,这样一个多表的查询缓存就存在该命名空间的二级缓存中。涉及这原创 2021-03-29 15:35:00 · 734 阅读 · 2 评论 -
MyBatis入门-一级和二级缓存
MyBatis缓存配置使用缓存的好处是1.更快地获取数据2.避免频繁的数据库交互。一般提到MyBatis缓存的时候,都是指二级缓存。一级缓存(也叫本地缓存)默认会启用,并且不能控制。MyBatis全局配置<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3原创 2021-03-25 23:14:49 · 89 阅读 · 0 评论 -
Docker入门-构建Apache镜像
Docker构建Apache镜像本篇主要介绍apache镜像的构建使用DockerHub镜像1.创建工作目录,准备Dockerfile文件及index.html[root@localhost docker]# mkdir apache[root@localhost docker]# cd apache/[root@localhost apache]# vim Dockerfile[root@localhost apache]# vim public-html[root@localhost a原创 2021-03-23 17:40:00 · 289 阅读 · 0 评论 -
Docker入门-为镜像添加SSH服务
为镜像添加SSH服务本篇主要介绍基于ubuntu镜像来创建提供ssh服务的镜像,创建的方式基于commit命令使用Dockerfile创建基于commit命令Docker提供了docker commit命令,支持用户提交自己对制定容器的修改,并生成新的镜像。命令格式为docker commit CONTAINER[REPOSITORY[:TAG]]1.首先,获取ubuntu:18.04镜像,并创建一个容器:[root@localhost docker]# docker pull ubunt原创 2021-03-23 16:01:50 · 348 阅读 · 0 评论 -
Docker入门-Dockerfile文件指令
Dockerfile创建镜像本文主要包括:Dockerfile文件指令Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。介绍-基本结构Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。一般而言,Dockerfile主体内容分为四部分:基础镜像信息维护者信息镜像操作指令容器启动时执行指令介绍-指令说明Dockerfile中指令的一般格式为INSTRUCTIONarguments,包括“配置指令”(配置镜像信息原创 2021-03-23 11:19:18 · 187 阅读 · 0 评论 -
Docker入门-端口映射
Docker端口映射本篇主要介绍-p属性-P属性介绍-从外部访问容器应用当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射。当使用-P(大写的)标记时,Docker会随机映射一个49000~49900的端口到内部容器开放的网络端口:[root@localhost ~]# docker run -d -P halm-front:1.08b8cd502cde636210bf0f0d3b04a8c16a9a636373da39f50fc4a8e74031da0原创 2021-03-22 22:42:45 · 447 阅读 · 0 评论 -
Docker入门-数据卷/数据卷容器
Docker数据管理容器中的管理数据主要有两种方式:数据卷(Data Volumes):容器内数据直接映射到本地主机环境;数据卷容器(Data VolumeContainers):使用特定容器维护数据卷。介绍-数据卷数据卷(Data Volumes)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。数据卷可以提供很多有用的特性:数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便;对数据卷内数据的修改会立马生效,无论是容器内原创 2021-03-22 21:01:29 · 172 阅读 · 0 评论 -
Docker入门-使用registry镜像创建私有仓库
Docker搭建本地私有仓库本篇主要介绍使用registry镜像创建私有仓库并上传镜像使用registry镜像创建私有仓库默认情况下,仓库会被创建在容器的/var/lib/registry目录下。可以通过-v参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到/u01/learn/docker/registry/目录。此时,在本地将启动一个私有仓库服务,监听端口为5000.docker run -d -p 5000:5000 -v /u01/learn/docker/regis原创 2021-03-22 17:22:47 · 254 阅读 · 0 评论 -
MyBatis入门-association标签使用
MyBatis高级结果映射本篇主要介绍association一对一查询介绍-一对一映射一对一映射因为不需要考虑是否存在重复数据,使用简单,可以直接使用MyBatis自动映射。实践-自动映射要求一个用户对应一个角色,类定义如下public class SysUser implements Serializable { private static final long serialVersionUID = 854674092994608168L; ..... priva原创 2021-03-22 16:36:19 · 7277 阅读 · 1 评论 -
Docker入门-docker容器常用命令
Docker容器操作本篇主要介绍docker容器常用命令。容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。介绍-新建容器docker create可以使用docker [container] create命令新建一个容器[root@localhost bin]# docker create -it halm-front:1.0f8ced3d93f0c9d430fac2原创 2021-03-21 11:02:26 · 519 阅读 · 0 评论 -
Docker入门-docker镜像常用命令
Docker常用命令本篇主要内容:docker的常用命令介绍docker pulldocker imagesdocker tagdocker inspectdocker historydocker searchdocker rmidocker image rmdocker image prunedocker commitdocker importdocker builddocker savedocker loaddocker push介绍-查看日志如果服务工作原创 2021-03-19 23:56:10 · 230 阅读 · 0 评论 -
MyBatis入门-动态SQL
MyBatis动态SQL本篇内容:五个标签介绍:if,choose(when、otherwise),trim(where、set)、foreach、bindOGNL(Object-Graph Navigation Language)表达式介绍介绍-if标签if的主要用处:WHERE语句中,通过判断参数值来决定是否使用某个查询条件UPDATE/INSERT语句中通过判断是否更新/插入一个字段实践-WHERE中用if要求:当只输入用户名时,需要根据用户名进行模糊查询;当只输入邮箱时,根原创 2021-03-19 10:57:25 · 247 阅读 · 0 评论 -
MyBatis入门-Mapper接口动态代理
MyBatis中Mapper接口动态代理实现原理本篇内容:了解到为什么Mapper接口没有实现类却能够被正常调用实践-无参数自定义代理类,该对象有sqlSession和mapper两个属性,sqlSession执行mapper中的方法交给代理方法来实现。InvocationHandler:当程序使用反射为指定接口生成动态代理对象,这个动态代理对象的实现类实现了一个或多个接口。动态代理对象就需要实现一个或多个接口里定义的所有方法。当执行动态代理对象里的方法时,实际上会替换成调用Invocatio原创 2021-03-18 15:26:01 · 164 阅读 · 0 评论 -
MyBatis入门-多个接口参数的用法
MyBatis中多个接口参数的用法本篇内容mapper接口中参数的类型mapper接口参数传递给xml,xml如何获取参数值@param注解的作用介绍-参数类型mapper接口中的参数类型为:基本类型JavaBeanmapper中的参数只有一个且为基本类型时,sql语句中只会使用一个参数。当参数是一个JavaBean类型时,它再xml文件中对应的sql语句会有多个参数。业务中,经常会遇到多个参数(少量)的情况,若将参数合并到一个JavaBean中和分别创建JavaBean都不太方原创 2021-03-18 11:03:55 · 117 阅读 · 0 评论 -
MyBatis入门-delete用法
MyBatis中delete用法本篇内容delete标签基本使用实践-删除一条记录mapper /** * 根据主键删除 * @param user 用户记录 * @return 执行得sql影响得行数 */ int deleteById(SysUser user);xml<!--通过主键删除--> <delete id="deleteById"> delete from mybatis原创 2021-03-18 11:02:12 · 6426 阅读 · 0 评论 -
MyBatis入门-update用法
MyBatis中update用法本篇内容update标签的基本用法实践-更新一条记录mapper中接口 /** * 根据主键更新 * @param user 用户记录 * @return 执行得sql影响得行数 */ int updateById(SysUser user);xml,update标签里,在createTime和headImg两个属性上也可以添加jdbcType的类型 <!--通过主键修改数据-->原创 2021-03-18 11:01:18 · 19886 阅读 · 0 评论 -
MyBatis入门-insert标签介绍及使用
insert用法本篇介绍了insert标签属性及作用属性列#{xxx,jdbcType=nnnn}中jdbcType的作用实现主键自增的两种方式介绍-insert标签insert标签包含的属性:id:命名空间中的唯一标识符,可用来代表这条语句parameterType:即将传入语句参数的完全限定类别或别名。因为MyBatis可以推断出传入语句的具体参数,因此不建议配置flushCache:默认值为true,任何时候只要语句被调用,都会清空一级缓存和二级缓存timeout:设置在抛出原创 2021-03-17 22:44:01 · 4170 阅读 · 0 评论 -
MyBatis入门-select标签简化查询
select用法本篇介绍了如何简化查询实体接收类中的非数据库字段介绍-select标签xml中的select标签的id属性值和定义的接口方法名是一样的。mybatis就是通过这种方式将接口方法和xml中定义的sql语句关联到一起的,如果接口方法没有和xml中的id属性值相对应,启动程序便会报错。映射xml和接口的命名需要符合如下规则:当只使用xml而不使用接口的时候,namespace的值可以设置为任意不重复的名称标签的id属性值在任何使用都不能出现英文句号".",并且同一个命名空间下不原创 2021-03-17 22:41:05 · 385 阅读 · 0 评论