Springboot技术整理
一、Spring Boot入门
1.1 环境约束
1.1.1 工具版本:
jdk1.8 maven3.x springboot 1.5.9.RELEASE
1.1.2 统一环境:
1.1.2.1 maven
<profiles> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profiles>
1.1.2.2 idea中maven配置
1.2 hello world
idea新建maven项目。添加pom依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <jdk.version>1.8</jdk.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
插件,可以将应用打包成一个可执行的jar包
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
1.2.1探究
1.2.1.1.父项目
##定义了每一个依赖的版本,真正管理springboot应用的所有依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
1.2.1.2 启动器
导入spring-boot-starter-web依赖
spring-boot-starter : spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件
1.2.1.3主程序
@SpringBootConfiguration: springboot的配置类
@Configuration: 配置类上标注这个注解(也是一个组件@Component)
@EnableAutoConfiguration:开启自动配置功能,自动配置功能才会生效
@AutoConfigurationPackages:自动配置包(将主配置类所在包下的所有组件扫描到spring容器中)
@Import(AutoconfigurationPackages.Register.class)
spring底层注解@Import,给容器中导入一个组件;
EnableAutoConfigurationImportSelector:导入哪些组件的选择器;
会给容器中导入非常多的自动配置类(xxxAutoConfiguration),并配置好这些组件
...
1.3快速创建Springboot项目
二、Spring Boot配置
2.1YAML基本语法
2.1.1基本语法
k: v :表示一对键值对(空格必须有)
以空格的缩进来控制层级关系;只有左对齐的一列数据,都是同一层级的
2.1.2值的写法
- 字符串默认不用加单双引号
“”:双引号;不会转义字符串里的特殊字符
'':单引号;会转义特殊字符
- 键值对
k:v 格式写
- 数组
pets:
- cat
- dog
- pig
行内写法
pets: [cat,dog,pig]
2.2 @ConfigurationProperties :将本类中所有属性和配置文件中相关的配置进行绑定
三、Spring Boot与日志
3.1统一系统中所有的日志
系统中hibernate自带的日志,spring自带的日志 等等
- 将系统中其他日志框架排除
- 用中间包代替原有的日志框架
- 导入slf4j的其他实现
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.3.4.RELEASE</version> <scope>compile</scope> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <version>2.3.4.RELEASE</version> <scope>compile</scope> </dependency>
总结:springboot 能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架,只需要把这个框架依赖的日志框架排除掉
3.2 logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="false" scanPeriod="60 seconds" debug="false">
<!-- 定义日志的根目录 -->
<property name="LOG_HOME" value="/app/log" />
<!-- 定义日志文件名称 -->
<property name="appName" value="atguigu-springboot"></property>
<!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</layout>
</appender>
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 指定日志文件的名称 -->
<file>${LOG_HOME}/${appName}.log</file>
<!--
当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--
滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动
%i:当文件大小超过maxFileSize时,按照i进行文件滚动
-->
<fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!--
可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,
且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,
那些为了归档而创建的目录也会被删除。
-->
<MaxHistory>365</MaxHistory>
<!--
当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy
-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 日志输出格式: -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
</layout>
</appender>
<!--
logger主要用于存放日志对象,也可以定义日志类型、级别
name:表示匹配的logger类型前缀,也就是包的前半部分
level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR
additivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,
false:表示只用当前logger的appender-ref,true:
表示当前logger的appender-ref和rootLogger的appender-ref都有效
-->
<!-- hibernate logger -->
<logger name="com.atguigu" level="debug" />
<!-- Spring framework logger -->
<logger name="org.springframework" level="debug" additivity="false"></logger>
<!--
root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。
-->
<root level="info">
<appender-ref ref="stdout" />
<appender-ref ref="appLogAppender" />
</root>
</configuration>
logback.xml:直接就被日志框架识别了;
logback-spring.xml
3.3 切换日志框架
可以按照slf4j的日志适配图,进行相关的切换;
四、Spring Boot与Web开发
4.1 使用springboot创建各种场景(web、redis等)
- 创建springboot应用,选中我们需要的模块(web、jdbc、redis等)
- springboot已经默认将这些场景配置好了,只需要在配置文件中 指定少量配置就可以运行
- 自己编写业务
4.2 自动配置原理(各个场景springboot都给我们配置了什么?修改&扩展)
- xxxxAutoConfiguration:帮我们给容器中自动配置组件;
- xxxxProperties:配置类来封装配置文件的内容
4.3 SpringBoot对静态资源的映射规则
4.3.1 webjars映射
WebMvcAuotConfiguration:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
return;
}
Integer cachePeriod = this.resourceProperties.getCachePeriod();
if (!registry.hasMappingForPattern("/webjars/**")) {
customizeResourceHandlerRegistration(
registry.addResourceHandler("/webjars/**")
.addResourceLocations(
"classpath:/META-INF/resources/webjars/")
.setCachePeriod(cachePeriod));
}
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
//静态资源文件夹映射
if (!registry.hasMappingForPattern(staticPathPattern)) {
customizeResourceHandlerRegistration(
registry.addResourceHandler(staticPathPattern)
.addResourceLocations(
this.resourceProperties.getStaticLocations())
.setCachePeriod(cachePeriod));
}
}
//配置欢迎页映射
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(
ResourceProperties resourceProperties) {
return new WelcomePageHandlerMapping(resourceProperties.getWelcomePage(),
this.mvcProperties.getStaticPathPattern());
}
//配置喜欢的图标
@Configuration
@ConditionalOnProperty(value = "spring.mvc.favicon.enabled", matchIfMissing = true)
public static class FaviconConfiguration {
private final ResourceProperties resourceProperties;
public FaviconConfiguration(ResourceProperties resourceProperties) {
this.resourceProperties = resourceProperties;
}
@Bean
public SimpleUrlHandlerMapping faviconHandlerMapping() {
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
mapping.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
//所有 **/favicon.ico
mapping.setUrlMap(Collections.singletonMap("**/favicon.ico",
faviconRequestHandler()));
return mapping;
}
@Bean
public ResourceHttpRequestHandler faviconRequestHandler() {
ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
requestHandler
.setLocations(this.resourceProperties.getFaviconLocations());
return requestHandler;
}
}
4.3.2 "/**"访问当前项目的任何资源,(静态资源的文件夹)
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/",
"/":当前项目的根路径
4.3.2 欢迎页(静态资源文件下找index页面)
“/”映射
4.3.4 所有的**/favicon.ico,都是静态资源文件下。页面标签图标(如tomcat🐱图标)
4.4 thymeleaf
1.导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2.html中引入命名空间
xmlns:th="http://www.thymeleaf.org"
3.语法规则
th: 任意html属性;替换原先属性值
表达式语法:${}获取变量值;*{}; #{}国际化内容;@{}定义url ;~{}片段引用表达式
4.5 SpringMVC自动配置原理(WebMvcAutoConfiguration)
4.5.1 自动配置
ViewResolver(视图解析器:根据方法的返回值得到视图对象view,视图对象决定如何渲染)
4.5.2 自动注册
Converter:转换器
Formatter:格式化器
4.5.3 HttpMessageConverters
- Springmvc用来转换http请求和相应的;User--Json;
-
HttpMessageConverters:是从容器中确定
4.5.4 MessageCodeResolver
定义错误代码生成规则
4.5.5 ConfigurableWebBindingInitializer
初始化web数据绑定器
请求数据===javabean
4.6如何修改Springboot的默认配置
模式:
- Springboot在自动配置很多组件的时候,先看容器中有没有用户自动配置的(@Bean,@Component)。有就用用户的,没有就自动配置;如果组件可以有多个 组合用户与自己默认的配置
- Springboot中有很多xxxconfigurer帮助我们进行扩展配置
4.7扩展及全面接管Springmvc
- @EnableWebMvc将WebMvcConfigurationSupport组件导入进来;
- 导入WebMvcConfigurationSupport的只是springmvc的最基本的功能
4.8国际化
步骤:
- 编写国际化配置文件,抽取页面需要显示的国际化消息
- Springboot自动配置了管理国际化资源文件的组件
原理:
国际化Locale(区域信息对象):LocaleResolver(获取区域对象信息)
4.9登陆及拦截器
public class LoginHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { Object loginUser = httpServletRequest.getSession().getAttribute("loginUser"); if(loginUser == null){ httpServletRequest.setAttribute("message","没有权限请先登录!"); httpServletRequest.getRequestDispatcher("/index.html").forward(httpServletRequest,httpServletResponse); return false; } return true; }
##WebMvcConfig中添加自定义拦截器实现
@Override
public void addInterceptors(InterceptorRegistry registry) {
//Springboot已经做好静态资源映射
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login");
}
4.10注册Servlet三大组件【Servlet、Filter、Listener】
由于Springboot默认以jar的方式启动嵌入式的servlet容器来启动Springboot的web项目,没有web.xml文件。
注册三大组件用以下方式
//配置嵌入式servlet容器
@Bean public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){ return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) { configurableEmbeddedServletContainer.setPort(8083); } }; } //注册三大组件 //Servlet -> ServletRegistrationBean @Bean public ServletRegistrationBean myServlet(){ ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new MyServlet(), "/"); return servletRegistrationBean; } //Filter -> FilterRegistrationBean @Bean public FilterRegistrationBean myFilter(){ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new MyFilter()); filterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet")); return filterRegistrationBean; } //Listener -> ServletListenerRegistrationBean @Bean public ServletListenerRegistrationBean myListener(){ return new ServletListenerRegistrationBean<MyListener>(new MyListener()); }
六、Spring Boot与数据访问
spring: datasource: username: root password: 123456 url: jdbc:mysql://192.168.56.11:3306/jdbc driver-class-name: com.mysql.jdbc.Driver
七、Spring Boot启动配置原理
7.1启动原理
- 创建SpringApplication对象
//保存主配置类 if (sources != null && sources.length > 0) { this.sources.addAll(Arrays.asList(sources)); } //判断当前是否一个web应用 this.webEnvironment = deduceWebEnvironment(); //从类路径下找到META-INF/spring.factories配置的所有ApplicationContextInitializer;然后保存起来 setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class)); //从类路径下找到ETA-INF/spring.factories配置的所有ApplicationListener setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); //从多个配置类中找到有main方法的主配置类 this.mainApplicationClass = deduceMainApplicationClass();
7.2运行流程
7.3自动配置原理
八、Spring Boot自定义starters
@Configuration //指定这个类是一个配置类 @ConditionalOnXXX //在指定条件成立的情况下自动配置类生效 @AutoConfigureAfter //指定自动配置类的顺序 @Bean //给容器中添加组件 @ConfigurationPropertie结合相关xxxProperties类来绑定相关的配置 @EnableConfigurationProperties //让xxxProperties生效加入到容器中 自动配置类要能加载 将需要启动就加载的自动配置类,配置在META-INF/spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
模式:
启动器只用来做依赖导入;
专门来写一个自动配置模块;
mybatis-spring-boot-starter;自定义启动器名-spring-boot-starter
九、Spring Boot与缓存
十、Spring Boot与消息
十一、Spring Boot与检索
十二、Spring Boot与任务
十三、Spring Boot与安全
十四、Spring Boot与分布式
十五、Spring Boot与开发热部署
十六、Spring Boot与监控管理