首页
在线工具
搜索
1
使用Metrics指标度量工具监控Java应用程序性能(Gauges, Counters, Histograms, Meters和 Timers实例)
2
如何将Virtualbox和VMware虚拟机相互转换
3
Jumpserver的MFA配置
4
Kuboard与KubeSphere的区别:Kubernetes管理平台对比
5
Markdown正确使用姿势
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
Search
标签搜索
Angular
Docker
Phabricator
SpringBoot
Java
Chrome
SpringSecurity
SpringCloud
DDD
Git
Mac
K8S
Kubernetes
ESLint
SSH
高并发
Eclipse
Javascript
Vim
Centos
Jonathan
累计撰写
86
篇文章
累计收到
0
条评论
首页
栏目
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
页面
搜索到
86
篇与
的结果
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日
2016-07-19
Eclipse中JSP、JS文件编辑时卡死现象解决汇总
Eclipse中JSP、JS文件编辑时,卡死现象解决汇总 使用Eclipse编辑jsp、js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲。将所有用过的方法罗列如下: 1、取消验证 路径:windows–>perferences–>validation 操作:把除了manual下面的全部点掉,build下只留classpath dependency Validator。 2、关闭拼写检查 路径:windows–>perferences–>general–> editors->Text Editors->spelling 操作:关闭拼写检查功能。 3、对于MyEclipse来讲,修改JSP页面时的编辑工具 路径:Window > perferences > General > Editors > File Associations > 在File types 中选择 *.jsp > 在Associated editors 中将"MyEclipse JSP Editor"设置为默认。 4、杜绝jar包访问网络 当用eclipse或myeclipse编辑JSP时,使用智能提示将可能导致ide卡死。这是因为eclipse提示时会根据JAR包指定的javadoc location访问网络。 解决方法:window-->preferences-->java-->installed JREs,编辑使用的jre,把rt.jar和charsets.jar的javadoc location设置为空(none)即可。当然也可以去下载javadoc到本机,进行相关设置也可以解决。另外:把自己项目中所有用到的jar包,都作同样处理。 5、修改打开链接的快捷键 最近在MyEclipse中编辑代码时,使用快捷键进行复制粘贴,经常会导致编辑器短暂的停顿,光标不跟随,居然反应不过来,几近假死。想来想去应该是编辑上的什么配置或者是IDE的什么功能导致,于是进入Preferences查找edit功能,进行一个个的测试,最后发现原来是代码的超链功能导致。 进入方法:Window -> Preferences -> General -> Editors -> Text Editors -> Hyperlinking 把超链的快捷键改为其他键比如Alt(不能改为shift)。说明:在Eclipse中,经常可以使用Ctrl+鼠标单击,可以直接将编辑界面引导到相关的方法,属性,或者类。这个功能确实非常好用,但是由于复制粘贴的功能快捷键也是Ctrl,以致我在快速进行操作的时候,Eclipse反应不过来,无法分析我的操作,现在只需要改变一个其他的快捷。 6、修改项目的.project文件 eclipse中默认js编辑器非常慢,尤其在拷贝粘贴代码时的解决方法。使用的是官网标准版的eclipse3.9 for javaEE未装任何插件,写JS时卡的简直无法忍受,尝试去掉所有的validate,包括菜单和项目属性中的都无作用,后来在项目根目录..project中发现以下红色行居然Validator都还在,把红色对应的配置段全部删去后,问题解决,编辑JS再也不似蜗牛了。 <buildSpec> <buildCommand> <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name> <triggers>full,incremental,</triggers> <arguments> <dictionary> <key>LaunchConfigHandle</key> <value><project>/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch</value> </dictionary> </arguments> </buildCommand> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>org.eclipse.wst.common.project.facet.core.builder</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name> <triggers>full,incremental,</triggers> <arguments> <dictionary> <key>LaunchConfigHandle</key> <value><project>/.externalToolBuilders/org.eclipse.wst.validation.validationbuilder.launch</value> </dictionary> </arguments> </buildCommand> </buildSpec> <natures> <nature>org.eclipse.jem.workbench.JavaEMFNature</nature> <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature> <nature>org.eclipse.wst.common.project.facet.core.nature</nature> <nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.wst.jsdt.core.jsNature</nature> </natures> 7、调整Eclipse运行内存。 在eclipse的安装目录下用EditPlus编辑eclipse.ini文件,将其中的参数改成 -vmargs -Dosgi.requiredJavaVersion=1.6 -Xms512m -Xmx512m -XX:PermSize=256M -XX:MaxPermSize=256M -XX:-UseGCOverheadLimit
2016年07月19日
1
...
15
16
17
18