• springboot1:项目启动


    1.启动springboot引入的依赖(pom.xml的配置)

    • 引入父项目(依赖管理)
      父项目的父项目中声明了所有需要依赖的版本号(自动版本仲裁机制)
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.3.4.RELEASEversion>
        parent>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 如果需要其他版本
      在父项目的父项目中查找到对应依赖的version版本的key
      然后在当前pom.xml中的key中规定版本号即可(例如mysql驱动)
    <properties>
    	<myesql.version>5.0<mysql.version>	
    properties>
    
    • 1
    • 2
    • 3
    • starter场景启动器
      引入starter场景启动器,已经包含所有常规需要的依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    +所有场景底层依赖
    都有spring-boot-starter的依赖,此为springboot自动配置的核心依赖

    • 简化打包部署策略
      用了一下后可以直接打包成jar包直接在目标服务器上执行
    <build >
    <plugins>
    <plugin >
    <groupId> org.springframework.boot groupId >
    <artifactId> spring- boot-maven- plugin artifactId >
    plugin>
    plugins>
    build >
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.springboot配置好依赖后

    • 书写主程序
      用@SpringBootApplication来声明为一个主程序类
    • 默认扫描:主程序所在的包以及其下面的子包会被默认扫描
      用@springbootapplication自定义扫描包
    • 注意
      • 容器的重要性:
        各种配置文件都是映射到某一个类中,配置文件的值绑定到某一个类中,然后该类在容器中创建对象
      • 按需加载:
        spring-boot-autoconfigure包中虽然包含有很多类,但是如果没有引入对应的依赖,里面的类也不会装配

    3.容器功能的组件配置

    • @Configuration设置当前类为配置类(用来导入bean的或者初始化等同于xml文件)
      • 参数proxyBeanMethods = false,表明我们当前的类为正常类,可以通过方法获取一个新的组件(调用方法返回为新创建)
      • 参数proxyBeanMethods = true,表明我们当前类为代理类,装入容器时运用代理类装入,调用方法时用代理类的方法,即会到容器中查找(调用方法返回仍为容器中)
      • 使用中:组件依赖设置为true,其他为false
      • @bean 设置当前类中的方法(方法名为bean id 返回类型为bean 的类型 返回值为具体组件)
    • @Impont({User.class,DBHelper.class}) 声明在配置类中
      导入这两个类到容器中(调用无参构造)
    • @ConditionalOnMissingBean(name = “tom”)声明在当前类中
      只有当bean中没有tom时,才会注入当前类中的bean
    • @ImportResource(“classpath:beans.xml”) 声明在配置文件中
      引入原生的配置文件
      • 里面可以配置各种bean
    • @Component @ConfigurationProperties(prefix = “mycar”) 两者都声明在当前类中
      为当前类自动装配并且运用springboot的配置文件中的mycar.属性来初始化bean
    • @EnableConfigurationProperties(car.Class) 声明在配置类中@ConfigurationProperties(prefix = “mycar”)声明在当前类中

    4.自动配置原理

    4.1拆分注解

    • @SpringBootApplication可分为一下注解
      • @SpringBootConfiguration 代表当前是一个配置类
      • @EnableAutoConfiguration
        • @AutoConfigurationPackage 自动配置包
          给容器中导入指定包下的所有组件
          利用Registere给容器中导入一系列组件,传入参数为当前主类名,然后再register中会将该类所在的包下的所有组件批量注册
        • @Import({AutoConfigurationImportSelector.class})给容器中批量导入组件
          利用getAutoConfigurationEntry(annotationMetadata)方法中获取候选配置组件,里面会默认扫描当前所有包中的META-INF/spring.factories的文件,spring-boot-autoconfigure中的META-INF/spring.factory下写死了启动的容器中加载的配置组件(?AutoConfiguration),其包有127个场景自动配置默认全部加载,最终按需配置
        • 按需配置:里面全都有按条件加载的注解,并不能完全装在ConditionalOnMissingBean(name = “tom”)声明在当前类中
      • @ComponentScan(com.atguigu.boot) 代表一个包扫描
        指定扫描的包

    4.2注解底层

    • 例如是否导入DispacherServlet组件
      • 找到@SpringBootApplication下的@EnableAutoConfiguration 下的@Import({AutoConfigurationImportSelector.class})中默认扫描
      • 找到spring-boot-autoconfigure中的默认扫描位置中中找到了DispacherServletAutoconfigure
      • 在包中找到了DispacherServletAutoconfigure的配置类
      • 在配置类中看是否满足按需加载的条件(满足)
      • 配置类中有一个@bean就返回了DispacherServlet类型的组件
        这个bean中已经配置好了关于DispacherServlet的配置
      • 故导入了DispacherServlet
    • 例如是否导入文件解析器组件(防止用户配置的上传解析器名字不符合规范)
      • 前面寻找方式一样
      • 最后再配置类中有一个@bean返回了一个文件解析器组件
        • 其中要求容器中有这个类型的组件
        • 容器中没有默认名的这个组件
      • @bean的方法传入文件解析器类型的组件(@bean的形参传入的对象默认都会在容器中寻找)
      • 该@bean直接返回了该组件(并且修改了名字为默认名)
    • 例如是否导入文件解析器(用户有了就用用户的,没有则创建)
      • 前面寻找方式相同
      • 最后判断@ConditionOnMissiongBean没有则创建,有则不创建
    • 总结
      • springboot先加载所有的自动配置类
      • 每个自动配置类按照条件进行生效,默认都会绑定配置中指定的值。即properties和配置类(bean)进行了绑定。注意:该值可以在我们的application.properties中进行配置(全都有默认值)
      • 每个生效的配置类会给容器中装配很多组件
      • 只要容器中有这些组件,这些功能就有
      • 只要用户有自己配置的,则以用户的为准
    • 获取值
      • autoconfiguration(加载配置类)
      • 组件(配置类生效后创建bean)
      • ?properties也为一个配置类(bean的默认值从?properties配置类中获取)
      • 最终回归到application.properties的配置的前缀中
    • 例如获取缓存的配置
      • 找到依赖包的spring-boot-autoconfigure-2.3.4.RELEASE.jar
        • 其下的META-INF/spring.factories包含了导入的配置
      • 在org中找到cache下的CacheAutoConfiguration
      • CacheAutoConfiguration的配置文件@EnableConfigurationProperties({CacheProperties.class})
      • 然后找到CacheProperties类
        @ConfigurationProperties(prefix = “spring.cache”)
      • 最终我们只需要在application.properties中写spring.cache.XXX来配置即可

    4.3最佳实践

    • 引入场景依赖
      https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
    • 查看自动配置(选底层原理)
      debug=true 开启自动配置
      \negetive不生效 \positive生效
    • 是否需要修改
      • 参照文档修改配置
        • https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter

        • 例如:如下可以自定义启动图片
          在这里插入图片描述

        • 自己分析 绑定了哪些前缀(观看源码)

      • 自定义或者替换组件
        • @bean,@conponent
      • 自定义器

    5.开发技巧

    5.1 lombok

    • 开发javabean 有参无参 setget 重写tostring
    • 在Controller中引入slf4j的日志功能
    • 步骤
      • 引入依赖
      • 安装插件plugin(在setting中的插件搜索下载)
      • 使用注解
        • @Data 生成get set方法
        • @ToString 生成tostring方法
        • @AllArgsConstructor和@NoArgsConsturctor为有参无参构造器(定制构造器自己写)
    		<dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4

    5.2 dev-tools

    • 热更新 项目实时改变 ctrl F9即可实时改变(重写编译一遍)
      严格意义上检测到文件有变化 则重启
      如果是静态文件,则不重启,直接用
    • 使用:
       <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-devtoolsartifactId>
            <optional>trueoptional>
        dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5.3 spring initializr(项目初始化向导)

    • 直接可以选择依赖
    • 直接帮我们创建好文件结构
      • 创建springboot的核心配置文件
      • 创建了主程序
  • 相关阅读:
    Django之Session
    使用U3D、pico开发VR(二)——添加手柄摇杆控制移动
    3-网络架构和Netty系列-Java NIO三件套Buffer、Selector、Channel
    cnn和rnn可以结合使用吗,rnn和cnn优点缺点对比
    【Node.js】模块化:
    【2021最新版】Spring Cloud面试题总结(35道题含答案解析)
    三种经典的缓存使用模式
    使用Redis实现缓存及对应问题解决
    5 个最令人兴奋的 ES13 功能
    4、FFmpeg命令行操作7
  • 原文地址:https://blog.csdn.net/qq_44724899/article/details/127849336