
目录
10.Spring Boot 是否可以使用 XML 配置 ?
21.spring-boot-starter-parent 有什么用 ?
1.说一下SpringBoot?
- SpringBoot是整由Spring技术栈的一站式框架
- SpringBoot是简化Spring技术栈的快速开发脚手架
2.springboot的优点?
- 1.创建独立的spring应用
- 2.内嵌web服务器
- 3.自动配置spring以及第三方功能
- 4.提供生产级别的监控、健康检查以及外部化配置
5.无代码生成,无需编写xml
3.springboot如何创建bean对象?
使用@Configuration+@Bean注解(其中的一种与springmvc一样)
- @Configuration:把类标识为配置类,等同于xml配置文件
- @Bean:给容器中添加组件,以方法名作为组件的id;返回类型就是组件的类型,返回值就是组件在容器中的实例
配置类里面使用@Bean标注在方法上给容器注册组件时,默认也是单实例。
配置类本身也是组件。
4.说一下springboot中的条件装配?
- 条件装配:满足@Conditional指定的条件,则进行组件注入
- 子注解(如
@ConditionalOnClass、@ConditionalOnBean)在Spring Boot的自动配置中起着关键作用。
5.如何xml配置导入到springboot中?
- 使用@ImprotResource 注解引入外部的xml文件
@ImportResource("classpath:bean.xml") @Configuration public class MyConfig { @Bean public User user01() { return new User("张三", "123456"); } }
6.如何将配置文件和javaBean进行绑定?
- 使用@ConfigurationProperties 注解进行绑定
- 注意:只有在容器中的组件,才会拥有相关功能
7.springboot自动配置的原理?
@SpringBootApplication等价于:@SprignBootConfiguration+@EnableAutoConfiguration+@ComponentScan
- @SprignBootConfiguration: 这个注解封装了@Configruation:标识为一个配置类,说明@SpringBootApplication标记的类是个配置类。
- @ComponentScan:扫描指定的包
- @EnableAutoConfiguration:包含了@AutoconfigurationPackage和@Import({AutoConfigurationImportSelector.class})
- @AutoconfigurationPackage注解里面含有@Import({Registrar.class},利用Registrar,将@SpringBootApplication标记的这个类所在包下的所有组件导入容器中。
- @Import({AutoConfigurationImportSelector.class}):导入AutoConfigurationImportSelector这个类,
- 1.这个类里面的selectImports方法利用getAutoConfigurationEntry(annotationMetadata)这个方法批量导入了组件。
- 2.getAutoConfigurationEntry这个方法中调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有导入到容器中的组件
- 3.利用工厂加载Map<String, List<String>> loadSpringFactories(ClassLoader classLoader:得到所有的组件
- 4.loadSpringFactories会从META-INF/spring.factories位置来加载一个文件,默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件,spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories并且里面写死了131个配置类,springboot一启动就要给容器中加载所有配置类,但是会通过条件装配规则(满足@Conditional指定的条件,则进行组件注入)按需加载
总结:
- SpringBoot先加载所有的自动配置类
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件默认的值
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有了这些组件,就相当于这些功能就有了。
- 只要自己配置了,就以自己的优先
- 定制化配置:1.用户直接自己@Bean替换底层的组件;2.用户去看这个组件是获取的配置文件什么值就去修改。
8. springboot启动方式?
- 1.运行带有main方法类:这是最常见的启动方式。直接运行项目的主启动类
- 2.通过命令行使用java -jar的方式:首先,将Spring Boot项目打包成一个可执行的JAR文件;然后,在命令行中使用
java -jar命令来运行这个JAR文件- 3.通过spring-boot-maven-plugin或spring-boot-gradle-plugin的方式:如果你使用Maven或Gradle作为你的构建工具,那么你可以通过配置相应的插件来启动你的Spring Boot应用
9.什么是yml?
YAML 在开发的这种语言时,YAML 的意思其实是: "Yet Another Markup Language" (仍是一种标记语言),是一种人类可读的数据序列化语言。
10.Spring Boot 是否可以使用 XML 配置 ?
- Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。
11.如何访问静态资源?
- 1.只要静态资源放在类路径(resources)下: called , static , public , resources , META-INF/resources
- 访问:当前根路径+静态资源名
- 原理:静态资源拦截/**,请求进来,先去找Controller,看能不能处理;不能处理的所有请求又都交给静态资源处理器,静态资源找不到就报404
12.如何改变静态资源访问前缀?
- 默认无前缀
- 配置之后:当前项目+static-path-pattern前缀+资源文件
spring: mvc: static-path-pattern: /xz/**
13.静态资源配置原理?
- 1.SpringBoot启动默认加载 xxxAutoConfiguration 类(自动配置类)
- 2.SpringMVC功能的的大都数功能都集中在WebMvcAutoConfiguration类中, 根据条件ConditionalOnxxx注册类对象;WebMvcAutoConfiguration满足以下ConditionalOnxxx条件,类是生效的,并把其对象注册到容器中。
@AutoConfiguration( after = {DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class} ) @ConditionalOnWebApplication( type = Type.SERVLET ) @ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class}) @ConditionalOnMissingBean({WebMvcConfigurationSupport.class}) @AutoConfigureOrder(-2147483638) public class WebMvcAutoConfiguration { public static final String DEFAULT_PREFIX = ""; public static final String DEFAULT_SUFFIX = ""; public static final PathPatternParser pathPatternParser = new PathPatternParser(); private static final String SERVLET_LOCATION = "/";WebMvcAutoConfiguration生效给容器中配置了什么呢?
@Configuration( proxyBeanMethods = false ) @Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class}) @EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class}) @Order(0) public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware { private static final Log logger = LogFactory.getLog(WebMvcConfigurer.class); private final Resources resourceProperties; private final WebMvcProperties mvcProperties; private final ListableBeanFactory beanFactory; private final ObjectProvider<HttpMessageConverters> messageConvertersProvider; private final ObjectProvider<DispatcherServletPath> dispatcherServletPath; private final ObjectProvider<ServletRegistrationBean<?>> servletRegistrations; private final WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer; private ServletContext servletContext;
- 配置文件的相关属性和xxx进行了绑定(@EnableConfigurationProperties中):
- WebMvcProperties绑定spring.mvc
- ResourceProperties绑定spring.resources
- WebProperties绑定spring.web
- 资源处理的默认规则:
public void addResourceHandlers(ResourceHandlerRegistry registry) { if (!this.resourceProperties.isAddMappings()) { logger.debug("Default resource handling disabled"); } else { this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/"); this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> { registration.addResourceLocations(this.resourceProperties.getStaticLocations()); if (this.servletContext != null) { ServletContextResource resource = new ServletContextResource(this.servletContext, "/"); registration.addResourceLocations(new Resource[]{resource}); } }); } }通过配置add-mapping 禁用所有静态资源:
spring: web: resources: add-mappings: false
14.请求映射的原理?
- 所有的请求映射都保存在了handlerMapping中,
- 请求进来,尝试所有的handlerMapping,看是否有请求信息,
- 如果有,则找到对应的handler;
- 如果没有,则找下一个handlerMapping;
- springboot自动配置类5中handlerMapping:
- RequestMappingHandlerMapping:默认的,保存了所有handler(controller里面的映射)
- WelcomePageHandlerMapping:SpringBoot自动配置欢迎页
- BeanNameUrHandlerMapping
- RouterFunctionMapping
- SimpleUrHandlerMapping
15.springboot可以接受的传参类型?
- 1.路径参数:使用
@PathVariable注解从URL路径中捕获参数。- 2.查询参数:使用
@RequestParam注解从查询字符串中捕获参数。- 3.请求体参数:使用
@RequestBody注解从请求体中捕获参数。- 4.表单参数:使用
@ModelAttribute或@RequestParam注解从表单数据中捕获参数。- 5.请求头参数:使用
@RequestHeader注解从HTTP请求头中捕获参数。- 6.请求属性参数:使用
@ModelAttribute或@SessionAttributes注解从会话或请求范围中捕获参数。
16.springboot 请求参数处理的原理?
- 从handlerMaping中找到能处理请求的handler,为当前handler找到handlerAdapter适配器,在调用参数解析器解析handler
- 支持4中handlerAdapter:
- RequestMappingHandlerAdapter(默认)
- HandlerFunctionAdapter
- HttpRequestHandlerAdapter
- SimpleControllerHandlerAdapter
17.SpringBoot热部署有哪些方式?
- 热部署:就是可以不用重新运行SpringBoot项目可以实现操作后台代码自动更新到以运行的项目中
方式:
- 1..常用-使用Spring Boot DevTools:
- 配置方式:在POM文件中添加spring-boot-devtools的依赖,并设置optional为true,以防止将devtools依赖传递到其他模块中。
- 在IDEA中,可以通过快捷键Ctrl+F9手动触发重启更新,或者开启运行时编译以实现自动重启更新。
- 2.使用JRebel:JRebel是Java开发中最好的热部署工具之一,对Spring Boot提供了极佳的支持。(收费)
- 3.使用Spring Loaded:Spring Loaded的方式与Debug模式类似,但不依赖于Debug模式启动。通过Spring Loaded库文件启动,可以在正常模式下进行实时热部署。
18. 什么是 Spring Profiles?
- 1.问题:在项目的开发中,有些配置文件在开发、测试或者生产等不同环境中可能是不同的,例如数据库连接、redis的配置等等。那我们如何在不同环境中自动实现配置的切换呢?
- 2.解决:Spring给我们提供了profiles机制来回切换配置文件
application-profile功能:
- 1.默认配置文件 application.yaml;任何时候都会加载,激活指定的环境;
- 2.指定环境配置文件 application-(dev).yaml
- 3.激活指定环境:spring.profiles.active=dev
- 配置文件激活
- 命令行激活:打包后使用命令java -jar xxx.jar --spring.profiles.active=dev
- 4.默认配置与环境配置同时生效 ,同名配置项,profile配置优先
19.如何使用 Spring Boot 实现全局异常处理?
- 1.创建一个类实现继承指定的异常(运行时异常)
- 2.自定义异常处理器,添加注解@ControllerAdvice接着判断当前异常是否属于自定义异常类
20.Spring Boot 中如何解决跨域问题 ?
通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 允许所有路径 .allowedOrigins("http://example.com") // 允许来自http://example.com的跨域请求 .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的HTTP方法 .allowedHeaders("*") // 允许任何头信息 .allowCredentials(true); // 允许携带凭证(如cookies, HTTP认证及客户端SSL证明等) } }
21.spring-boot-starter-parent 有什么用 ?
- 1.依赖管理:只声明所需的依赖而无需指定版本号
- 2.插件管理:使用 Spring Boot 推荐的 Maven 插件和配置,而无需在子模块中明确指定
- 3.属性继承:通过继承
spring-boot-starter-parent,你可以继承其定义的 Maven 属性- 4.简化配置:可以大大简化 Maven 配置
- 5.一致性:确保所有子模块使用相同版本的依赖和插件,减少潜在的版本冲突
- 6.快速集成:当你开始一个新的 Spring Boot 项目时,只需将
spring-boot-starter-parent添加为父 POM,然后添加所需的 starter 依赖,就可以快速集成 Spring Boot 提供的各种功能。
22.SpringBoot启动过程?
- 1.加载启动类:在当前工作目录下寻找带有
@SpringBootApplication注解标识的类,并将这个类作为应用程序的入口点,如果找不到这样的主类,则会打印错误信息并退出- 2.加载配置文件:SpringBoot会自动扫描当前项目的
resources目录,并加载其中的application.properties或application.yml等配置文件- 3.初始化配置::通过类加载器,创建一些初始化配置对象。
- 4.通知监听器:应用程序启动开始,创建环境对象
environment,用于读取环境配置- 5.创建应用程序上下文:创建
ApplicationContext和bean工厂对象- 6.刷新上下文(启动核心):
- 配置工厂对象
- 注册并实例化
bean工厂发布处理器- 7.发布事件
- 8.打印日志和版本信息
- 9.完成启动
23.SpringBoot启动原理?
- 1.创建SpringBootApplication:保存启动类的信息,ClassUtils判断当前应用的类型是servlet,去spring.factories文件中找初始化引导器bootstrapper、ApplicationContextInitializer、ApplicationListener(应用监听器)
- 2.运行SpringBootApplication:
- 1.先创建一个stopWatch记录应用启动时间
- 2.在创建引导上下文(context环境)createBootstrapContext(),获取到所有之前的bootstrapper挨个执行intitialize()来完成对引导器上下文环境设置
- 3.接着让当前应用进入headless模式
- 4.然后获取所有的运行时监听器RunListener
- 5.保存命令行参数
- 6.调用方法prepareEnvironment准备环境信息
- 6.创建IOC容器createApplicationContext()
- 7.准备IOC容器信息prepareContext()
- 8.刷新IOC容器refreshContext()
- 9.调用listeners.running()方法启动
24.SpringBoot如何实现打包?
- 1.进入项目目录在控制台输入mvn clean package,clean是清空已存在的项目包,package进行打包
- 2.点击左边选项栏中的Mavne,先点击clean在点击package

12万+

被折叠的 条评论
为什么被折叠?



