• JSD-2204-跨域问题-总结Spring框架-Day08


    1.前后端分离的跨域访问

    在前后端分离的开发模式下,如果前端(客户端)和后端(服务器端)并不是同一台主机或同一个IP地址,在默认情况下,是不允许跨域访问的(错误提示关键字为:CORS),需要在后端项目中添加以下配置类:

    1. package cn.tedu.csmall.product.config;
    2. import org.springframework.context.annotation.Configuration;
    3. import org.springframework.web.servlet.config.annotation.CorsRegistry;
    4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    5. /**
    6. * Spring MVC的配置类
    7. *
    8. * @author java@tedu.cn
    9. * @version 0.0.1
    10. */
    11. @Configuration
    12. public class WebMvcConfiguration implements WebMvcConfigurer {
    13. @Override
    14. public void addCorsMappings(CorsRegistry registry) {
    15. registry.addMapping("/**")
    16. .allowedOriginPatterns("*")
    17. .allowedMethods("*")
    18. .allowedHeaders("*")
    19. .allowCredentials(true)
    20. .maxAge(3600);
    21. }
    22. }

    1.2关于Spring MVC中的@RequestBody

    当服务器端接收来自客户的请求参数时,客户端的请求参数可以是以下2种格式:

    • JSON格式,例如:

        1. {
        2. "description": "小米80的相册的简介",
        3. "name": "小米80的相册",
        4. "sort": 88
        5. }
    • FormData格式,例如:

      • name=小米80的相册&description=小米80的相册的简介&sort=88
        

    如果使用了@RequestBody,则客户端提交的请求参数必须是JSON格式的。

    如果没有使用@RequestBody,则客户端提交的请求参数必须是FormData格式的。

    提示:如果使用了@RequestBody,在Knife4j的调试界面,将没有各请求参数的输入框,而是需要自行填写JSON格式的请求参数。

    1.3前端框架:qs

    qs是一个可以将JavaScript中的对象(与JSON格式相同)转换为FormData格式的框架!

    在前端项目中,先安装qs:

    npm i qs -S
    

    然后,需要在main.js中添加配置,以导入qs并使用:

    1. import qs from 'qs';
    2. Vue.prototype.qs = qs;

    接下来,在项目的任何视图组件中,都可以通过this.qs来使用此对象。

    在提交请求之前,可以使用qs将JavaScript对象转换为FormData字符串,例如:

    let formData = this.qs.stringify(this.ruleForm);

    2.Spring框架

    2.1关于Spring框架

    Spring框架主要解决了创建对象、管理对象的问题。

    2.2通过Spring创建对象

    需要Spring创建对象,有2种做法:

    • @Bean方法
    • 组件扫描

    关于@Bean方法

    • 在配置类中,自定义某个方法,其返回值类型就是你需要Spring创建对象的类型,在方法体中自行编写创建对象的代码,并且,在此方法上添加@Bean注解即可

    关于组件扫描

    1. 通过@ComponentScan注解,可以开启组件扫描,并配置扫描的包

      • 在Spring Boot项目中,启动类上的@SpringBootApplication已经使用@ComponentScan作为元注解
      • 在Spring Boot项目中,默认的组件扫描的包就是启动类所在的包
      • 任何组件扫描,都会扫描指定的包及其子孙包
    2. 在组件类上,需要添加组件注解:基础的组件注解有:

      • @Component:通用组件注解
      • @Controller:建议添加在控制器类上
      • @Service:建议添加在处理业务逻辑的类上
      • @Repository:建议添加在数据访问层的类上
        • 在使用IntelliJ IDEA时,在Mybatis的Mapper接口上添加此注解,只是为了避免IntelliJ IDEA误判而已,并没有实质的作用
      • 以上4种注解,在Spring的解释范围内,是完全等效的,只是语义不同

    另外,如果某个组件扫描范围内的类添加了@Configuration,也会被创建对象,添加此注解的类被视为“配置类”,与一般的组件不同,Spring框架会通过CGLib代理模式进行处理。

    2.3Spring管理的对象

    Spring管理的对象,默认是单例的!并且,默认情况下,单例的对象都是默认加载的。

    单例:单一实例,在某个时间点,此类的对象最多只有1个。

    默认加载:加载Spring时,就会创建此类的对象,类似于单例模式中的饿汉式单例模式。

    注意:Spring并没有使用单例模式,只是Spring管理的对象的表现与单例模式的特点是相同的。

    使用@Scope注解,注解参数值配置为prototype(原型),可以使得Spring管理的对象不是单例的:

    • 使用组件扫描创建对象时,在组件类上添加@Scope("prototype")
    • 使用@Bean方法创建对象时,在@Bean方法上添加@Scope("prototype")

    使用@Lazy注解,可以使得Spring管理的单例对象是懒加载的(第1次获取此对象时才创建对象):

    • 使用组件扫描创建对象时,在组件类上添加@Lazy
    • 使用@Bean方法创建对象时,在@Bean方法上添加@Lazy

    2.4Spring管理的对象的生命周期

    被Spring管理的对象的类型,可以自定义2个生命周期方法,这2个方法会分别在“创建后”和“销毁前”被自动调用!

    在自定义类中,可以自定义方法:

    • 访问权限:应该使用public
    • 返回值类型:void
    • 方法名称:自定义
    • 参数列表:仅可添加少量特定的类型

    另外,在“创建后”的方法上,需要添加@PostConstruct注解,在“销毁前”的方法上,需要添加@PreDestroy注解,例如:

    1. @PostConstruct
    2. public void init() {
    3. }
    4. @PreDestroy
    5. public void destroy() {
    6. }

    2.5自动装配

    Spring容器:Spring的本质是一个容器,它会将它创建的所有对象都管理在此容器中。

    Spring Bean:每个被Spring创建的对象都是一个Spring Bean。

    自动装配:当某个添加了自动装配注解的属性,或某个被Spring自动调用的方法的参数需要值时,Spring会自动尝试从容器中查找适合的Spring Bean,用于为此赋值。

    通常,其表现就是在类的属性上添加@Autowired注解,则Spring会尝试自动为此属性赋值。

    关于@Autowired的装配机制:

    • 首先,在Spring容器中查找匹配类型的Spring Bean的数量
      • 0个:取决于@Autowired注解的required属性
        • required = true:加载Spring时出现NoSuchBeanDefinitionException
        • required = false:放弃自动装配,则属性值为null
      • 1个:直接装配,且成功
      • 多个:将尝试根据名称来自动装配,要求被自动装配的属性名与Spring Bean的名称是匹配的,如果存在匹配的,则成功装配,否则,加载Spring时出现NoUniqueBeanDefinitionException
        • 关于名称匹配,可以是属性名改为某个Spring Bean名称,或在属性上添加@Qualifier注解来指定某个Spring Bean的名称

    另外,在不使用@Autowired(含匹配的@Qualifier)的情况下,也可以在属性上添加@Resource注解来实现自动装配!

    关于@Resource注解的装配机制:

    • 先尝试根据名称查找匹配的Spring Bean,且类型也匹配,则自动装配,如果没有匹配名称的Spring Bean,将尝试按照类型来装配,简单来说,是先根据名称,再根据类型的装配机制。

    2.6关于DI与IoC

    IoCInversion OControl,控制反转,表示将对象的控制权(创建、管理)交给框架

    DIDependency Injection,依赖注入,表现为给对象的依赖属性赋值

    3.小结

    关于Spring框架,你应该:

    • 理解Spring框架的作用
    • 掌握使得Spring框架创建对象的2种方式
      • @Bean方法
      • 组件扫描
    • 理解Spring框架管理的对象的作用域
      • 默认具有单例的特点
      • 在单例的状态下,默认是预加载的
    • 了解Spring框架管理的对象的生命周期方法
    • 理解Spring框架的自动装配的特点,理解@Autowired的装配机制

    另外,尚未涉及的部分:

    • 读取.properties配置文件,管理项目中的环境变量Environment
    • Spring AOP
  • 相关阅读:
    前端面试话术集锦第 15 篇:高频考点(React常考进阶知识点)
    多线程合集(三)---异步的那些事之自定义AsyncTaskMethodBuilder
    C++学习——C++运算符重载(含义、格式、示例、遵循的规则)
    计算几何(待填坑)
    HIN应用调研总结
    C++ Qt开发:QUdpSocket网络通信组件
    富文本编辑器——UEditor的使用——基础积累
    光栅阶次分析器
    Java设计模式之享元模式
    Could not find artifact com.mysql:mysql-connector-j:pom:unknown
  • 原文地址:https://blog.csdn.net/TheNewSystrm/article/details/126128756