Springboot之3.整合Web开发

3.整合Web开发

3.1 aop

  1. 添加pom依赖
 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 编写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";
    }
}

  1. 编写测试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);
    }
}

  1. 运行结果及代码结构截图
    在这里插入图片描述

3.2 ApplicationRunner

  1. 编写启动类
@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结束>>>>>>>>>>>>>>>>");
    }
}
  1. 启动参数配置
    在这里插入图片描述

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(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值