Skip to content

Commit 84e1254

Browse files
committed
done
1 parent 5252656 commit 84e1254

File tree

43 files changed

+14849
-487
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+14849
-487
lines changed

ReadMe.md

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -144,32 +144,67 @@
144144

145145
### Spring
146146

147-
* [Spring常见注解.md](docs/spring/Spring常见注解.md)
148147

148+
* [SpringAOP的概念与作用](docs/spring/Spring常见注解.md)
149+
* [SpringBean的定义与管理(核心)](docs/spring/Spring常见注解.md)
150+
* [Spring中对于数据库的访问](docs/spring/Spring常见注解.md)
151+
* [Spring中对于校验功能的支持](docs/spring/Spring常见注解.md)
152+
* [Spring中的Environment环境变量](docs/spring/Spring常见注解.md)
153+
* [Spring中的事件处理机制](docs/spring/Spring常见注解.md)
154+
* [Spring中的资源管理](docs/spring/Spring常见注解.md)
155+
* [Spring中的配置元数据(管理配置的基本数据)](docs/spring/Spring常见注解.md)
156+
* [Spring事务基本用法](docs/spring/Spring常见注解.md)
157+
* [Spring合集](docs/spring/Spring常见注解.md)
158+
* [Spring容器与IOC](docs/spring/Spring常见注解.md)
159+
* [Spring常见注解](docs/spring/Spring常见注解.md)
160+
* [Spring概述](docs/spring/Spring常见注解.md)
161+
* [第一个Spring应用](docs/spring/Spring常见注解.md)
162+
163+
* [Spring源码剖析:Spring概述](docs/spring/Spring源码分析/Spring源码剖析:Spring概述.md)
164+
* [Spring源码剖析:初探SpringIOC核心流程](docs/spring/Spring源码分析/Spring源码剖析:初探SpringIOC核心流程.md)
165+
* [Spring源码剖析:SpringIOC容器的加载过程 ](docs/spring/Spring源码分析/Spring源码剖析:SpringIOC容器的加载过程.md)
166+
* [Spring源码剖析:懒加载的单例Bean获取过程分析](docs/spring/Spring源码分析/Spring源码剖析:懒加载的单例Bean获取过程分析.md)
167+
* [Spring源码剖析:JDK和cglib动态代理原理详解 ](docs/spring/Spring源码分析/Spring源码剖析:JDK和cglib动态代理原理详解.md)
168+
* [Spring源码剖析:SpringAOP概述](docs/spring/Spring源码分析/Spring源码剖析:SpringAOP概述.md)
169+
* [Spring源码剖析:AOP实现原理详解 ](docs/spring/Spring源码分析/Spring源码剖析:AOP实现原理详解.md)
170+
* [Spring源码剖析:Spring事务概述](docs/spring/Spring源码分析/Spring源码剖析:Spring事务概述.md)
171+
* [Spring源码剖析:Spring事务源码剖析](docs/spring/Spring源码分析/Spring源码剖析:Spring事务源码剖析.md)
149172

173+
### SpringMVC
150174

151-
* [Spring源码剖析:Spring概述](docs/spring/Spring源码剖析:Spring概述.md)
152-
* [Spring源码剖析:初探SpringIOC核心流程](docs/spring/Spring源码剖析:初探SpringIOC核心流程.md)
153-
* [Spring源码剖析:SpringIOC容器的加载过程 ](docs/spring/Spring源码剖析:SpringIOC容器的加载过程.md)
154-
* [Spring源码剖析:懒加载的单例Bean获取过程分析](docs/spring/Spring源码剖析:懒加载的单例Bean获取过程分析.md)
155-
* [Spring源码剖析:JDK和cglib动态代理原理详解 ](docs/spring/Spring源码剖析:JDK和cglib动态代理原理详解.md)
156-
* [Spring源码剖析:SpringAOP概述](docs/spring/Spring源码剖析:SpringAOP概述.md)
157-
* [Spring源码剖析:AOP实现原理详解 ](docs/spring/Spring源码剖析:AOP实现原理详解.md)
158-
* [Spring源码剖析:Spring事务概述](docs/spring/Spring源码剖析:Spring事务概述.md)
159-
* [Spring源码剖析:Spring事务源码剖析](docs/spring/Spring源码剖析:Spring事务源码剖析.md)
175+
* [SpringMVC中的国际化功能](docs/spring/SpringMVC/SpringMVC中的国际化功能.md)
176+
* [SpringMVC中的异常处理器](docs/spring/SpringMVC/SpringMVC中的异常处理器.md)
177+
* [SpringMVC中的拦截器](docs/spring/SpringMVC/SpringMVC中的拦截器.md)
178+
* [SpringMVC中的视图解析器](docs/spring/SpringMVC/SpringMVC中的视图解析器.md)
179+
* [SpringMVC中的过滤器Filter](docs/spring/SpringMVC/SpringMVC中的过滤器Filter.md)
180+
* [SpringMVC基本介绍与快速入门](docs/spring/SpringMVC/SpringMVC基本介绍与快速入门.md)
181+
* [SpringMVC如何实现文件上传](docs/spring/SpringMVC/SpringMVC如何实现文件上传.md)
182+
* [SpringMVC中的常用功能](docs/spring/SpringMVC/SpringMVC中的常用功能.md)
160183

161-
### SpringMVC
162184

163-
* [SpringMVC源码分析:SpringMVC概述](docs/spring/springMVC/SpringMVC源码分析:SpringMVC概述.md)
164-
* [SpringMVC源码分析:SpringMVC设计理念与DispatcherServlet](docs/spring/springMVC/SpringMVC源码分析:SpringMVC设计理念与DispatcherServlet.md)
165-
* [SpringMVC源码分析:DispatcherServlet的初始化与请求转发 ](docs/spring/springMVC/SpringMVC源码分析:DispatcherServlet的初始化与请求转发.md)
166-
* [SpringMVC源码分析:DispatcherServlet如何找到正确的Controller ](docs/spring/springMVC/SpringMVC源码分析:DispatcherServlet如何找到正确的Controller.md)
167-
* [SpringMVC源码剖析:消息转换器HttpMessageConverter与@ResponseBody注解](docs/spring/springMVC/SpringMVC源码剖析:消息转换器HttpMessageConverter与@ResponseBody注解.md)
168-
* [SpringMVC源码分析:SpringMVC的视图解析原理 ](docs/spring/springMVC/SpringMVC源码分析:SpringMVC的视图解析原理.md)
185+
* [SpringMVC源码分析:SpringMVC概述](docs/spring/SpringMVC源码分析/SpringMVC源码分析:SpringMVC概述.md)
186+
* [SpringMVC源码分析:SpringMVC设计理念与DispatcherServlet](docs/spring/SpringMVC源码分析/SpringMVC源码分析:SpringMVC设计理念与DispatcherServlet.md)
187+
* [SpringMVC源码分析:DispatcherServlet的初始化与请求转发 ](docs/spring/SpringMVC源码分析/SpringMVC源码分析:DispatcherServlet的初始化与请求转发.md)
188+
* [SpringMVC源码分析:DispatcherServlet如何找到正确的Controller ](docs/spring/SpringMVC源码分析/SpringMVC源码分析:DispatcherServlet如何找到正确的Controller.md)
189+
* [SpringMVC源码剖析:消息转换器HttpMessageConverter与@ResponseBody注解](docs/spring/SpringMVC/SpringMVC源码剖析:消息转换器HttpMessageConverter与@ResponseBody注解.md)
190+
* [SpringMVC源码分析:SpringMVC的视图解析原理 ](docs/spring/SpringMVC源码分析/SpringMVC源码分析:SpringMVC的视图解析原理.md)
169191

170192
### SpringBoot
171193

