从字面理解,Spring Cloud 就是致力于分布式系统、云服务的框架。 Spring Cloud 是整个 Spring 家族中新的成员,是最近云服务火爆的必然产物。 Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具 使用 Spring Cloud 开发人员可以开箱即用的实现这些模式的服务和应用程序。这些服务可以任何环境下运行,包括分布式环境,也包括开发人员自己的笔记本电脑以及各种托管平台。 在Spring Cloud中使用了Hystrix 来实现断路器的功能,断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续而不等待故障恢复或者浪费 CPU 周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决,如果问题似乎已经得到纠正,应用程序可以尝试调用操作。 断路器增加了稳定性和灵活性,以一个系统,提供稳定性,而系统从故障中恢复,并尽量减少此故障的对性能的影响。它可以帮助快速地拒绝对一个操作,即很可能失败,而不是等待操作超时(或者不返回)的请求,以保持系统的响应时间。如果断路器提高每次改变状态的时间的事件,该信息可以被用来监测由断路器保护系统的部件的健康状况,或以提醒管理员当断路器跳闸,以在打开状态。 ①. 服务发现——Netflix Eureka 一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务。由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。 ②. 客服端负载均衡——Netflix Ribbon Ribbon,主要提供客户侧的软件负载均衡算法。Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。 ③. 断路器——Netflix Hystrix 断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续而不等待故障恢复或者浪费 CPU 周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决。如果问题似乎已经得到纠正,应用程序可以尝试调用操作。 ④. 服务网关——Netflix Zuul 类似nginx,反向代理的功能,不过netflix自己增加了一些配合其他组件的特性。 ⑤. 分布式配置——Spring Cloud Config 这个还是静态的,得配合Spring Cloud Bus实现动态的配置更新。
什么是spring boot,它主要有哪些优点 Springboot是spring的子项目,称为一站式解决方案,集成了外部很多的优秀的框架,如常用的mysql、jdbc。 主要优点:通过maven导入各种jar包,可以减少jar包的冲突;屏息了繁琐的xml配置文件;集成的开发框架,可以做到开箱即用 spingboot核心注解有哪些,都代表什么意思 核心注解主要包含3个: @SpringBootConfiguration:实现配置文件功能 @EnableAutoConfiguration:开启自动配置功能 @ComponentScan:组件扫描3、springboot中如何解决跨域问题 跨域都是通过前端JSONP来解决,但只能处理get类型请求,像post、put、delete就不支持,所以一般采用后端跨域通过WebMvcConfiguration接口来重写addCorsMappings方法,解决跨域问题。4、在springboot微服务设计中,如何实现session共享 在微服务中,因为一个项目被拆分成多个子项目,导致内存中的session不一致,所以可以采取spring session+redis方式,将session统一保存在redis中。5、 springbo ot需要独立的容器启动项目吗 不需要,springboot自带tomcat、jetty。 springboot运行方式有几种 一般有三种,将springboot打包发到容器中;也可直接运行main主方法;也可以mavern插件运行。 在springboot工程中,无需重启系统,实现项目更新 这就涉及到springboot热部署的问题,只需安装devtools工具包,就能实现修改后的文件,通过Ctrl+F9来实现热更新 YAML在springboot中的作用 使得springboot配置文件更加有层次感,结构也比较清晰,不容易混淆,目前也是人类可读的数据序列化语言。 在spingboot配置环境文件中,它们的加载顺序是什么 排序:properties文件、yaml文件、系统环境变量、命令参数等配置文件
void registerScope(String scopeName, Scope scope);registerScope(..)方法的第一个参数是与作用域相关的全局唯一名称;Spring容器中该名称的范例有singleton和prototype。registerScope(..)方法的第二个参数是你打算注册和使用的自定义Scope实现的一个实例。
ioc就是控制翻转或是依赖注入。
DI(DependencyInjection,依赖注入)
1. 什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。
1. 什么是spring?Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。2. 使用Spring框架的好处是什么?轻量:Spring 是轻量的,基本的版本大约2MB。控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。容器:Spring 包含并管理应用中对象的生命周期和配置。MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。3. Spring由哪些模块组成?以下是Spring 框架的基本模块:Core moduleBean moduleContext moduleExpression Language moduleJDBC moduleORM moduleOXM moduleJava Messaging Service(JMS) moduleTransaction moduleWeb moduleWeb-Servlet moduleWeb-Struts moduleWeb-Portlet module4. 核心容器(应用上下文) 模块。这是基本的Spring模块,提供spring 框架的基础功能,BeanFactory 是 任何以spring为基础的应用的核心。Spring 框架建立在此模块之上,它使Spring成为一个容器。5. BeanFactory – BeanFactory 实现举例。Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。最常用的BeanFactory 实现是XmlBeanFactory 类。6. XMLBeanFactory最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans。该容器从XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用。7. 解释AOP模块AOP模块用于发给我们的Spring应用做面向切面的开发, 很多支持由AOP联盟提供,这样就确保了Spring和其他AOP框架的共通性。这个模块将元数据编程引入Spring。8. 解释JDBC抽象和DAO模块。通过使用JDBC抽象和DAO模块,保证数据库代码的简洁,并能避免数据库资源错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一的异常访问层。它还利用Spring的AOP 模块给Spring应用中的对象提供事务管理服务。9. 解释对象/关系映射集成模块。Spring 通过提供ORM模块,支持我们在直接JDBC之上使用一个对象/关系映射映射(ORM)工具,Spring 支持集成主流的ORM框架,如Hiberate,JDO和 iBATIS SQL Maps。Spring的事务管理同样支持以上所有ORM框架及JDBC。10. 解释WEB 模块。Spring的WEB模块是构建在application context 模块基础之上,提供一个适合web应用的上下文。这个模块也包括支持多种面向web的任务,如透明地处理多个文件上传请求和程序级请求参数的绑定到你的业务对象。它也有对Jakarta Struts的支持。12. Spring配置文件Spring配置文件是个XML 文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。13. 什么是Spring IOC 容器?Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。14. IOC的优点是什么?IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。15. ApplicationContext通常的实现是什么?FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。16. Bean 工厂和 Application contexts 有什么区别?Application contexts提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),它们可以向注册为监听器的bean发布事件。另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Application contexts中以声明的方式处理。Application contexts实现了MessageSource接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。17. 一个Spring的应用看起来象什么?一个定义了一些功能的接口。这实现包括属性,它的Setter , getter 方法和函数等。Spring AOP。Spring 的XML 配置文件。使用以上功能的客户端程序。依赖注入18. 什么是Spring的依赖注入?依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。19. 有哪些不同类型的IOC(依赖注入)方式?构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。20. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入?你两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。Spring Beans21.什么是Spring beans?Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中《bean/》 的形式定义。Spring 框架定义的beans都是单件beans。在bean tag中有个属性”singleton”,如果它被赋为TRUE,bean 就是单件,否则就是一个 prototype bean。默认是TRUE,所以所有在Spring框架中的beans 缺省都是单件。22. 一个 Spring Bean 定义 包含什么?一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。23. 如何给Spring 容器提供配置元数据?这里有三种重要的方法给Spring 容器提供配置元数据。XML配置文件。基于注解的配置。基于java的配置。24. 你怎样定义类的作用域?当定义一个《bean》 在Spring里,我们还能给这个bean声明一个作用域。它可以通过bean 定义中的scope属性来定义。如,当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。另一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope 属性 必须设为 singleton。25. 解释Spring支持的几种bean的作用域。Spring框架支持以下五种bean的作用域:singleton : bean在每个Spring ioc 容器中只有一个实例。prototype:一个bea
100个高频Spring面试题,让面试也能聊出花! 1、 Spring是什么? 2、Spring框架的好处? 3、Spring有哪些模块? 4、解释Core Container(Application context)模块 5、BeanFactory实现实例 6、XMLBeanFactory 7、解释AOP模块 8、解释JDBC抽象和DAO模块 9、解释对象/关系映射集成模块 10、解释Spring web模块 11、解释Spring MVC模块 12、Spring配置文件 13、如何才能有多个Spring配置文件? 14、ApplicationContext有哪些常见实现? 15、Bean Factory和ApplicationContext有什么区别? 16、Spring框架的一些最佳实践是什么? 17、使用Spring框架的方式有哪些? 18、我们如何使用Spring创建restful web服务来返回JSON响应结果? 19、Spring vs Spring MVC vs Spring Boot? 20、一个Spring大概是什么样子? B:依赖注入 21、Spring的IOC容器是什么? 22、IOC的好处有哪些? 23、Spirng中有多少种IOC容器? 24、BeanFactory和ApplicationContext比较 25、什么是Spring中的依赖注入? 26、紧耦合和松耦合有什么区别? 27、IOC(依赖注入)有哪些不同类型? 28、你建议使用构造方法注入还是Setter注入? C.Spring Beans 29、Spring beans是什么? 30、Spring bean定义包含什么? 31、如何向Spring容器提供配置元数据? 32、怎么定义bean的作用域? 33、说明Sprig支持的bean作用域 34、单例作用域是线程安全的吗? 35、解释Spring Bean的声明周期 36、有哪些重要的bean生命周期方法?你能重写它们吗? 37、Spring的内部bean是什么? 38、如何在Spring中注入Java集合? 39、什么是Spring Bean装配? 40、什么是Bean自动装配? 41、解释不同类型的自动装配 42、自动注入有限制吗? 43、你能在Spring中注入null和空字符串吗? D.Spring注解 44、有哪些重要的Spring注解? 45、@RequestParam注解的作用是什么? 46、注解@Primary的重要性 47、XML配置和注解之间有什么区别? 48、@SpringBootApplication的作用是什么? 49、解释@InitBinder? 50、定义@ControllerAdvice 100个高频Spring面试题,让面试也能聊出花! 51、我们可以将一个个对象作为控制器处理程序方法的响应吗? 52、解释@ModelAttribute? 53、@RequestMapping注解 54、什么是spring中基于java的配置?给出一注解示例 55、什么是基于注解的容器配置? 56、如何打开注解装配? E.Spring 数据访问 57、Spring JDBC API中有哪些类? 58、如何在Spring框架中更高效地使用JDBC? 59、JdbcTemplate 60、如何通过spring JdbcTemplate获取数据? 61、NamedParameterJdbcTemplate的优点是什么? 62、什么是SpringJDBCTemplate类以及如何使用它? 63、 JDBC和Spring JDBC有什么区别? 64、Spring DAO支持 65、使用Spring访问Hibernate有哪些方式? 66、Spring支持的ORM 67、如何使用HibernateDaoSupport集成Spring和Hibernate? 68、Spring支持的事务管理类型? 69、Spring框架的事务管理有哪些优点? 70、哪种事务管理类型更可取? F:Spring AOP 71、解释AOP 72、AOP有哪些优点? 73、AOP有哪些实现? 74、AOP术语有哪些? 75、切面 76、连接点 77、通知 78、切点 79、什么是引入? 80、什么是目标对象? 81、什么是代理? 82、有哪些不同类型的代理? 83、什么是植入。什么是植入应用的不同点? 84、Spring AOP中关注点和横切关注点有什么区别? 85、解释基于XML Schema方式的切面实现 86、解释基于注解的切面实现 G.Spring Model View Controller (MVC) 87、什么是Spring MVC框架? 88、创建spring mvc应用程序所需的最少配置是什么? 89、说出Spring MVC请求处理的主要流程? 90、DispatcherServlet 91、WebApplicationContext 92、 Spring MVC中的控制器是什么? 93、你如何将spring mvc框架与MVC架构联系起来? 94、Spring MVC中的ViewResolver是什么? 95、MultipartResolver是什么?怎么使用? 96、如何在spring mvc应用程序中上传文件? 97、Spring Web MVC怎么校验数据? 这里有三种方式去 提供校验 :使用注解、手动校验、或者两者混合。 98、什么是springmvc拦截器以及如何使用它? H.扩展 99、Spring Security是什么? 100、为什么要用SpringBoot (需要这份spring面试题答案PDF版,可以加群:927953692 免费领取)
作为一名Java程序员,我想没人敢小觑 Spring的重要性,现在出去面试,无论多小的公司 or 项目,都要跟你扯一扯 Spring,扯一扯微服务,如果啃不下来,很可能就与大厂失之交臂。
精通Spring的原理实现的话,可以帮助你更好地职业进阶,学习前辈优秀的架构设计思想,总结出最优使用方案,绕过工作中遇到的很多坑。
一个框架的源码也是最大的知识库,源码是一层一层嵌套的,光靠文字说明会比较难以理解,最好是在IDE环境下跟着一步一步跟着点下去。
如果要学习源码,最合适的就是Spring,理由如下:
面试常问Spring、Spring Boot、Spring Cloud、Spring MVC面试题解析
针对Spring、Spring Boot、Spring Cloud、Spring MVC,笔者这边整理了几份学习PDF,这些PDF是可以免费分享的!
收集整理不易有需要的朋友帮忙转发一下,然后 【点击这里】 获取免费领取方式!
需要此PDF文档的朋友们记得转发一下;然后 【点击这里】 获取免费领取方式!
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。 Spring Boot 主要有如下优点: 启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解: @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。 @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude= { DataSourceAutoConfiguration.class })。 @ComponentScan:Spring组件扫描。 Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于: (1) 面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以 充分利用 Java 中的面向对象的功能。一个配置类可以继承另一个,重写它的 @Bean 方法等。 (2) 减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。 但是,许多开发人员不希望在 XML 和 Java 之间来回切换。JavaConfig 为开发人员提供了一种纯粹 Java 方法来配置与 XML 配置概念相似的 Spring 容器。从 技术角度来讲,只是使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将JavaConfig 与 XML 混合匹配是理想的。(3)类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于 Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。 BFPP:BeanFactoryPostProcessor BPP:BeanPostProcessor BDRPP:BeanDefinitionRegistryPostProcessor 表达的总体思路是:总-分-总 1、springboot自动装配是什么,解决了什么问题 2、自动装配实现的原理: 1、当启动springboot应用程序的时候, 会先创建SpringApplication的对象,在对象的构造方法中会进行某些参数的初始化工作,最主要的是判断当前应用程序的类型以及初始化器和监听器,在这个过程中会加载整个应用程序中的spring.factories文件,将文件的内容放到缓存对象中,方便后续获取。 2、SpringApplication对象创建完成之后,开始执行run方法,来完成整个启动,启动过程中最主要的有两个方法,第一个叫做prepareContext,第二个叫做refreshContext,在这两个关键步骤中完整了自动装配的核心功能,前面的处理逻辑包含了上下文对象的创建,banner的打印,异常报告期的准备等各个准备工作,方便后续来进行调用。 3、在prepareContext方法中主要完成的是对上下文对象的初始化操作,包括了属性值的设置,比如环境对象,在整个过程中有一个非常重要的方法,叫做load,load主要完成一件事,将当前启动类做为一个beanDefinition注册到registry中,方便后续在进行BeanFactoryPostProcessor调用执行的时候,找到对应的主类,来完成@SpringBootApplicaiton,@EnableAutoConfiguration等注解的解析工作 4、在refreshContext方法中会进行整个容器刷新过程,会调用中spring中的refresh方法,refresh中有13个非常关键的方法,来完成整个spring应用程序的启动,在自动装配过程中,会调用invokeBeanFactoryPostProcessor方法,在此方法中主要是对ConfigurationClassPostProcessor类的处理,这次是BFPP的子类也是BDRPP的子类,在调用的时候会先调用BDRPP中的postProcessBeanDefinitionRegistry方法,然后调用postProcessBeanFactory方法,在执行postProcessBeanDefinitionRegistry的时候回解析处理各种注解,包含@PropertySource,@ComponentScan,@ComponentScans,@Bean,@Import等注解,最主要的是@Import注解的解析。 5、在解析@Import注解的时候,会有一个getImports的方法,从主类开始递归解析注解,把所有包含@Import的注解都解析到,然后在processImport方法中对Import的类进行分类,此处主要识别的时候AutoConfigurationImportSelect归属于ImportSelect的子类,在后续过程中会调用deferredImportSelectorHandler中的process方法,来完整EnableAutoConfiguration的加载。 6、上面是我对springboot自动装配的简单理解,面试官您看一下,我回答有没有问题,帮我指点一下! 在 Spring Boot 里面,可以使用以下几种方式来加载配置。 1) properties文件; 2) YAML文件; 3) 系统环境变量; 等等…… YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。 YAML 现在可以算是非常流行的一种配置文件格式了,无论是前端还是后端,都可以见到 YAML 配置。那么 YAML 配置和传统的 properties 配置相比到底有哪些优势呢? 相比 properties 配置文件,YAML 还有一个缺点,就是不支持 @PropertySource 注解导入自定义的 YAML 配置。 Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。 spring boot 核心配置文件是什么? bootstrap.properties 和 application.properties 有何区别 ? 单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置文 件,但是在结合 Spring Cloud 时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。 spring boot 核心的两个配置文件: bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud Config 或者 Nacos 中会用到它。且 boostrap 里面的属性不 能被覆盖; application (. yml 或者 . properties): 由ApplicatonContext 加载,用于 spring boot 项目的自动化配置。 Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单。 为了在自定义端口上运行 Spring Boot 应用程序,您可以在 application.properties 中指定端口。server.port = 8090 为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展 WebSecurityConfigurerAdapter 并覆盖其方法。 跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMa
推发布温馨提示: