在前后端分离的开发模式下,如果前端(客户端)和后端(服务器端)并不是同一台主机或同一个IP地址,在默认情况下,是不允许跨域访问的(错误提示关键字为:CORS),需要在后端项目中添加以下配置类:
- package cn.tedu.csmall.product.config;
-
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.servlet.config.annotation.CorsRegistry;
- import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
- /**
- * Spring MVC的配置类
- *
- * @author java@tedu.cn
- * @version 0.0.1
- */
- @Configuration
- public class WebMvcConfiguration implements WebMvcConfigurer {
-
- @Override
- public void addCorsMappings(CorsRegistry registry) {
- registry.addMapping("/**")
- .allowedOriginPatterns("*")
- .allowedMethods("*")
- .allowedHeaders("*")
- .allowCredentials(true)
- .maxAge(3600);
- }
-
- }
当服务器端接收来自客户的请求参数时,客户端的请求参数可以是以下2种格式:
JSON格式,例如:
- {
- "description": "小米80的相册的简介",
- "name": "小米80的相册",
- "sort": 88
- }
FormData格式,例如:
name=小米80的相册&description=小米80的相册的简介&sort=88
如果使用了@RequestBody
,则客户端提交的请求参数必须是JSON格式的。
如果没有使用@RequestBody
,则客户端提交的请求参数必须是FormData格式的。
提示:如果使用了@RequestBody
,在Knife4j的调试界面,将没有各请求参数的输入框,而是需要自行填写JSON格式的请求参数。
qs是一个可以将JavaScript中的对象(与JSON格式相同)转换为FormData格式的框架!
在前端项目中,先安装qs:
npm i qs -S
然后,需要在main.js
中添加配置,以导入qs
并使用:
- import qs from 'qs';
- Vue.prototype.qs = qs;
接下来,在项目的任何视图组件中,都可以通过this.qs
来使用此对象。
在提交请求之前,可以使用qs
将JavaScript对象转换为FormData字符串,例如:
let formData = this.qs.stringify(this.ruleForm);
Spring框架主要解决了创建对象、管理对象的问题。
需要Spring创建对象,有2种做法:
@Bean
方法关于@Bean
方法
@Bean
注解即可关于组件扫描
通过@ComponentScan
注解,可以开启组件扫描,并配置扫描的包
@SpringBootApplication
已经使用@ComponentScan
作为元注解在组件类上,需要添加组件注解:基础的组件注解有:
@Component
:通用组件注解@Controller
:建议添加在控制器类上@Service
:建议添加在处理业务逻辑的类上@Repository
:建议添加在数据访问层的类上
另外,如果某个组件扫描范围内的类添加了@Configuration
,也会被创建对象,添加此注解的类被视为“配置类”,与一般的组件不同,Spring框架会通过CGLib代理模式进行处理。
Spring管理的对象,默认是单例的!并且,默认情况下,单例的对象都是默认加载的。
单例:单一实例,在某个时间点,此类的对象最多只有1个。
默认加载:加载Spring时,就会创建此类的对象,类似于单例模式中的饿汉式单例模式。
注意:Spring并没有使用单例模式,只是Spring管理的对象的表现与单例模式的特点是相同的。
使用@Scope
注解,注解参数值配置为prototype
(原型),可以使得Spring管理的对象不是单例的:
@Scope("prototype")
@Bean
方法创建对象时,在@Bean
方法上添加@Scope("prototype")
使用@Lazy
注解,可以使得Spring管理的单例对象是懒加载的(第1次获取此对象时才创建对象):
@Lazy
@Bean
方法创建对象时,在@Bean
方法上添加@Lazy
被Spring管理的对象的类型,可以自定义2个生命周期方法,这2个方法会分别在“创建后”和“销毁前”被自动调用!
在自定义类中,可以自定义方法:
public
void
另外,在“创建后”的方法上,需要添加@PostConstruct
注解,在“销毁前”的方法上,需要添加@PreDestroy
注解,例如:
- @PostConstruct
- public void init() {
- }
-
- @PreDestroy
- public void destroy() {
- }
Spring容器:Spring的本质是一个容器,它会将它创建的所有对象都管理在此容器中。
Spring Bean:每个被Spring创建的对象都是一个Spring Bean。
自动装配:当某个添加了自动装配注解的属性,或某个被Spring自动调用的方法的参数需要值时,Spring会自动尝试从容器中查找适合的Spring Bean,用于为此赋值。
通常,其表现就是在类的属性上添加@Autowired
注解,则Spring会尝试自动为此属性赋值。
关于@Autowired
的装配机制:
@Autowired
注解的required
属性
required = true
:加载Spring时出现NoSuchBeanDefinitionException
required = false
:放弃自动装配,则属性值为null
NoUniqueBeanDefinitionException
@Qualifier
注解来指定某个Spring Bean的名称另外,在不使用@Autowired
(含匹配的@Qualifier
)的情况下,也可以在属性上添加@Resource
注解来实现自动装配!
关于@Resource
注解的装配机制:
IoC:Inversion Of Control,控制反转,表示将对象的控制权(创建、管理)交给框架
DI:Dependency Injection,依赖注入,表现为给对象的依赖属性赋值
关于Spring框架,你应该:
@Bean
方法@Autowired
的装配机制另外,尚未涉及的部分:
.properties
配置文件,管理项目中的环境变量Environment