CompletableFuture基本用法

对比

  • Future:我们的目的都是获取异步任务的结果,但是对于Future来说,只能通过get方法或者死循环判断isDone来获取。异常情况就更是难办。
  • CompletableFuture:只要我们设置好回调函数即可实现:
  1. 只要任务完成,即执行我们设置的函数(不用再去考虑什么时候任务完成)
  2. 如果发生异常,同样会执行我们处理异常的函数,甚至连默认返回值都有(异常情况处理更加省力)
  3. 如果有复杂任务,比如依赖问题,组合问题等,同样可以写好处理函数来处理(能应付复杂任务的处理)
阅读更多

ConfigurationProperties

在 Spring Boot 项目中,我们将大量的参数配置在 application.properties 或 application.yml 文件中,通过 @ConfigurationProperties 注解,我们可以方便的获取这些参数值

阅读更多

java 多态 Polymorphic

简述

多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。
多态的特性就是,运行期才能动态决定调用的子类方法。对某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。用白话来说,就是多个对象调用同一个方法,得到不同的结果。

多态的语法格式

父类类名 引用名称 = new 子类类名();

当是多态时,该引用名称只能访问父类中的属性和方法,但是访问的时候,会优先访问子类重写以后的方法。

阅读更多

java 泛型 Generics

简述

泛型就是定义一种模板,例如ArrayList,然后在代码中为用到的类创建对应的ArrayList<类型>:

1
2
3
4
5
6
7
public class ArrayList<T> {
private T[] array;
private int size;
public void add(T e) {...}
public void remove(int index) {...}
public T get(int index) {...}
}

T可以是任何class。这样一来,我们就实现了:编写一次模版,可以创建任意类型的ArrayList:

阅读更多

读取txt文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ReadFileByLines {
public static void main(String[] args) {
try {
//1.打开一个file
File file = new File("E:/test.txt");
//2.InputStreamReader<-FileInputStream<-file
FileInputStream fis = new FileInputStream(file);
InputStreamReader is = new InputStreamReader(fis);
//3.用BufferedReader(<-InputStreamReader)的readLine()方法读取
BufferedReader br = new BufferedReader(is);

//4.输出
String txtLine = null;
while ((txtLine = br.readLine()) != null) {
System.out.println(txtLine);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ReadFileByLines {
public static void main(String[] args) {
try {

File file = new File("E:/test.txt");

BufferedReader br = new BufferedReader(new FileReader(file));

String txtLine = null;
while ((txtLine = br.readLine()) != null) {
System.out.println(txtLine);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

bind header to controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

import javax.servlet.http.HttpServletRequest;

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import lombok.extern.slf4j.Slf4j;
import summer.webserver.util.SummerUtils;

@Slf4j
public class SummerArgumentResolver implements HandlerMethodArgumentResolver {

public SummerArgumentResolver() {
super();
}

@Override
public boolean supportsParameter(MethodParameter parameter) {
return SummerHeader.class.isAssignableFrom(parameter.getParameterType());
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
return SummerUtils.getSummerHeader(webRequest.getNativeRequest(HttpServletRequest.class));
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

@Slf4j
public class SummerUtils {
public static SummerHeader getSummerHeader(HttpServletRequest request) {
User user = (User)request.getAttribute("user");
String userName = Objects.isNull(user) ? request.getHeader(USER_NAME) : user.getUserName();
String userId = Objects.isNull(user) ? request.getHeader(USER_ID) : user.getUserId();
SummerHeader summerHeader = SummerHeader.builder()
.userName(userName)
.userId(userId)
.build();

if (log.isDebugEnabled()) {
log.debug(summerHeader.toString());
}
request.setAttribute("summerHeader", summerHeader);
return summerHeader;
}
}

usage

1
2
3
4
5
6
7
8
9
10
11
12
13
14

@Api(tags = "User")
@RestController()
@RequestMapping(ROOT_DOMAIN + "/users")
@Slf4j
public class UserController {
@ApiOperation(value = "delete user")
@DeleteMapping("/{user-id}")
@ResponseStatus(HttpStatus.OK)
public void deleteUser(SummerHeader summerHeader,
@ApiParam(required = true) @Length(max = 10) @PathVariable(value = "user-id") String userId) {
userMapper.deleteById(userId);
}
}

some parameters that only one is not null valid

注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Documented
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomValid {

}

@Documented
@Constraint(validatedBy = OnlyOneNotNullValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface OnlyOneNotNull {

String message() default "only one filed should not be null";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

String[] fieldNames();

}
阅读更多

时间格式 注解 验证

EnumValid.java

1
2
3
4
5
6
7
8
9
10
11
12
13

@Constraint(validatedBy = DateFormatValidator.class)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DateFormat {
String message() default "";

String pattern() default "yyyy-MM-dd HH:mm:ss";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};
}
阅读更多