3.整合Web开发
3.1 aop
- 添加pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 编写aop切面
@Component
@Aspect
public class LogComponent {
@Pointcut("execution(* org.javaboy.aop.service.*.*(..))")
public void pc1() {
}
@Before(value = "pc1()")
public void before(JoinPoint jp) {
String name = jp.getSignature().getName();
System.out.println("before--" + name);
}
@After(value = "pc1()")
public void after(JoinPoint jp) {
String name = jp.getSignature().getName();
System.out.println("after--" + name);
}
@AfterReturning(value = "pc1()", returning = "result")
public void afterReturning(JoinPoint jp, Object result) {
String name = jp.getSignature().getName();
System.out.println("afterReturning----" + name + "-----" + result);
}
@AfterThrowing(value = "pc1()",throwing = "e")
public void afterThrowing(JoinPoint jp,Exception e) {
String name = jp.getSignature().getName();
System.out.println("afterThrowing---"+name+"----"+e.getMessage());
}
//这个方法的返回值会覆盖切点方法的返回值
@Around("pc1()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object proceed = pjp.proceed();
return "www.javaboy.org";
}
}
- 编写测试service和controller
@Service
public class UserService {
public String getUsernameById(Integer id) {
System.out.println("getUsernameById");
return "javaboy";
}
public void deleteUserById(Integer id) {
System.out.println("deleteUserById");
}
}
@RestController
public class UserController {
@Autowired
UserService userService;
@GetMapping("/test1")
public String getUsernameById(Integer id) {
return userService.getUsernameById(id);
}
@GetMapping("/test2")
public void deleteUserById(Integer id) {
userService.deleteUserById(id);
}
}
- 运行结果及代码结构截图
3.2 ApplicationRunner
- 编写启动类
@Component
@Order(99)
public class MyApplicationRunner01 implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
String[] sourceArgs = args.getSourceArgs();//获取启动的所有参数
System.out.println("sourceArgs:" + Arrays.toString(sourceArgs));
List<String> nonOptionArgs = args.getNonOptionArgs();
System.out.println("nonOptionArgs:" + nonOptionArgs);
Set<String> optionNames = args.getOptionNames();
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>");
for (String optionName : optionNames) {
System.out.println(optionName + ":" + args.getOptionValues(optionName));
}
System.out.println(">>>>>>>>>>>>>>>MyApplicationRunner01结束>>>>>>>>>>>>>>>>");
}
}
- 启动参数配置
3.运行结果及分析
@Order
值越小,对应的ApplicationRunner越先执行
3.3 CommandLineRunner
与ApplicationRunner类似
1.用法
@Component
@Order(98)
public class MyCommandLineRunner2 implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("MyCommandLineRunner2>>>"+Arrays.toString(args));
}
}
2.示例
3.运行结果及分析
@Order
值越小,对应的CommandLineRunner越先执行
可以在springboot启动后根据参数做一些自定义的任务,如执行sql等
3.4 ControllerAdvice
1.问题背景
假设一个post表单要提交两个对应实体(Author,Book)的字段,如果这两个实体(Author,Book)具有相同的字段名称name,那么contoller如何识别name字段是属于哪个实体?
Book实体类
public class Book {
private String name;
private Double price;
}
Author实体类
public class Author {
private String name;
private Integer age;
2.ControllerAdvice的配置
@ControllerAdvice
public class GlobalData {
@ModelAttribute(value = "info")
public Map<String,Object> mydata() {
Map<String, Object> map = new HashMap<>();
map.put("name", "javaboy");
map.put("address", "www.javaboy.org");
return map;
}
@InitBinder("a")
public void initA(WebDataBinder binder) {
binder.setFieldDefaultPrefix(