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自带的日志 等等

  1. 将系统中其他日志框架排除
  2. 用中间包代替原有的日志框架
  3. 导入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:日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能

3.3 切换日志框架

可以按照slf4j的日志适配图,进行相关的切换;

四、Spring Boot与Web开发

4.1 使用springboot创建各种场景(web、redis等)

  1. 创建springboot应用,选中我们需要的模块(web、jdbc、redis等)
  2. springboot已经默认将这些场景配置好了,只需要在配置文件中 指定少量配置就可以运行
  3. 自己编写业务

4.2 自动配置原理(各个场景springboot都给我们配置了什么?修改&扩展)

  1. xxxxAutoConfiguration:帮我们给容器中自动配置组件;
  2. 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的默认配置

模式:

  1. Springboot在自动配置很多组件的时候,先看容器中有没有用户自动配置的(@Bean,@Component)。有就用用户的,没有就自动配置;如果组件可以有多个 组合用户与自己默认的配置
  2. Springboot中有很多xxxconfigurer帮助我们进行扩展配置

4.7扩展及全面接管Springmvc

  1. @EnableWebMvc将WebMvcConfigurationSupport组件导入进来;
  2. 导入WebMvcConfigurationSupport的只是springmvc的最基本的功能

4.8国际化

步骤:

  1. 编写国际化配置文件,抽取页面需要显示的国际化消息
  2. 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启动原理

  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,\

模式:

启动器只用来做依赖导入;

专门来写一个自动配置模块;

启动器依赖自动配置;别人只需要引入启动器(starter)

mybatis-spring-boot-starter;自定义启动器名-spring-boot-starter

九、Spring Boot与缓存

十、Spring Boot与消息

十一、Spring Boot与检索

十二、Spring Boot与任务

十三、Spring Boot与安全

十四、Spring Boot与分布式

十五、Spring Boot与开发热部署

十六、Spring Boot与监控管理

 

posted @ 2020-09-28 17:38  闲卿逸致  阅读(221)  评论(0编辑  收藏  举报