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}) :自动配置导入选择
- @AutoConfigurationPackage : 自动配置包
自动装配原理
- springboot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值
- 将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动配置
- 以前我们需要自动配置的东西,现在springboot都帮我们做了!
- 整合javaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.6RELEASE.jar包里面
- 它会把所有需要导入的组件,以类名的方式返回,这些组件机会被添加到容器
- 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration)
- 有了自动装配类,免去了我们手动编写配置注入功能组件等的工作
了解主启动类怎么运行
SpringApplication.run(Springboot1Application.class, args);
- SpringApplication类 ,初始化
- 推断应用的类型是普通的项目还是Web项目
- 查找并加装所有可用初始化器,设置到 initializers 属性中
- 找出所有的应用程序监听器,设置到 listeners属性中
- 推断并设置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方法 (添加资源处理器)
- WebMvcAutoConfiguration
源码讲解 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,对象
- 前后端联调测试