Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3646b82

Browse files
author
joshua.shi
committed
fix:优化内容
1 parent 75026af commit 3646b82

File tree

4 files changed

+219
-34
lines changed

4 files changed

+219
-34
lines changed

‎.gitignore‎

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,3 @@
1-
# Created by .ignore support plugin (hsz.mobi)
2-
### Java template
3-
# Compiled class file
4-
*.class
5-
6-
# Log file
7-
*.log
8-
9-
# BlueJ files
10-
*.ctxt
11-
12-
# Mobile Tools for Java (J2ME)
13-
.mtj.tmp/
14-
15-
# Package Files #
16-
*.jar
17-
*.war
18-
*.nar
19-
*.ear
20-
*.zip
21-
*.tar.gz
22-
*.rar
23-
24-
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
25-
hs_err_pid*
26-
271
.DS_Store
282
.idea/JavaEdge.iml
293
.idea/compiler.xml
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# 整合
2+
- 添加依赖
3+
![](https://img-blog.csdnimg.cn/20190916234856333.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
4+
- 启动应用
5+
![](https://img-blog.csdnimg.cn/2019091623500231.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
6+
- [打开链接](http://localhost:8080/actuator)
7+
![](https://img-blog.csdnimg.cn/20190916235411576.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_16,color_FFFFFF,t_70)
8+
![](https://img-blog.csdnimg.cn/20190917001217324.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
9+
10+
## 健康信息
11+
健康信息可以检查应用的运行状态,它经常被监控软件用来提醒人们生产环境是否存在问题。health端点暴露的默认信息取决于端点是如何被访问的。对于一个非安全,未认证的连接只返回一个简单的'status'信息。对于一个安全或认证过的连接其他详细信息也会展示
12+
Spring Boot包含很多自动配置的HealthIndicators,你也可以写自己的。
13+
14+
### 自动配置的HealthIndicators
15+
Spring Boot在合适的时候会自动配置以下HealthIndicators:
16+
![](https://img-blog.csdnimg.cn/20190917002830278.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
17+
- 下表显示了内置状态的默认状态映射:
18+
![](https://img-blog.csdnimg.cn/20190917003004321.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
19+
20+
- 让我们配置一下health节点,并重启应用
21+
![](https://img-blog.csdnimg.cn/20190917001814832.png)
22+
- 可看到对于磁盘的监控信息
23+
![](https://img-blog.csdnimg.cn/20190917001849686.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
24+
25+
## 应用信息
26+
应用信息会暴露所有InfoContributor beans收集的各种信息,Spring Boot包含很多自动配置的InfoContributors,你也可以编写自己的实现。
27+
### 自动配置的InfoContributors
28+
Spring Boot会在合适的时候自动配置以下InfoContributors:
29+
![](https://img-blog.csdnimg.cn/20190917003252246.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
30+
31+
> 注 使用management.info.defaults.enabled属性可禁用以上所有InfoContributors。
32+
33+
### 自定义应用info信息
34+
通过设置Spring属性info.*,你可以定义info端点暴露的数据。所有在info关键字下的Environment属性都将被自动暴露,例如,你可以将以下配置添加到application.properties:
35+
```
36+
info.app.encoding=UTF-8
37+
info.app.java.source=1.8
38+
info.app.java.target=1.8
39+
```
40+
注 你可以在构建时扩展info属性,而不是硬编码这些值。假设使用Maven,你可以按以下配置重写示例:
41+
```
42+
info.app.encoding=@project.build.sourceEncoding@
43+
info.app.java.source=@java.version@
44+
info.app.java.target=@java.version@
45+
```
46+
### Git提交信息
47+
info端点的另一个有用特性是,在项目构建完成后发布git源码仓库的状态信息。如果GitProperties bean可用,Spring Boot将暴露git.branch,git.commit.id和git.commit.time属性。
48+
49+
> 注 如果classpath根目录存在git.properties文件,Spring Boot将自动配置GitProperties bean。查看Generate git information获取更多详细信息。
50+
51+
使用management.info.git.mode属性可展示全部git信息(比如git.properties全部内容):
52+
```
53+
management.info.git.mode=full
54+
```
55+
### 构建信息
56+
如果BuildProperties bean存在,info端点也会发布你的构建信息。
57+
58+
注 如果classpath下存在META-INF/build-info.properties文件,Spring Boot将自动构建BuildProperties bean。Maven和Gradle都能产生该文件
59+
60+
- 配置info
61+
![](https://img-blog.csdnimg.cn/20190917003634110.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
62+
- 启动观察输出信息![](https://img-blog.csdnimg.cn/20190917003721284.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
63+
64+
- SpringBoot支持很多端点,除了默认显示的几个,还可以激活暴露所有端点
65+
![](https://img-blog.csdnimg.cn/20190917004116115.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
66+
![](https://img-blog.csdnimg.cn/20190917004052711.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
67+
- 如果只想暴露某个端点也是可以的
68+
![](https://img-blog.csdnimg.cn/2019091700435537.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
69+
- 查看JVM最大内存
70+
![](https://img-blog.csdnimg.cn/20190917004447618.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_16,color_FFFFFF,t_70)
71+
## 3 Beans
72+
Bean 端点提供有关应用程序 bean 的信息。
73+
### 获取 Beans
74+
- /actuator/beans GET 请求
75+
![](https://img-blog.csdnimg.cn/9f6178ded60f4b8ba018bc2bdef864de.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmF2YUVkZ2Uu,size_12,color_FFFFFF,t_70,g_se,x_16)
76+
响应的结构:
77+
![](https://img-blog.csdnimg.cn/2f2e8b7d5b0643c5a18f25968242c948.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmF2YUVkZ2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)

‎操作系统/Linux/Linux必备命令集合.md‎

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1376,17 +1376,36 @@ apt-get purge packagename 等同于 apt-get remove packagename --purge
13761376

13771377
配置文件只包括/etc目录中的软件服务使用的配置信息,不包括home目录中的
13781378

1379-
# 8 Linux常见问题与解决方案
1380-
## 1 Repository list的更新日期久远
1379+
## Curl
1380+
利用URL规则在命令行下工作的文件传输工具。支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。
1381+
curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。
1382+
适合网页处理流程和数据检索自动化。
1383+
### 语法
1384+
```clike
1385+
curl (选项) (参数)
1386+
```
1387+
### 参数
1388+
```clike
1389+
-i/I 通过-I或-head可只打印HTTP头部信息,-i会带上网页内容
1390+
-X/--request 指定什么命令
1391+
```
1392+
![](https://img-blog.csdnimg.cn/7dc8964b172348378d4d059e8b0603e3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmF2YUVkZ2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)
1393+
![](https://img-blog.csdnimg.cn/f11f36b1dd084268a3b707c3ab8c6c9d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmF2YUVkZ2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)![](https://img-blog.csdnimg.cn/728954e03c5549bdbb9fec674a244c1b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmF2YUVkZ2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)
1394+
1395+
1396+
# 8 Linux常见问题解决方案
1397+
## Repository list的更新日期久远
13811398
- yum判断你上次更新repository list的时间太久远(2周以上),所以不让使用者操作yum,以避免安装到旧的软件包!
13821399
![](https://img-blog.csdnimg.cn/img_convert/986a2dea2586477e92e164ed1a568cbd.png)
1383-
1384-
## 解决方案
1400+
### 解决方案
13851401
- 清除yum repository缓存
13861402
![sudo yum clean all](https://img-blog.csdnimg.cn/img_convert/7ad03eae3d6ee2db4e73d786c162244f.png)
13871403

1388-
## 问题:linux下有些工具安装之后,除了要修改root下的.bashfile(也就是添加个环境变量) ,还要修改etc/profile 下的环境变量 , 两个profile是干什么用的?区别?
1404+
## 有些工具安装之后,除了要修改root下的.bashfile(即加环境变量) ,还要修改etc/profile, 两个profile是干什么用的?有啥区别?
1405+
- /etc/profile
1406+
每个用户登录时都会运行的环境变量设置,属于系统级别的环境变量,其设置对所有用户适用
1407+
- .bashfile
1408+
单用户登录时比如root会运行的,只适用于当前用户,且只有在你使用的也是bash作为shell时才行。
13891409

1390-
解答:
1391-
- /etc/profile :这个文件是每个用户登录时都会运行的环境变量设置,属于系统级别的环境变量,设置在里 面的东西对所有用户适用
1392-
- .bashfile 是单用户登录时比如root会运行的,只对当前用户适用,而且只有在你使用的也是bash作为shell时才行. rpm是red hat,fedora,centos这几个发行版使用的安装包,和其它tar.gz的区别是有个文件头,多了一些信息。 rpm包多数是二进制文件,可以直接运行的,但tar.gz包很多是源代码,要编译后才能运行。 二进制文件和windows下的exe文件一个意思,可以直接运行。
1410+
rpm是red hat、fedora、centos这几个发行版使用的安装包,和其它tar.gz的区别是有个文件头,多了一些信息。rpm包多数是二进制文件,可以直接运行的,但tar.gz包很多是源代码,要编译后才能运行。
1411+
二进制文件和windows下的exe文件一个意思,可以直接运行。
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
面对一个新项目,如何理解它的模型呢?
2+
3+
要先知道项目提供了哪些模型,模型又提供了怎样的能力。若只知道这些,你只是在了解别人设计的结果,这不足以支撑你后期对模型的维护。
4+
5+
在一个项目中,常常会出现新人随意向模型中添加内容,修改实现,让模型变得难以维护。原因在于**对模型的理解不够**
6+
7+
模型都是为解决问题,理解一个模型,需要了解在没有这个模型之前,问题是如何被解决的?
8+
这样,你才能知道新的模型究竟提供了怎样的提升,这是理解一个模型的关键。
9+
10+
本文以Spring的IoC容器为例,来看看怎样理解软件的模型。
11+
12+
# 耦合的依赖
13+
Spring的根基就是IoC容器,即" 控制反转",也叫依赖注入。
14+
15+
> IoC容器是为了解决什么问题呢?
16+
17+
组件创建和组装问题。
18+
19+
> 为什么这是个亟待解决的问题?
20+
21+
软件设计需要有个分解过程,必然还面对一个组装过程,即将分解出的各组件组装到一起完成功能。
22+
23+
# 案例
24+
某博客服务提供:根据标题查询博客。
25+
![](https://img-blog.csdnimg.cn/b8de0b116dde4de7bed99396d3a95c5d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmF2YUVkZ2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)
26+
27+
ArticleService处理业务过程中,需用ArticleRepository辅助完成功能,即ArticleService依赖ArticleRepository。
28+
29+
> 这时你会怎么做?
30+
31+
直男做法,在 ArticleService新增一个ArticleRepository字段:
32+
![](https://img-blog.csdnimg.cn/787ab78bbeea4e2db62a91f41ba04428.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmF2YUVkZ2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)
33+
34+
看起来好像还行。
35+
**那这个字段怎么初始化?**
36+
37+
直男反应:直接new!
38+
![](https://img-blog.csdnimg.cn/64b5600ce483444d96ae63fda603e977.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmF2YUVkZ2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)
39+
40+
看起好还能用,但实际上DBArticleRepository不能这样初始化。
41+
就如实现类的名字,这里要用到DB。但在真实的项目中,由于资源所限,一般不会在应用中任意打开DB连接,而是会共享DB连接。
42+
所以,DBArticleRepository需要一个DB连接(Connection)参数。
43+
44+
于是你决定通过构造器把这个参数传入:
45+
![](https://img-blog.csdnimg.cn/c6ab873516aa4309ae16cd1785022d59.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmF2YUVkZ2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)看上去也还正常。既然开发完了,那么开始测试吧:
46+
要让ArticleService跑起来,就得让ArticleRepository也跑起来;就得准备好DB连接。
47+
48+
是不是太麻烦,想放弃测试了?。但你还是决定坚持一下,去准备DB连接信息。
49+
50+
然后,真正开始写测试时,发现,要测试,还要在DB里准备数据:
51+
- 测查询,得事先插入一些数据吧,看查出来的结果和插入的数据是否一致
52+
- 测更新,得先插入数据,测试跑完,再看数据更新是否正确
53+
54+
咬咬牙准备了一堆数据,你开始困惑了:我在干什么?我不是要测试服务吗?做数据准备不是测试仓库的时候该做的事吗?
55+
56+
> 所以,你发现问题在哪了吗?
57+
58+
在你创建对象的那刻,问题就出现了。
59+
60+
# 分离的依赖
61+
当我们创建一个对象时,就必须要有个实现类,即DBArticleRepository。
62+
虽然ArticleService写得很干净,其他部分根本不依赖DBArticleRepository,只在构造器里依赖,但依赖就是依赖。
63+
64+
而且由于要构造DBArticleRepository,还引入了Connection类,该类只与DBArticleRepository的构造有关系,与ArticleService业务逻辑毫无关系。
65+
66+
只是因为引入一个具体实现,就需要把它周边全部东西引入,而这一切都与业务类本身的业务逻辑没一毛钱关系。
67+
这就像是,你原本打算买套房子,现在却让你必须了解怎么和水泥、砌墙、怎么装修、户型怎么设计、各个家具怎么组装,而你想要的只是一套能住的婚房。
68+
69+
实际项目,构建一个对象可能牵扯更多内容:
70+
- 根据不同的参数,创建不同的实现类对象,你可能需要用到工厂模式
71+
- 为了解方法执行时间,需要给被依赖的对象加上监控
72+
- 依赖的对象来自于某个框架,你自己都不知道具体的实现类咋样的
73+
......
74+
75+
即便是最简单的对象创建和组装,看起来也不是多简单。
76+
77+
直接构造存在这么多问题,最简单的就是把创建的过程拿出去,只留下与字段关联的过程:
78+
![](https://img-blog.csdnimg.cn/54155a57ccaa4ac098111b28812f7d27.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmF2YUVkZ2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)
79+
80+
这时的ArticleService就只依赖ArticleRepository。
81+
测试ArticleService也很简单,只要用一个对象模拟ArticleRepository的行为。通常这种模拟对象行为的工作用一个现成的程序库就可以完成,就是那些Mock框架。
82+
83+
之前的代码里,如果我用Mock框架模拟Connection类是不是也可以?
84+
理论上,是可以。但是想要让ArticleService的测试通过,就必须打开DBArticleRepository的实现,只有配合着其中的实现,才可能让ArticleService跑起来。显然,你跑偏了。
85+
86+
对象的创建已经分离了出去,但还是要要有一个地方完成这个工作,最简单的解决方案自然是,把所有的对象创建和组装在一个地方完成:
87+
![](https://img-blog.csdnimg.cn/67df925a361646a189e6d0dace96fbc7.png)
88+
相比业务逻辑,组装过程很简单,仅仅是个对象创建及传参。
89+
最好的解决方案就是有个框架。Java的这种组装一堆对象的东西一般被称为"容器"。
90+
![](https://img-blog.csdnimg.cn/001940d76418478f9240c6aa9870d89b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmF2YUVkZ2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)
91+
至此,一个容器就此诞生。它解决的是依赖问题,把被依赖的对象注入到目标对象,所以叫"依赖注入"(Dependency Injection,简称 DI)。这个容器就叫DI容器。
92+
93+
这种创建和组装对象的方式在当年引发了很大的讨论,直到最后Martin Fowler写了一篇《反转控制容器和依赖注入模式》,才算把大家的讨论做了一个总结,行业里总算达成共识。
94+
95+
> 说了这么多,和我们要讨论的"模型"有什么关系?
96+
97+
很多人习惯性把对象的创建和组装写到了一个类里,导致代码出现大量耦合。
98+
也导致项目很难测试,可测试性是衡量设计优劣的一个重要标准。
99+
100+
有了IoC容器后,你的代码就只剩下关联的代码,对象的创建和组装都由IoC容器完成。不经意间,还做到了面向接口编程,实现是可以替换的,且可测试。
101+
容器概念还能继续增强。比如,我们想给所有与数据库相关的代码加上时间监控,只要在容器构造对象时添加处理即可。这就是 AOP,而这些改动,对业务代码透明。
102+
但还是很多程序员即便用Spring,依然是自己构造对象,静态方法随便写。
103+
104+
# 总结
105+
理解模型,要知道项目提供了哪些模型,这些模型都提供了怎样的能力。
106+
更重要的是了解模型设计的渊源:
107+
- 可增进对它的了解
108+
- 也会减少我们对模型的破坏或滥用
109+
110+
IoC容器有效地解决了对象的创建和组装的问题,让程序员们拥有了一个新的编程模型。
111+
112+
按照这个编程模型去写代码,整体的质量会得到大幅度的提升,也会规避掉之前的许多问题。这也是一个好的模型对项目起到的促进作用。像DI这种设计得非常好的模型,你甚至不觉得自己在用一个特定的模型在编程。
113+
114+
**理解模型,要了解模型设计的来龙去脉。**
115+
![](https://img-blog.csdnimg.cn/b8a20a4382c442088e76f24996971e2d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmF2YUVkZ2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /