• SpringBoot入门学习之基础篇(一)搭建和SpringBoot构成结构


    入门案例

    Spring和SpringBoot对比

    一、原有Spring优缺点分析

    1.Spring的优点分析
    Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的EnterpriseJavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。

    2.Spring的缺点分析
    虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。
    所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。
    除此之外,项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。

    二、SpringBoot的概述

    1.SpringBoot解决上述Spring的缺点
    SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
    2.SpringBoot的特点
    为基于Spring的开发提供更快的入门体验开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式。

    三、SpringBoot的核心功能

    1起步依赖
    起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
    2自动配置
    Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。

    类/配置文件SpringSpringBoot
    pom文件坐标手工添加勾选添加
    web3.0配置类手工添加
    Spring/SpringMVC配置类手工添加
    控制器手工添加手工制作

    SpringBoot可以通过idea、官网和手工快速搭建

    idea搭建位置
    在这里插入图片描述

    官网搭建

    https://start.spring.io/

    国内地址;

    https://start.springboot.io

    阿里版本

    https://start.aliyun.com/

    也可以在idea中把地址给换一下

    总结

    SpringBoot程序需要基于jdk8进行制作

    SpringBoot可以通过勾选选择技术

    运行Application程序入口来进行运行

    在idea中屏蔽不展示的文件

    在这里插入图片描述

    SpringBoot简介

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。

    1.Spring的优点分析
    Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的EnterpriseJavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。

    2.Spring的缺点分析
    虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。
    所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。
    除此之外,项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。

    入门案列解析

    parent

    对于parent通俗的讲,SpringBoot使用的相关jar包所依赖的版本号都在parent中定义,当让也并非仅限于如此。

    基本功能
    当我们创建SpringBoot项目时,可以继承自一个spring-boot-starter-parent,也可以不继承自他。我们先来看看parent的基本功能有哪些?

    1、定义了java编译版本为1.8

    2、使用UTF-8的格式

    3、继承自spring-boot-dependencies,这里面定义了依赖的版本,正式因为这里面定义 了依赖的版本,所以我们在写依赖时才不用写版本号

    4、执行打包操作的配置

    5、自动化资源过滤

    6、自动化的插件配置

    7、针对application.properties和application.yml的资源过滤,包括profile定义的不同环境的配置文件,例如application-dev(pro).properies和application-dev(pro).yml

    如图:

    在这里插入图片描述

    我们可以看到,他继承自 spring-boot-dependencies,另外还可以看到jdk版本,编码格式,过滤信息等。下面我们再来看看spring-boot-dependencies中的定义
    在这里插入图片描述
    这里我们可以看到真对版本的定义和dependencyManagement节点,这下明白SpringBoot项目中部分依赖不需要写版本号了吧。

    不用parent

    在我们日常开发中并非所有的公司都需要这个parent,有的时候公司会自己定义parent,我们的SpringBoot项目要继承公司自己定义的parent,这个时候我们改如何办呢?

    一个简单的办法就是我们自己定义一个dependencyManagement节点,然后在里面自己定义好版本,在接下来的引用依赖时就不用写版本号了。

    例如:

    
    	
    		
    			org.springframework.boot
    			spring-boot-dependencies
    			2.1.4.RELEASE
    			pom
    			import
    		
    	
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这样写过之后,依赖的版本号是解决了,但是关于打包的插件,jdk版本,编码格式等这些配置,在没有parent的时候这些都需要自己区配置
    总结:

    1.开发SpringBoot程序要继承个spring-boot-starter-parent

    2.spring-boot-starter-parent中定义若干个依赖管理

    3.继承parent模块可以避免多个依赖使用相同技术时出现的版本冲突

    4.继承parent的形式也可以采用引入依赖的形式实现效果

    starter

    用过springboot的同学都知道,相比于spring在配置pom文件时候的各种复杂依赖关系,springboot整合了很多的第三方依赖使用起来相当的方便。

    在使用的过程中,我们经常能在pom文件中看到很多springboot的starter依赖,starter中简单来讲就是引入了一些相关依赖和一些初始化的配置。

    例如我们最常见的

    
      org.springframework.boot
      spring-boot-starter-web
    
    
    • 1
    • 2
    • 3
    • 4

    当然,除此以外,还有很多的类似依赖,比如下面截图的这些官方的starter依赖。
    在这里插入图片描述
    仔细观察,不难发现spring-boot-starter-***的形式,其实这是springboot的官方命名规则。

    非官方的命名方式就是***-spring-boot starter的形式(如下mybatis框架的依赖),当然这些都是约定俗成的,不是强制性的,你说我就想自定义一个spring-boot-starter-***形式的,你开心就好,完全可以,做好被骂的觉悟就行了。
    在这里插入图片描述

    自定义starter

    实战
    创建一个父maven项目:springboot_custome_starter
    新建一个maven工程, 父工程,pom类型 , src 目录 和 IDEA自动创建的.md文件,删除掉
    在这里插入图片描述
    pom 如下

    
    
        4.0.0
        
            org.springframework.boot
            spring-boot-starter-parent
            2.3.6.RELEASE
             
        
        pom
        com.artisan.customstarter
        starter
        0.0.1-SNAPSHOT
        starter
        SpringBoot自定义starter
        
            1.8
        
        
            
                org.springframework.boot
                spring-boot-starter
            
    
        
    
        
            
                
                
                    org.apache.maven.plugins
                    maven-source-plugin
                    
                        true
                    
                    
                        
                            compile
                            
                                jar
                            
                        
                    
                
            
        
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    创建 两个Module: artisan-spring-boot-starter 和 artisan-spring-boot-starter-autoconfigurer
    在这里插入图片描述在这里插入图片描述

    同样的方式创建

    在这里插入图片描述

    artisan-spring-boot-starter (空的jar文件,仅仅提供辅助性依赖管理)
    pom

    
    
        
            starter
            com.artisan.customstarter
            0.0.1-SNAPSHOT
        
        4.0.0
        
            启动器(starter)是一个空的jar文件,
            仅仅提供辅助性依赖管理,
            这些依赖需要自动装配或其他类库。
        
    
    
    
        artisan-spring-boot-starter
    
        
            
            
                com.artisan.customstarter
                artisan-spring-boot-starter-autoconfigurer
                0.0.1-SNAPSHOT
            
    
            
        
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    如果使用spring Initializr创建的需要删除 启动类、resources下的文件,test文件。
    在这里插入图片描述

    artisan-spring-boot-starter-autoconfigurer
    pom

    
    
        
            starter
            com.artisan.customstarter
            0.0.1-SNAPSHOT
        
        4.0.0
    
        artisan-spring-boot-starter-autoconfigurer
    
    
        
            
                org.springframework.boot
                spring-boot-starter-web
            
            
            
                org.springframework.boot
                spring-boot-configuration-processor
                true
            
    
    
        
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    关于自动提示的jar ,引入spring-boot-configuration-processor之后, 编译之后就会在META-INF文件夹下面生成一个spring-configuration-metadata.json的文件。
    在这里插入图片描述
    内容如下
    在这里插入图片描述
    【工程结构】
    在这里插入图片描述
    CustomProperties

    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    /**
     * @author 大佬发的精美代码感谢大佬们
     * @version 1.0
     * @description:  属性配置文件
     * @date 2021/5/22 18:56
     * @mark: show me the code , change the world
     */
    
    @ConfigurationProperties("artisan.custom")
    public class CustomProperties {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    IndexController

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author 大佬发的精美代码感谢大佬们
     * @version 1.0
     * @description: TODO
     * @date 2021/5/22 18:58
     * @mark: show me the code , change the world
     */
    
    @RestController
    public class IndexController {
    
        private CustomProperties customProperties;
    
        public IndexController(CustomProperties customProperties) {
            this.customProperties = customProperties;
        }
    
        @RequestMapping("/")
        public String index() {
            return customProperties.getName();
        }
    
    }
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    CustomAutoConfiguration 自动配置类

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @author 大佬发的精美代码感谢大佬们
     * @version 1.0
     * @description: 模拟给web应用自动添加一个首页
     * @date 2021/5/22 18:55
     * @mark: show me the code , change the world
     */
    
    
    @Configuration
    @ConditionalOnProperty(value = "artisan.custom.name")
    @EnableConfigurationProperties(CustomProperties.class)
    public class CustomAutoConfiguration {
    
    
        @Autowired
        CustomProperties cus;
    
        @Bean
        public IndexController indexController() {
            return new IndexController(cus);
        }
    
    
    }
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    spring.factories
    在 resources 下创建文件夹 META-INF 并在 META-INF 下创建文件 spring.factories ,内容如下:
    在这里插入图片描述

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      com.artisan.CustomAutoConfiguration
    
    • 1
    • 2

    打包发布
    到这儿,我们的配置自定义的starter就写完了 ,我们artisan-spring-boot-starter 和 artisan-spring-boot-starter-autoconfigurer 安装成本地jar包。
    在这里插入图片描述
    引用自定义starter测试
    新建个spring boot 项目 ,引用刚才的starter
    在这里插入图片描述
    访问 http://localhost:8080/
    在这里插入图片描述
    咦 ,别忘了你自定义的属性
    在这里插入图片描述

    重启后,重新访问
    在这里插入图片描述
    因为我们开启了debug=true .找找我们自动装配的类看看
    在这里插入图片描述

    starter和parent的对比

    starter
    SpringBoot在常见的项目名称定义了当前项目使用的所有依赖坐标,已达到减少依赖配置的目的
    parent
    所有SpringBoot项目要继承的项目定义了若干坐标版本号以达到减少依赖冲突的目的。
    spring-boot-starter-parent各版本存在着诸多坐标版本不同

    总结

    开发SpringBoot需要导入坐标通常导入对应的starter
    每一个starter根据功能不同,通常包含多个依赖坐标
    使用starter可以实现快速配置的效果,达到简化配置的目的

    启动方式

    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
    SpringBoot工程运行初始化Spring容器,扫描引导类所在的包加载bean

    总结

    SpringBoot工程提供引导类来启动程序
    SpringBoot工程运行后创建并初始化Spring容器

    辅助功能

    使用Maven依赖管理变得更起步依赖项

          
                org.springframework.boot
                spring-boot-starter-web
                
                
                    
                        org.springframework.boot
                        spring-boot-starter-tomcat
                    
                
            
            
            
                org.springframework.boot
                spring-boot-starter-jetty
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    jetty比tomcat更轻量级、可扩展性更强

    内部服务器
    tomcat(默认) apache出品,粉丝多、应用面广、负载了若干较重的组件
    jetty 更轻量级,负载性能远不及tomcat
    undertow undertow,负载性能勉强跑赢tomcat

    总结

    内嵌Tomcat服务器是springboot辅助功能之一
    内嵌tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器进行管理
    变更内嵌服务器思想是去除现有的服务器,添加全新的服务器

  • 相关阅读:
    国际站、速卖通、Lazada店铺运营技巧?如何提升销量?
    Python数组问题
    【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理
    【无标题】
    iOS——类与对象底层探索
    HTML如何制作公司网站首页(web前端期末大作业)
    ArrayList 和 LinkedList 之间应该怎么选择
    Spring Data【Spring Data 介绍、Spring Data JPA 、Spring Data JDB】(一)-全面详解(学习总结---从入门到深化)
    小啊呜产品读书笔记001:《邱岳的产品手记-15》第28讲 产品分析的套路(上):谁是利益相关者?& 29讲产品分析的套路(中):解决什么问题?
    二叉树类题目 力扣
  • 原文地址:https://blog.csdn.net/weixin_53998054/article/details/126130724