(Spring框架总结)Java学习路线(漫漫人生路,步步架构梦)Java Learning Path (Long Life Path, Step by step Structure Dream)

前言

本篇博客主要分享springboot相关技术,通过编写也巩固自己的理解O(∩_∩)O哈哈~

SSH、SSM、Springboot

SSH:

  • S:Struts,一款MVC框架,负责接收请求和响应。
  • H:Hibernate,一款ORM框架,负责对象关系映射,实现Java对象和数据库表的映射。
  • Spring:Spring框架,负责业务逻辑层,降低Java EE的复杂度。
    SSM:
  • S:Spring,业务逻辑层框架
  • S:Spring MVC,web层框架
  • M:Mybatis,ORM框架,实现Java对象和数据库表的映射。
    Springboot:
  • Spring的子项目,用于快速开发Spring应用
  • 其主要目标是开发人员能够“just run”以快速开发和部署Spring应用程序
  • 约定大于配置,提供了自动配置和起步依赖等功能,可以大大减少Spring应用的开发及部署难度,让我们迅速启动相关的Spring项目
    总的来说:
  • SSH是比较传统的Java EE框架组合
  • SSM是SSH的升级,使用Spring MVC替换Struts,Mybatis替换Hibernate
  • Spring Boot是SSM的升级,让Spring应用开发更快速、简单,提供了多种默认配置和启动器,让我们能够以更简洁的方式使用Spring生态。

    Spring AOP基础知识总结

    Spring AOP(Aspect Oriented Programming)面向切面编程,可以实现日志记录、性能监控、安全检查、事务处理等功能。
    AOP的主要概念:

  • Aspect(切面):一个关注点的模块化,它将横切关注点从业务逻辑中分离出来。在Spring AOP中,切面可以使用 Advisor 或切面类来配置。
  • Joinpoint(连接点):应用程序中某个精确的点,在这个点上可以插入AOP代码。在Spring AOP中,一个连接点始终代表一个方法的执行。
  • Advice(通知):在某个连接点上执行的动作。包括“around”、“before”、“after returning”、“after throwing”和“after”(finally)通知。
  • Pointcut(切入点):一组表达式,指示应该在哪些连接点使用通知。
  • Target(目标对象):包含连接点的对象。AOP代理通常包装目标对象,以提供增强后的行为。
  • AOP proxy(AOP代理):AOP框架创建的对象,它包含目标对象的对象,并在连接点处提供通知的中间对象。
    Spring AOP实现步骤:

    1. 定义切面类和通知方法
    2. 在Spring配置文件中定义AOP
    3. 使用@Aspect注解将普通类定义为切面类
    4. 在切面类中使用@Pointcut定义切入点,使用通知注解(@Before、@After等)定义通知
    5. enableAspectJAutoProxy(true)开启AspectJ自动代理支持
    6. 声明自动代理Bean
      AOP的主要应用场景是事务管理、日志管理、权限控制等。

      Spring常用注解

      Spring常用注解有:
      @Autowired:自动装配Bean,按类型注入。
      @Qualifier:当有多个同类型Bean时,通过名称进行注入,与@Autowired一起使用。
      @Resource:相当于@Autowired+@Qualifier,按名称进行注入。
      @Configuration:标注当前类是一个配置类,等同于XML配置文件。
      @ComponentScan:自动扫描并加载符合条件的组件(类)。
      @Bean:注册一个Bean,相当于XML中的
      @Scope:设置Bean的作用范围。
      @Lazy:延迟初始化Bean。
      @DependsOn:定义Bean初始化及销毁时的顺序。
      @Primary:自动装配时优先选择的Bean。
      @Value:注入外部配置文件中的属性值。
      @PropertySource:指定外部配置文件,与@Value一起使用。
      @Override:重写父类方法。
      @PostConstruct:初始化方法,在Bean创建时调用。
      @PreDestroy:销毁方法,在Bean销毁前调用。
      @Controller:标注控制器类。
      @Service:标注服务类。
      @Repository:标注DAO类。
      @RequestMapping:配置URL路径映射。
      @ResponseBody:返回值直接序列化到HTTP响应流中。
      @RequestBody:将HTTP请求内容反序列化到方法入参中。
      @RestController:将@Controller和@ResponseBody合二为一的注解。
      @PathVariable:获取URL中的动态参数。
      @RequestParam:获取URL中的查询参数。
      @Transactional:配置事务,支持只读、回滚等控制。

      浅谈Spring事件机制

      Spring事件机制是Spring提供的一种消息发布-订阅模型的实现。它基于观察者模式设计。
      关键组成:

  • 事件(Event):事件对象,包含事件源、事件消息等信息。
  • 事件发布者(Event Publisher):发布事件的对象。
  • 事件侦听器(Event Listener):监听事件并作出响应的对象。
  • 事件广播器(ApplicationEventMulticaster):事件发布者发布事件,将事件派发给感兴趣的侦听器。
    工作流程:

    1. 事件发布者发布一个事件,调用ApplicationContext的publishEvent方法。
    2. Spring的事件广播器接收到事件,会去注册的侦听器列表中找到符合事件类型的侦听器。
    3. 找到的侦听器会顺序执行,完成对事件的响应操作。
    4. 如果事件与任何侦听器都不匹配,那么该事件将被丢弃。
      实现步骤:
    5. 定义事件类继承ApplicationEvent
    6. 定义事件侦听器实现ApplicationListener接口
    7. 将事件侦听器注册到Spring的ApplicationContext中
    8. 发布事件,调用ApplicationContext的publishEvent方法
      示例:

      //事件类
      public class MyEvent extends ApplicationEvent {
      public MyEvent(Object source) {
      super(source);
      }
      }
      //事件侦听器
      public class MyEventListener implements ApplicationListener<MyEvent> {
      public void onApplicationEvent(MyEvent event) {
      //对事件作出响应
      } 
      }
      //发布事件
      applicationContext.publishEvent(new MyEvent(this));

      Spring事件机制的主要用途是解耦事件发布者和接收者,让它们不需要显式地相互调用,这遵循了Publisher-Subscriber设计模式。

      Spring JdbcTemplate简介

      Spring JdbcTemplate是Spring框架中提供的一个对象,是对原始JDBC API的简单封装。它简化了JDBC开发,可以更容易的实现对数据库的操作。
      主要功能:

  • 实现了数据源DataSource的注入,屏蔽了DataSource的选择细节。
  • 简化了异常处理,可以通过Spring的异常层次结构避免捕获的异常。
  • 提供了操作常见数据库对象的方法,如执行DDL和DML语句、执行存储过程、查询和更新等。
  • 支持模板方法模式,可以在实现中编写自己的SQL语句。
  • 支持BeanPropertyRowMapper,可以将查询结果自动映射到JavaBean中。
    使用JdbcTemplate的好处:
  • 不需要显式关闭ResultSet、Statement和Connection。
  • 不需要检查SQLExecption的具体子类,转换异常信息等,都由JdbcTemplate自动完成。
  • 数据库访问代码可以重复使用,没有和具体的数据库相关的代码。如果需要切换数据库,只需要修改配置文件,不需要修改代码。
    示例:

    // 获取 JdbcTemplate 对象
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
    // 查询
    List<Person> persons = jdbcTemplate.query("select * from person", 
    new BeanPropertyRowMapper<>(Person.class));
    // 添加
    jdbcTemplate.update("insert into person(name, age) values(?, ?)", 
    "张三", 23);
    // 修改  
    jdbcTemplate.update("update person set name = ? where id = ?", 
    "李四", 5);
    // 删除
    jdbcTemplate.update("delete from person where id = ?", 10);

    总之,Spring JdbcTemplate封装了JDBC操作,使数据库交互变得更加方便和优雅,是我们开发数据访问层时的首选。

    SpringMVC中put和post如何选择

    在SpringMVC中,put和post请求都可以用来进行新增或更新操作。那么在开发中,应该怎么选择使用put还是post呢?
    总体来说,遵循以下原则:

    • 用PUT更新一个资源。
    • 用POST创建一个新资源。
      更详细的区分如下:
    • PUT:
  • 更新资源的全部或大部分内容。
  • 资源有一个确定的ID,并且使用该ID访问资源。
  • 操作是幂等的,多次执行得到相同结果。
  • 返回200(OK)和404(NOT FOUND)状态码。
    • POST:
  • 创建一个新的资源。
  • 资源ID未知,由服务器分配。
  • 操作不是幂等的,多次执行会产生新资源。
  • 返回201(CREATED)状态码。
    接下来举例说明使用场景:

    • 更新学生信息:应使用PUT,因为有确定的ID,并更新全部数据。
      PUT /students/123
      {
      "name": "张三",
      "age": 30
      }
    • 添加新学生:应使用POST,因为生成了一个新的资源,并且由服务器分配ID。
      POST /students
      {
      "name": "李四",
      "age": 20
      }
    • 删除学生:应使用DELETE方法。
      DELETE /students/123

      另外,如果资源ID未知,但需要更新大部分数据,也可以选择使用PUT,由服务端生成ID后再返回给客户端。
      所以总结起来,如果操作是幂等的可以使用PUT,如果是创建新资源应使用POST。但也不是绝对的,还是需要根据具体业务场景来判断。

      @RequestParam、@ModelAttribute、@RequestBody的区别

      这三个注解都是用来获取请求参数的,但有些区别:
      @RequestParam:

    • 用在控制器方法的形参上,可以绑定URL中的查询字符串参数。
    • 例如:请求URL是/user?name=张三,可以使用@RequestParam("name") String username绑定参数。
    • 主要用于获取URL中的查询字符串参数。
      @ModelAttribute:
    • 用于绑定键值对形式的数据到JavaBean中。
    • 可以来自请求参数,也可以来自URL中的路径变量。
    • 经常用于绑定对象类型的请求参数。
    • 例如:请求URL是/user/12345,可以使用@ModelAttribute("user") User user绑定到pathVariable中。
      @RequestBody:
    • 主要用来获取请求体内容,比如POST请求的请求体,或者PUT请求的请求体。
    • 需要使用注解@RequestMapping(method = RequestMethod.POST)等才可以获取请求体。
    • 绑定后的对象中包含请求体传递的所有参数。
    • 例如:
      @RequestMapping(value = "/user", method = RequestMethod.POST)
      public void save(@RequestBody User user) {
      // user对象中的属性对应请求体中的参数
      }

      区别总结:

    • @RequestParam用于获取URL中的参数,主要用于GET请求。
    • @ModelAttribute可以获取URL中的变量,也可以获取请求参数,实际上会先去找URL变量,找不到再找请求参数。
    • @RequestBody一般用于获取复杂对象类型的POST请求体内容。
      所以一般来说:
    • 如果是获取简单类型的查询参数,使用@RequestParam。
    • 如果要绑定对象类型的参数,或者URL中的变量,使用@ModelAttribute。
    • 如果要获取POST请求体内容,使用@RequestBody。
      三个注解可以根据需要混合使用,区分开来可以更清晰的表示参数的来源,这是比较推荐的用法。

      ControllerAdvice的常用场景

      ControllerAdvice是Spring MVC的一个注解,用于定义全局的异常处理、数据绑定、数据预处理等方法。
      常见的用法场景有:

      1. 全局异常处理
        通过@ExceptionHandler可以定义方法来处理指定的异常。例如:

        @ControllerAdvice
        public class GlobalExceptionHandler {
        @ExceptionHandler( ArithmeticException.class )
        public String handleArithmeticException( Exception e ) {
        // 处理算术异常
        }
        }

        这样的话,当controller中抛出ArithmeticException时,会被GlobalExceptionHandler中定义的方法处理,而不会被Spring的默认异常处理器处理。

      2. 数据绑定验证
        当提交表单时,可以在@InitBinder方法中统一定义数据绑定的参数规则:

        @ControllerAdvice
        public class GlobalDataBinder {
        @InitBinder
        protected void initBinder(WebDataBinder binder) {
        binder.setRequiredFields("name");
        }
        }

        这样,在所有controller中,name属性都会被设置为required,需要校验其不能为空。

      3. 处理模型数据
        可以通过@ModelAttribute在控制器方法执行前预处理数据:

        @ControllerAdvice
        public class GlobalDataBinder {
        @ModelAttribute
        public void populateModel(Model model) {
        model.addAttribute("attr1", "value1");
        }
        }

        这样,在所有controller中,模型中都会预先包含attr1=value1这个属性。

      4. 数据预处理
        在@ControllerAdvice中通过@Value注解可以将配置文件中读取的值设定为全局的:

        @ControllerAdvice
        public class GlobalDataBinder {
        @Value("${book.name}")
        private String bookName;
        // 可以在任意controller中使用bookName
        }

        总之,@ControllerAdvice注解可以实现在所有Controller中共享的功能,从而简化代码,提高开发效率。

(Spring框架总结)Java学习路线(漫漫人生路,步步架构梦)Java Learning Path (Long Life Path, Step by step Structure Dream)

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

滚动到顶部