首页
在线工具
搜索
1
如何将Virtualbox和VMware虚拟机相互转换
2
使用Metrics指标度量工具监控Java应用程序性能(Gauges, Counters, Histograms, Meters和 Timers实例)
3
Typora+Picgo图床使用
4
Markdown正确使用姿势
5
Jumpserver的MFA配置
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
Search
标签搜索
Angular
Docker
Phabricator
SpringBoot
Java
Chrome
SpringSecurity
SpringCloud
DDD
Git
Mac
K8S
Kubernetes
ESLint
SSH
高并发
Eclipse
Javascript
Vim
Centos
Jonathan
累计撰写
87
篇文章
累计收到
0
条评论
首页
栏目
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
页面
搜索到
87
篇与
的结果
2016-08-25
chrome-viminum快捷键
网页导航 基本滚动操作 j:向下滚动网页 k:向上滚动网页 h:向左滚动 l:向右滚动 gg:滚动到网页头部 G:滚动到网页底部 PageUp:向上翻一页 PageDown:向下翻一页 End:向下翻到底部 网页操作 r:刷新网页 gf:查看网页源码 zi:放大 zo:缩小 yy:复制当前网址 i:进入插入模式 f:进入链接提示模式,按下所有链接及输入框都被索引,链接是在当前网页打开。 F:进入链接提示模式,按下所有链接及输入框都被索引,链接是在新标签网页打开。 /:进入查找模式 n:转到下一个搜索到的字符串 N:转到上一个搜索到的字符串 历史导航 H:返回上一页 L:前进到下一页 标签操作 K,gt:向右移动一个标签 J,gT:向左移动一个标签 t:新建一个标签 d:关闭当前标签 u:恢复关闭的标签
2016年08月25日
2016-08-18
Spring-boot-configuration-processor 作用
在application.properties文件中添加自定义属性 (1)在application.properties文件中添加自定义属性(单个属性使用) 在这里我们新建一个maven java project进行测试,取名为:spring-boot-hello4。 对pom.xml基本的spring boot 配置,主要用到的一个核心依赖是: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> 官方中对于spring-boot-configuration-processor是这么说明的: 通过使用spring-boot-configuration-processor jar, 你可以从被@ConfigurationProperties注解的节点轻松的产生自己的配置元数据文件。该jar包含一个在你的项目编译时会被调用的Java注解处理器。想要使用该处理器,你只需简单添加spring-boot-configuration-processor依赖。 好了,官方已经说得很清楚了,这个依赖主要可以在代码中轻松的使用@ConfigurationProperties注解注入属性文件配置的属性值。 单属性注入的比较简单,只需要在application.properties加入配置,如下: #key = value的形式; filePathLocation = d:/data/files 那么在对应需要使用的类中使用如下代码进行引入: @Value("${filePathLocation}") private String filePathLocation; 这里使用@Value注解就可以为我们的变量filePathLocation设置上我们在application.properties文件中设置的key值了。 在实际开发中可能我们期望的是,如果没有设置key的话,设置一个默认值,使用如下代码即可实现(以上@Value的使用方式如果在没有设置key的话是会抛出异常的): @Value("${filePathLocation1:d:/data/myfiles}") private String filePathLocation1; 这里的filePathLocation1我们并没有在application.properties文件中进行指定,但是查看打印信息是可以看到我们设置的默认值的,所以设置默认值的方式就是: @Value(“${key:defaultVlaue}”) 的形式进行设置。 (2)在application.properties文件中添加自定义属性(多个属性使用) 多属性的设置也可以属性单属性的注入方式,但是这种方式不好,那么怎么比较优雅的注入多个属性值进行使用了。假设我们在application.properties定义了如下的属性: #公司简称; com.kfit.company.name =知远信科 #公司位置; com.kfit.company.location =北京海淀区 #公司联系方式; com.kfit.company.mobile = 110****1195 #公司员工人数; com.kfit.company.employCount = 100 接下来我们定义一个ComapnyProperties类进行设置这些参数。 package com.kfit.properties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; //prefix设置key的前缀; @ConfigurationProperties(prefix = "com.kfit.company") @Component public class CompanyProperties { private String name; private String location; private String mobile; private int employCount; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public int getEmployCount() { return employCount; } public void setEmployCount(int employCount) { this.employCount = employCount; } @Override public String toString() { return "CompanyProperties [name=" + name + ", location=" + location + ", mobile=" +mobile + ", employCount=" + employCount + "]"; } } 那么之后我们就可以使用如下代码注入到要使用的这些属性的类进行使用了: @Autowired private CompanyProperties companyProperties; 这里需要注意下: 第一:我们使用了@ConfigurationProperties(prefix = "com.kfit.company") 快速注入我们的属性,这里prefix是key的公共部分。 第二:这里我们使用@Component 注解为spring 管理的类,那么在别的类才可以进行注入使用。 第三:在之前的文章中我们并没有使用@Component进行注册为spring 容器中,而是使用了@EnableConfigurationProperties({WiselySettings.class}) 这样的方式进行注入的。这两种方式都可以。 (3)配置数组注入 我们在application.properties定义数组: # 员工列表 com.kfit.company.employs[0]=张三 com.kfit.company.employs[1]=李四 com.kfit.company.employs[2]=王五 类似这样的定义那么在对应的CompanyProperties文件中怎么接收呢?很简单,定义List<String>接收就可以了,代码如下: private List<String> employs = new ArrayList<String>(); 这里的属性名称employs需要和application.properties文件的key是对应的。 这样employs注入了配置中的数据,打印为如下: [张三, 李四, 王五] (4)松散的绑定 Spring Boot使用宽松的规则用于绑定属性到@ConfigurationProperties beans,所以Environment属性名和bean属性名不需要精确匹配。常见的示例中有虚线分隔的(比如,context-path绑定到contextPath),环境属性大写转为小写字母(比如:PORT绑定port)。 示例: 在application.properties文件中的配置: com.kfit.company.firstName = lin com.kfit.company.logo-path = d:/data/files/logo.png com.kfit.company.COMPANY_FULLNAME =北京知远科技公司 对应的CompanyProperties类中的对应定义: //对应:com.kfit.company.firstName = lin private String firstName; //对应:com.kfit.company.logo-path = d:/data/files/logo.png private String logoPath; //对应:com.kfit.company.COMPANY_FULLNAME = 北京知远科技公司 private String companyFullname; private List<String> employs = new ArrayList<String>(); 看到这里,你是否终于知道为什么context-path,spring.jpa.show-sql 其实是被解释为contextPath和showSql了,不然要是指定定义一个show-sql变量是无法编译通过的,oh,原来是这么回事呢,这真是太神奇了,就是因为编程无奇不有,所以才有那么多人爱编程。 (5)参数的引用 在application.properties中的各个参数之间也可以直接引用来使用,就像下面的设置: com.kfit.blog.desc=${com.kfit.blog.name}正在写《${com.kfit.blog.title}》 这个就很好理解了,使用${key} 的方式进行引用。 (6)随机数 在一些情况下,有些参数我们需要希望它不是一个固定的值,比如密钥、服务端口等。Spring Boot的属性配置文件中可以通过${random}来产生int值、long值或者string字符串,来支持属性的随机值。 # 随机字符串 com.kfit.blog.value=${random.value} # 随机int com.kfit.blog.number=${random.int} # 随机long com.kfit.blog.bignumber=${random.long} # 10以内的随机数 com.kfit.blog.test1=${random.int(10)} # 10-20的随机数 com.kfit.blog.test2=${random.int[10,20]} 好了,这些在之前的文章都有介绍过了,就不多说了。 (7)使用自定义的配置文件company.properties怎么操作 如果我们自己定义一个company.properties文件, #key = value的形式; filePathLocation = d:/data/files #公司简称; com.kfit.company.name =知远信科-custom #公司位置; com.kfit.company.location =北京海淀区-custom #公司联系方式; com.kfit.company.mobile = 110****1195-custom #公司员工人数; com.kfit.company.employCount = 100 # 员工列表 com.kfit.company.employs[0]=张三-custom com.kfit.company.employs[1]=李四-custom com.kfit.company.employs[2]=王五-custom com.kfit.company.firstName = lin-custom com.kfit.company.logo-path = d:/data/files/logo.png-custom com.kfit.company.COMPANY_FULLNAME =北京知远科技公司-custom 这个定义就是我们刚刚提到的一些配置,那么怎么引入了,如果使用上面的CompanyProperties的方式肯定是不行了,那么怎么呢?其实很简单,只需要在CompanyProperties稍微修改下即可,修改的地方如下: @ConfigurationProperties( prefix = "com.kfit.company", locations="classpath:company.properties") 大家注意,这里唯一不一样的地方是加入了一个属性locations指定了我们要使用的配置文件路径和名称,如果我们的配置文件不在application.properties下,可以这么定义: classpath:config/company.properties。 好了这一个知识点就这么简单,只要掌握要点,一句代码就可以搞定。 (8)在方法上使用@Bean的时候如何进行注入 这个需求点是怎么产生的呢?我们经常会配置多个数据源,那么我们有些配置还是希望从application.properties文件中进行读取,那么自然而然的在我们定义的@bean中就需要能够读取配置文件的属性。这里我们简单做个试验,我们定义CompanyProperties3,具体代码如下: package com.kfit.properties; import java.util.ArrayList; import java.util.List; public class CompanyProperties3 { private String name; private String location; private String mobile; private int employCount; //对应:com.kfit.company.firstName = lin private String firstName; //对应:com.kfit.company.logo-path = d:/data/files/logo.png private String logoPath; //对应:com.kfit.company.COMPANY_FULLNAME = 北京知远科技公司 private String companyFullname; private List<String> employs = new ArrayList<String>(); public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLogoPath() { return logoPath; } public void setLogoPath(String logoPath) { this.logoPath = logoPath; } public String getCompanyFullname() { return companyFullname; } public void setCompanyFullname(String companyFullname) { this.companyFullname = companyFullname; } public List<String> getEmploys() { return employs; } public void setEmploys(List<String> employs) { this.employs = employs; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public int getEmployCount() { return employCount; } public void setEmployCount(int employCount) { this.employCount = employCount; } @Override public String toString() { return "CompanyProperties [name=" + name + ", location=" + location + ", mobile=" + mobile + ", employCount=" + employCount + ", firstName=" + firstName + ", logoPath=" + logoPath + ", companyFullname=" + companyFullname + ", employs=" + employs + "]"; } } 注意这里的代码和以上不一样的是类上的注解全没有了,之后我们在App.java启动类中或者其它的类也是可以的,使用@Bean的方式进行注入。 @Bean @ConfigurationProperties(prefix = "com.kfit.company") public CompanyProperties3 companyProperties3(){ return new CompanyProperties3(); } 那么在其它的类中我们就使用@Autowired进行注入使用了,如下: @Autowired private CompanyProperties3 companyProperties3; 是不是很好玩呢。 (9)自定义结构 对于复杂的配置或嵌套的kv,我们可以编写自定义结构属性以更好的方式进行管理。 比如我们在application.properties文件中有如下信息: com.kfit.employForzs.name =张三 com.kfit.employForzs.age = 20 com.kfit.employForzs.gender =男 com.kfit.employForls.name =李四 com.kfit.employForls.age = 25 com.kfit.employForzs.gender =女 com.kfit.properties.CompanyEmployee的代码如下: package com.kfit.properties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; //prefix设置key的前缀; @ConfigurationProperties(prefix = "com.kfit") @Component public class CompanyEmployee { private CompanyEmployeeInfo employForzs; private CompanyEmployeeInfo employForls; public CompanyEmployeeInfo getEmployForzs() { return employForzs; } public void setEmployForzs(CompanyEmployeeInfo employForzs) { this.employForzs = employForzs; } public CompanyEmployeeInfo getEmployForls() { return employForls; } public void setEmployForls(CompanyEmployeeInfo employForls) { this.employForls = employForls; } public static class CompanyEmployeeInfo { private String name; private int age; private String gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "EmployForzs [name=" + name + ", age=" + age + ", gender=" + gender + "]"; } } @Override public String toString() { return "CompanyEmployee [employForzs=" + employForzs + ", employForls=" + employForls + "]"; } } 观察以上的代码我们定义了一个内部静态类进行处理相同的属性,那么在外部类中定义两个变量进行接收application.properties文件中的配置信息。 之后在其它类就可以使用@Autowired进行注入使用了。 (10)校验 当我们使用@ConfigurationProperties的时候,我们希望对一些参数进行校验,比如有些参数为空或者数字超出的限制就抛出异常信息,那么这个怎么操作呢? 在application.properties文件中加入: com.kfit.company.url = http://www.kfit.com 在CompanyProperties类中加入: @URL private String url; 这里使用了@URL对url进行校验,如果是非法的url在启动的时候是会抛出异常信息的。 其中@URL对应的包路径为:org.hibernate.validator.constraints.URL 那么还有其它的什么校验器呢?看下文: @Max(value = 99) private int employCount; 定义最大值只能是99,那么如果运行的话,显然就会报错了,因为之前我们配置的值是100,那么就会看到控制台抛出异常信息: default message [最大不能超过99] 这里只是截取了一小部分异常信息,具体的异常信息是可以参数那个参数的设置有问题的。 既然有最大值就有最小值的配置: @Max(value = 1000) @Min(value = 1) private int employCount; 接着往下看: @NotNull private String name; @NotNull说明name不能为null,如果为null就抛出异常。 接着往下看: @NotEmpty private String location; @NotEmpty不能为空,当没有定义key和key的值为空字符的时候都会抛出异常信息。 在validation-api下包javax.validation.constraints下还有其它的校验器,大家可以根据需要自行学习。当然校验器是可以自定定义的,大家可以自己在扩展下,好了这个章节就介绍到这里了。
2016年08月18日
2016-08-11
Docker 基本语法与选项
Docker 基本语法与选项 基本语法 docker [OPTIONS] COMMAND [arg...] 选项 选项 描述 `-D=true false` -H, --host=[unix:///var/run/docker.sock] 在daemon模式下绑定的socket,通过一个或多个 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd 来指定。 `--api-enable-cors=true false` -b="" 将容器挂载到一个已存在的网桥上。指定为'none'时则禁用容器的网络。 --bip="" 让动态创建的docker0采用给定的CIDR地址; 与-b选项互斥。 `-d=true false` --dns="" 让Docker使用给定的DNS服务器。 -g="" 指定Docker运行时的root路径。缺省为/var/lib/docker。 `--icc=true false` --ip="" 绑定端口时候的默认IP地址。缺省为0.0.0.0。 `--iptables=true false` --mtu=VALUE 指定容器网络的MTU。缺省为1500。 -p="" 指定daemon的PID文件路径。缺省为/var/run/docker.pid。 -s="" 强制Docker运行时使用给定的存储驱动。 `-v=true false` `--selinux-enabled=true false` 命令 Docker的命令可以采用docker-CMD或者docker CMD的方式执行。两者一致。 容器操作 docker attach 依附到一个正在运行的容器中。 docker cp 从容器中复制文件到宿主系统中。 docker diff 检查一个容器文件系统的修改。 docker exec 在运行中的容器内执行命令。 docker kill 关闭一个运行中的容器 (包括进程和所有资源)。 docker pause 暂停一个容器中的所有进程。 docker port 查找一个NAT到一个私有网口的公共口。 docker ps 列出容器。 docker restart 重启一个运行中的容器。 docker rm 删除给定的若干个容器。 docker start 启动一个容器。 docker stop 终止一个运行中的容器。 docker top 查看一个容器中的正在运行的进程信息。 docker unpause 将一个容器内所有的进程从暂停状态中恢复。 docker wait 阻塞直到一个容器终止,然后输出它的退出符。 镜像操作 docker build 从一个Dockerfile创建一个image。 docker commit 从一个容器的修改中创建一个新的image。 docker export 导出容器内容为一个tar包。 docker history 显示一个image的历史。 docker images 列出存在的image。 docker import 导入一个tar包来创建一个image。 docker load 从一个tar包中加载一个image。 docker pull 从一个Docker的注册服务器下拉一个image或仓库。 docker push 将一个image或者仓库推送到一个Docker的注册服务器。 docker rmi 删除给定的若干个image。 docker save 保存一个image为tar包文件。 docker tag 为一个image打标签。 其他命令 docker events 从服务端获取实时的事件。 docker info 显示一些相关的系统信息。 docker inspect 显示一个容器的底层具体信息。 docker logs 获取容器的log信息。 docker version 输出Docker的版本信息。 docker login 注册或登录到一个Docker的仓库服务器。 docker logout 从Docker的仓库服务器登出。 docker search 在Docker index中搜索一个image。
2016年08月11日
2016-08-11
Docker Info 出现错误Cannot connect to the Docker daemon. Is 'docker -d' running on this host?
Docker Info 出现错误Cannot connect to the Docker daemon. Is 'docker -d' running on this host? docker -d 查看具体错误 如果出现:fatal error: unexpected signal during runtime execution 请安装device-mapper yum install device-mapper
2016年08月11日
2016-07-28
项目中js文件修改后浏览器不能及时更新的解决办法
项目中js文件修改后浏览器不能及时更新的解决办法 现在就分别把IE,firefox,chrome中解决办法贴出来供大家参考: 1.firefox(火狐浏览器)解决问题 第一步,在浏览器中敲入:about:config ,然后回车 第二步,在显示出的内容中找到下面的列表内容,双击下面图中圈出的内容 在出现的对话框中将3改为1 然后关闭这个页面,你就可以让你的项目在更新时浏览器及时地更新你项目中的js文件。 2.IE 打开IE浏览器,同时按住ALT+X,在出现的页面上点击Internet选项,进入Internet选项配置界面中,点击在下面的图中圈出的按钮 进入设置界面,然后选中下面图中圈出的选项 然后依次点击确定,然后,IE浏览器就可以及时更新项目中更改的js文件。 3.chrome(谷歌浏览器) 此方法是根据下方评论整理,个人未验证。 只要F12打开开发者工具,点击右下角的齿轮“设置”按钮进入下一界面,选中General选项卡中的Disable cache (while DevTools is open) 就行了。下次只要你是在开发者工具打开的情况下,均会不保存缓存,因此会加载最新版本的js。 4.刚刚想起来的一个办法 这个办法也没有根本的解决为什么修改的js文件不能在浏览器中及时更新,但是使用本方法可以实现更新,这个方法就是手动删除部署的文件,然后从新部署项目。下面是分别针对myeclipse和eclipse找到部署的项目的位置。 4.1针对eclipse使用者: 使用eclipse的朋友们注意,由于eclipse默认的在tomcat中部署项目的位置并不在tomcat中的webapp目录下,而是在eclipse安装路径下,例如我使用的是eclipse luna ,我在tomcat中部署的项目的默认的位置为: .metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps ,你如果想找这个路径,那么,你就需要去你的workspace下去找.metadata文件夹,然后再按照上面的路径查找到你的部署的项目,手动删除后,在eclipse中从新部署项目,就可以消除浏览器不能更新的问题。 4.1针对Myeclipse使用者: myeclipse中部署的项目的路径就在tomcat的安装路径中webapp文件夹下,在这个webapp文件夹中查找到你的项目,手动删除,然后在myeclipse中重新部署项目即可。 5.其他方法 根据评论本文章的朋友们的建议,我也亲自尝试了一下他们的方法,觉得这个方法还是蛮不错的,比我的上面的方法要好的多,只需要在引用的js中加入下面的一句话即可 <script src="1.js?ver=1"></script> 一开始我还以为后面的ver=1需要经常修改值才不会造成仍旧读不出来,现在发现及时修改的js文件,也不需要修改这个数字就可以更新。 以上全部内容以markdown格式输出,不能漏掉一个字
2016年07月28日
1
...
15
16
17
18