172194
* [SpringBoot系列:SpringBoot的前世今生](docs/spring/SpringBoot/SpringBoot的前世今生.md)
195+
* [给你一份SpringBoot知识清单.md](docs/spring/SpringBoot/给你一份SpringBoot知识清单.md)
196+
* [Spring常见注解使用指南(包含Spring+SpringMVC+SpringBoot)](docs/spring/SpringBoot/Spring常见注解使用指南(包含Spring+SpringMVC+SpringBoot).md)
197+
* [SpringBoot中的日志管理](docs/spring/SpringBoot/SpringBoot中的日志管理.md)
198+
* [SpringBoot常见注解](docs/spring/SpringBoot/SpringBoot常见注解.md)
199+
* [SpringBoot应用也可以部署到外部Tomcat](docs/spring/SpringBoot/SpringBoot应用也可以部署到外部Tomcat.md)
200+
* [SpringBoot生产环境工具Actuator](docs/spring/SpringBoot/SpringBoot生产环境工具Actuator.md)
201+
* [SpringBoot的Starter机制](docs/spring/SpringBoot/SpringBoot的Starter机制.md)
202+
* [SpringBoot的前世今生](docs/spring/SpringBoot/SpringBoot的前世今生.md)
203+
* [SpringBoot的基本使用](docs/spring/SpringBoot/SpringBoot的基本使用.md)
204+
* [SpringBoot的配置文件管理](docs/spring/SpringBoot/SpringBoot的配置文件管理.md)
205+
* [SpringBoot自带的热部署工具](docs/spring/SpringBoot/SpringBoot自带的热部署工具.md)
206+
* [SpringBoot中的任务调度与@Async](docs/spring/SpringBoot/SpringBoot中的任务调度与@Async.md)
207+
* [基于SpringBoot中的开源监控工具SpringBootAdmin](docs/spring/SpringBoot/基于SpringBoot中的开源监控工具SpringBootAdmin.md)
173208

174209
### SpringCloud
175210

docs/spring/SpringBean的定义与管理(核心).md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,11 @@ Bean
133133

134134
容器中一旦注册了Bean后处理器,Bean后处理器就会自动启动,在容器中每个Bean创建时自动工作,Bean后处理器两个方法的回调时机如下图:
135135

136-
![bean-post-process](https://www.runoob.com/wp-content/uploads/2015/07/e8970a58f831cd7613b680ef0541e7c7.jpg)
136+
![bean-post-process](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/e8970a58f831cd7613b680ef0541e7c7.jpg)
137137

138138
注意一点,如果使用`BeanFactory`作为Spring容器,则必须手动注册Bean后处理器,程序必须获取Bean后处理器实例,然后手动注册。
139139

140-
BeanPostProcessor bp = (BeanPostProcessor)beanFactory.getBean("bp"); beanFactory.addBeanPostProcessor(bp); Person p = (Person)beanFactory.getBean("person");
140+
BeanPostProcessor bp = (BeanPostProcessor)beanFactory.getBean("bp"); beanFactory.addBeanPostProcessor(bp); Person p = (Person)beanFactory.getBean("person");
141141

142142
### 容器后处理器
143143

@@ -158,7 +158,7 @@ Spring
158158

159159
在Spring配置文件中做如下配置,指定自动扫描的包:
160160

161-
<context:component-scan base-package="edu.shu.spring.domain"/>
161+
<context:component-scan base-package="edu.shu.spring.domain"/>
162162

163163
### 使用@Resource配置依赖
164164

@@ -174,6 +174,7 @@ Spring
174174
Spring提供了`@Autowired`注解来指定自动装配,`@Autowired`可以修饰setter方法、普通方法、实例变量和构造器等。当使用`@Autowired`标注setter方法时,默认采用byType自动装配策略。在这种策略下,符合自动装配类型的候选Bean实例常常有多个,这个时候就可能引起异常,为了实现精确的自动装配,Spring提供了`@Qualifier`注解,通过使用`@Qualifier`,允许根据Bean的id来执行自动装配。
175175

176176
# 参考文章
177+
177178
https://www.w3cschool.cn/wkspring
178179
https://www.runoob.com/w3cnote/basic-knowledge-summary-of-spring.html
179180
http://codepub.cn/2015/06/21/Basic-knowledge-summary-of-Spring
Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
2+
3+
<header>
4+
5+
# Spring Boot调度
6+
7+
以下内容仅是站长或网友个人学习笔记、总结和研究收藏。不保证正确性,因使用而带来的风险与本站无关!
8+
9+
</header>
10+
11+
12+
13+
<script>( adsbygoogle = window.adsbygoogle || []).push({});</script>
14+
15+
16+
17+
调度是执行特定时间段的任务的过程。Spring Boot为在Spring应用程序上编写调度程序提供了很好的支持。
18+
19+
## Java Cron表达式
20+
21+
Java Cron表达式用于配置CronTrigger的实例,它是`org.quartz.Trigger`的子类。 有关Java cron表达式的更多信息,请参阅此链接 -
22+
23+
* [https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.html](https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.html)
24+
25+
`[@EnableScheduling](https://github.com/EnableScheduling "@EnableScheduling")`注解用于为应用程序启用调度程序。将此批注添加到主Spring Boot应用程序类文件中。
26+
27+
```
28+
@SpringBootApplication
29+
@EnableScheduling
30+
31+
public class DemoApplication {
32+
public static void main(String[] args) {
33+
SpringApplication.run(DemoApplication.class, args);
34+
}
35+
}
36+
37+
```
38+
39+
`[@Scheduled](https://github.com/Scheduled "@Scheduled")`注解用于在特定时间段内触发调度程序。
40+
41+
```
42+
@Scheduled(cron = "0 * 9 * * ?")
43+
public void cronJobSch() throws Exception {
44+
}
45+
46+
```
47+
48+
以下是一个示例代码,演示如何在每天上午9:00开始到每天上午9:59结束执行任务。
49+
50+
```
51+
package com.yiibai.demo.scheduler;
52+
53+
import java.text.SimpleDateFormat;
54+
import java.util.Date;
55+
import org.springframework.scheduling.annotation.Scheduled;
56+
import org.springframework.stereotype.Component;
57+
58+
@Component
59+
public class Scheduler {
60+
@Scheduled(cron = "0 * 9 * * ?")
61+
public void cronJobSch() {
62+
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
63+
Date now = new Date();
64+
String strDate = sdf.format(now);
65+
System.out.println("Java cron job expression:: " + strDate);
66+
}
67+
}
68+
69+
```
70+
71+
以下屏幕截图显示了应用程序如何在`09:03:23`启动,并且从那时起每隔一分钟执行一次cron作业调度程序任务。
72+
73+
![](/uploads/images/2018/10/05/103218_77311.jpg)
74+
75+
## 固定速率
76+
77+
固定速率调度程序用于在特定时间执行任务。它不等待前一个任务的完成。 值是以毫秒为单位。 示例代码显示在此处 -
78+
79+
```
80+
@Scheduled(fixedRate = 1000)
81+
public void fixedRateSch() {
82+
}
83+
84+
```
85+
86+
此处显示了应用程序启动时每秒执行任务的示例代码 -
87+
88+
```
89+
package com.yiibai.demo.scheduler;
90+
91+
import java.text.SimpleDateFormat;
92+
import java.util.Date;
93+
import org.springframework.scheduling.annotation.Scheduled;
94+
import org.springframework.stereotype.Component;
95+
96+
@Component
97+
public class Scheduler {
98+
@Scheduled(fixedRate = 1000)
99+
public void fixedRateSch() {
100+
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
101+
102+
Date now = new Date();
103+
String strDate = sdf.format(now);
104+
System.out.println("Fixed Rate scheduler:: " + strDate);
105+
}
106+
}
107+
108+
```
109+
110+
请注意以下屏幕截图,其中显示了在`09:12:00`启动的应用程序,之后每隔一个固定速率调度程序执行任务。
111+
112+
![](/uploads/images/2018/10/05/103355_72877.jpg)
113+
114+
## 固定延迟
115+
116+
固定延迟调度程序用于在特定时间执行任务。 它应该等待上一个任务完成。 值应以毫秒为单位。 此处显示示例代码 -
117+
118+
```
119+
@Scheduled(fixedDelay = 1000, initialDelay = 1000)
120+
public void fixedDelaySch() {
121+
}
122+
123+
```
124+
125+
这里,`initialDelay`是在初始延迟值之后第一次执行任务的时间。
126+
127+
从应用程序启动完成`3`秒后每秒执行一次任务的示例如下所示 -
128+
129+
```
130+
package com.yiibai.demo.scheduler;
131+
132+
import java.text.SimpleDateFormat;
133+
import java.util.Date;
134+
import org.springframework.scheduling.annotation.Scheduled;
135+
import org.springframework.stereotype.Component;
136+
137+
@Component
138+
public class Scheduler {
139+
@Scheduled(fixedDelay = 1000, initialDelay = 3000)
140+
public void fixedDelaySch() {
141+
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
142+
Date now = new Date();
143+
String strDate = sdf.format(now);
144+
System.out.println("Fixed Delay scheduler:: " + strDate);
145+
}
146+
}
147+
148+
```
149+
150+
执行上面代码后,它会显示在`09:18:39`开始的应用程序,每`3`秒后,固定延迟计划程序任务(每秒执行一次)。
151+
152+
153+
154+
155+
156+
//更多请阅读:https://www.yiibai.com/spring-boot/spring_boot_scheduling.html
157+
158+
@EnableAsync 注解
159+
要使用 @Async,首先需要使用 @EnableAsync 注解开启 Spring Boot 中的异步特性。
160+
161+
@Configuration
162+
@EnableAsync
163+
public class AppConfig {
164+
}
165+
更详细的配置说明,可以参考:AsyncConfigurer(opens new window)
166+
167+
#@Async 注解
168+
#支持的用法
169+
(1)无入参无返回值方法
170+
171+
您可以用 @Async 注解修饰方法,这表明这个方法是异步方式调用。换句话说,程序在调用此方法时会立即返回,而方法的实际执行发生在已提交给 Spring TaskExecutor 的任务中。在最简单的情况下,您可以将注解应用于返回 void 的方法,如以下示例所示:
172+
173+
@Async
174+
void doSomething() {
175+
// this will be executed asynchronously
176+
}
177+
(2)有入参无返回值方法
178+
179+
与使用 @Scheduled 注释注释的方法不同,这些方法可以指定参数,因为它们在运行时由调用者以“正常”方式调用,而不是由容器管理的调度任务调用。例如,以下代码是 @Async 注解的合法应用:
180+
181+
@Async
182+
void doSomething(String s) {
183+
// this will be executed asynchronously
184+
}
185+
(3)有入参有返回值方法
186+
187+
甚至可以异步调用返回值的方法。但是,这些方法需要具有 Future 类型的返回值。这仍然提供了异步执行的好处,以便调用者可以在调用 Future 上的 get() 之前执行其他任务。以下示例显示如何在返回值的方法上使用@Async
188+
189+
@Async
190+
Future<String> returnSomething(int i) {
191+
// this will be executed asynchronously
192+
}
193+
#不支持的用法
194+
@Async 不能与生命周期回调一起使用,例如 @PostConstruct
195+
196+
要异步初始化 Spring bean,必须使用单独的初始化 Spring bean,然后在目标上调用 @Async 带注释的方法,如以下示例所示:
197+
198+
public class SampleBeanImpl implements SampleBean {
199+
200+
@Async
201+
void doSomething() {
202+
// ...
203+
}
204+
205+
}
206+
207+
public class SampleBeanInitializer {
208+
209+
private final SampleBean bean;
210+
211+
public SampleBeanInitializer(SampleBean bean) {
212+
this.bean = bean;
213+
}
214+
215+
@PostConstruct
216+
public void initialize() {
217+
bean.doSomething();
218+
}
219+
220+
}
221+
#明确指定执行器
222+
默认情况下,在方法上指定 @Async 时,使用的执行器是在启用异步支持时配置的执行器,即如果使用 XML 或 AsyncConfigurer 实现(如果有),则为 annotation-driven 元素。但是,如果需要指示在执行给定方法时应使用默认值以外的执行器,则可以使用 @Async 注解的 value 属性。以下示例显示了如何执行此操作:
223+
224+
@Async("otherExecutor")
225+
void doSomething(String s) {
226+
// this will be executed asynchronously by "otherExecutor"
227+
}
228+
在这种情况下,“otherExecutor”可以是 Spring 容器中任何 Executor bean 的名称,也可以是与任何 Executor 关联的限定符的名称(例如,使用 <qualifier> 元素或 Spring 的 @Qualifier 注释指定) )。
229+
230+
#管理 @Async 的异常
231+
@Async 方法的返回值类型为 Future 型时,很容易管理在方法执行期间抛出的异常,因为在调用 get 结果时会抛出此异常。但是,对于返回值类型为 void 型的方法,异常不会被捕获且无法传输。您可以提供 AsyncUncaughtExceptionHandler 来处理此类异常。以下示例显示了如何执行此操作:
232+
233+
public class MyAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler {
234+
235+
@Override
236+
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
237+
// handle exception
238+
}
239+
}
240+
默认情况下,仅记录异常。您可以使用 AsyncConfigurer 或 <task:annotation-driven /> XML 元素定义自定义 AsyncUncaughtExceptionHandler。

0 commit comments

Comments
 (0)