Springboot思想、源码讲解、工具使用

本文详细解析了Spring Boot的核心特性,包括自动装配原理、配置文件的位置与优先级、YML多环境配置、静态资源处理以及如何定制首页。通过源码分析,揭示了Spring Boot如何简化开发过程,同时介绍了如何扩展Spring MVC和编写高质量网站的要点。
摘要由CSDN通过智能技术生成

springboot banner在线生成工具

照自己喜欢的个性选择

自动装配

pom.xml
  • sprin-gboot-dependencies:核心依赖在父工程中!
  • 我们在写或者引入一些依赖的时候,不需要指定版本,就是因为有这些版本仓库
启动器
  • <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
  • 启动器:说白了就是springboot的启动场景

  • 比如 spring-boot-starter-web,就会帮我们自动导入web环境所有的依赖

  • sppringboot会将所有的功能场景,都变成一个个的启动器

使用注解说明
  • SpringbootApplication :标注这个类是一个springboot应用
  • @SpringBootConfiguration :springboot的配置
    • @Configuration :spring配置
    • @Component :说明也是一个spring的组件
  • @EnableAutoConfiguration :自动配置
    • @AutoConfigurationPackage : 自动配置包
      • @Import({Registrar.class}) :自动配置‘包注册’
    • @Import({AutoConfigurationImportSelector.class}) :自动配置导入选择
自动装配原理
  1. springboot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值
  2. 将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动配置
  3. 以前我们需要自动配置的东西,现在springboot都帮我们做了!
  4. 整合javaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.6RELEASE.jar包里面
  5. 它会把所有需要导入的组件,以类名的方式返回,这些组件机会被添加到容器
  6. 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration)
  7. 有了自动装配类,免去了我们手动编写配置注入功能组件等的工作

了解主启动类怎么运行

SpringApplication.run(Springboot1Application.class, args);
  • SpringApplication类 ,初始化
    1. 推断应用的类型是普通的项目还是Web项目
    2. 查找并加装所有可用初始化器,设置到 initializers 属性中
    3. 找出所有的应用程序监听器,设置到 listeners属性中
    4. 推断并设置main方法的定义类,找到运行的主类
  • 实例化 run 方法
    • 启动监听器
    • 装配配置参数(配置文件)
    • 打印banner图案
    • 上下文区域
JSR303校验
  • @Validated//数据校验

在这里插入图片描述

配置文件可存放目录

  • file:./application.yml :与.class同级
  • file:./config/application.yml
  • classpath:./config/application.yml
  • classpath:./application.yml :项目resources目录(默认)
  • 优先级逐层降低

yml多环境配置

  • 在spring中多环境配置文件名需要满足application-{profile}.properties的格式

    • application.yml
    • application-dev.yml
    • application-test.yml
  • 配置文件命名

    spring:
    config:
    activate:
    on-profile: dev

  • application.yml中引用

    spring:  
      profiles:    
        active: dev
    
静态资源探究(源码讲解)
  • 源码存放位置(两下shift快捷键):
    • WebMvcAutoConfiguration
      • WebMvcAutoConfigurationAdapter类
      • 其上注解@EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})
      • addResourceHandlers方法 (添加资源处理器)
源码讲解 addResourceHandlers
@Override
		public void addResourceHandlers(ResourceHandlerRegistry registry) {
			if (!this.resourceProperties.isAddMappings()) {
				logger.debug("Default resource handling disabled");
				return;
			}
			addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
			addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
				registration.addResourceLocations(this.resourceProperties.getStaticLocations());
				if (this.servletContext != null) {
					ServletContextResource resource = new ServletContextResource(this.servletContext, SERVLET_LOCATION);
					registration.addResourceLocations(resource);
				}
			});
		}
  • 判断 静态资源的东西是否被自定义

    • 进入WebMvcProperties 类中查看关于静态资源的配置

      private String staticPathPattern = "/**";
      
    • yml中定义

      spring.mvc.staticPathPattern =
      
  • webJars的方式基本没用

    以maven依赖的方式导入 放在webJars依赖包的目录下,可直接访问:eg: localhost:8080/webjars/jquery/3.4.1/jquery.js

  • getStaticLocations 值:/** ,进入WebProperties 类下的Resource

    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
    				"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
    		/**
    		 * Locations of static resources. Defaults to classpath:[/META-INF/resources/,
    		 * /resources/, /static/, /public/].
    		 */
    		private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
    

    访问/** (localhost:8080/) 都可以直接访问这四个目录下的文件,这四个目录都是静态资源目录

  • 优先级:resource > static(默认) > public

    • public : 一般放置公共资源
    • static :一般放置静态资源
    • resource :一般放置upload上传的文件

首页及图标定制

  • WebMvcAutoConfiguration类下

    @Bean
    		public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
    				FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
    			WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
    					new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),
    					this.mvcProperties.getStaticPathPattern());
    			welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
    			welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
    			return welcomePageHandlerMapping;
    		}
    //
    private Resource getWelcomePage() {
    			for (String location : this.resourceProperties.getStaticLocations()) {
    				Resource indexHtml = getIndexHtml(location);
    				if (indexHtml != null) {
    					return indexHtml;
    				}
    			}
    			ServletContext servletContext = getServletContext();
    			if (servletContext != null) {
    				return getIndexHtml(new ServletContextResource(servletContext, SERVLET_LOCATION));
    			}
    			return null;
    		}
    //
    private Resource getIndexHtml(String location) {
    			return getIndexHtml(this.resourceLoader.getResource(location));
    		}
    //
    private Resource getIndexHtml(Resource location) {
        try {
            Resource resource = location.createRelative("index.html");
            if (resource.exists() && (resource.getURL() != null)) {
                return resource;
            }
        }
        catch (Exception ex) {
        }
        return null;
    }
    
  • 源码说明:取名index.html 放在resource目录下

  • 访问路径:localhost:8080访问此首页

扩展SpringMvc

  • Alt + insert可以重写很多的方法
  • @EnableWebMvc 全部接管springMvc的配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.Locale;

//扩展SpringMvc
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    //ViewResolver实现了试图解析器的接口,我们就可以把它看做试图解析器
    @Bean
    public ViewResolver myViewResolver(){
        return new MyViewResolver();
    }
    //自定义了一个自己的试图解析器
    public static class MyViewResolver implements ViewResolver{
        @Override
        public View resolveViewName(String viewName, Locale locale){
            return null;
        }
    }
}

怎么写好一个网站

  • 前端搞定:页面长什么样子:数据
  • 设计数据库(数据库设计难点)
  • 前端能让他独立运行(前后端分离)
  • 数据接口如何对接:json,对象
  • 前后端联调测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值