SpringBoot入门到精通-SpringBoot入门(二)

SpringBoot入门到精通-SpringBoot入门(二),第1张

SpringBoot入门到精通-SpringBoot入门(二)

SpringBoot入门到精通系列

SpringBoot入门到精通-Spring的注解编程(一)SpringBoot入门到精通-SpringBoot入门(二)SpringBoot入门到精通-Spring的基本使用(三)SpringBoot入门到精通-SpringBoot集成SSM(四)


前言

经过上面的学习,我们已经掌握的Spring的注解式编程,有此基础后我们再学习SpringBoot就易如反掌,因为SpringBoot就是基于Spring的注解式编程进行开发。接下来我们就正式开始SpringBoot部分内容的学习,先来做个入门程序。

三.SpringBoot入门程序

我们来玩一个入门案例,使用SpringBoot编写一个简单的WEB程序,使用浏览器访问后台能够返回一个“Hello Spring Boot”即可。那么我么思考一下,如果我么使用SpringMVC来做这个案例需要做哪些事情?

    创建一个web工程(打包方式为 war)导入Spirng相关,SpringMVC相关,Jackson相关,日志相关等等一大堆jar包。web.xml中配置:前端控制器DispatcherServlet;编码过滤器;配置上下文参数(指定Spring的xml配置文件地址)等编写SpringMVC的xml配置文件,然后里面配置一堆东西编写Controller,编写方法

总之,使用SpringMVC编写这个web程序是非常麻烦的,那么我们看一下使用SpirngBoot来实现又什么区别

1.搭建HelloWorld

你可以参照官方该文档去搭建 ,也可以按照我下面的步骤来搭建

1.1.创建工程

注意,创建工程的时候选择骨架选择 quickstart(普通的jar项目即可),当然也可以不选择骨架,默认就是普通java项目。总之不要创建一个webapp项目(这是为什么呢??)

1.2.导入相关依赖
jar


    org.springframework.boot
    spring-boot-starter-parent
    2.2.5.RELEASE


    
        org.springframework.boot
        spring-boot-starter-web
    

spring-boot-starter-parent是SpringBoot提供的工程 ,spring-boot-starter-web是SpringBoot整合SpringMVC的依赖。此刻你可能会有些疑问,后面我再解释,稍安勿躁。

1.3.创建配置

配置类也是启动类,贴上@SpringBootApplication最,提供一个main方法来启动应用

@SpringBootApplication
public class ApplicationConfig {

    public static void main(String[] args) {
        //启动程序
        SpringApplication.run(ApplicationConfig.class);
    }
}

1.4.编写Controller
@RestController
public class HelloController {
	
	@RequestMapping("/hello")
	public String hello() {
		return "Hello Spring Boot";
	}
}

代码到这里编写完成,项目结构如下

1.5.启动Main方法测试

控制台启动效果

端口默认是8080 , 使用浏览器访问 http://localhost:8080/hello,效果如下

在一开始我们就有知道,SpringBoot是用来简化Spring应用的搭建和开发,使用了SpringBoot之后确实简单了很多,集成速度也快了很多。但是在简单的背后意味着复杂的封装。

2.HelloWorld分析

完成了上面案例相信你也看到了测试效果,此刻你或许有很多地方不理解,比如:pom.xml为什么只需要导入一个jar包,为什么web项目使用的是平通java项目的结构;为什么不在需要web.xml; 使用main方法就能启动程序等等。下面我们一一解答

2.1.pom.xml分析

pom中有3个点是需要给大家讲一下的

    打包方式:jar使用引入了一个 spring-boot-starter-parent 工程导入了一个 spring-boot-starter-web 依赖包

【重要】对于SpringBoot而言即使是开发WEB项目也是采用普通java项目的结构,打包方式默认使用个jar ,也不再需要WEB-INF/web.xml等结构。当然SpringBoot也可以使用 war的方式来打包项目,这个我们后面再说。

可以看做是Java中的 extends,用来继承一个父项目后就可以使用该项目中的依赖,对于 spring-boot-starter-parent而言该项目是SpringBoot的父项目,它提供了基础依赖和插件管理。进入到spring-boot-starter-parent的pom.xml中我们可以看到它又使用继承了一个 spring-boot-dependencies 工程,如下(ctrl + 左键):


    org.springframework.boot
       
    spring-boot-dependencies
    2.2.5.RELEASE
    ../../spring-boot-dependencies
  
  spring-boot-starter-parent
  pom
  Spring Boot Starter Parent
  Parent pom providing dependency and plugin management for applications
		built with Maven
  https://projects.spring.io/spring-boot/#/spring-boot-starter-parent
  
    UTF-8
      
    1.8
    @
    ${java.version}
    UTF-8
    ${java.version}
  

可以看到,spring-boot-starter-parent 继承了 spring-boot-dependencies ,它的打包方式是 pom, 默认使用的是JDK版本是1.8,我们可以在自己项目的pom.xml中通过 1.7 来修改JDK版本。

真正管理依赖的是其实是 spring-boot-dependencies ,安装ctrl点击进去可以看到 ,该项目的中管理了很多很多的version, 在其 dependencyManagement中管理了很多很多的基础依赖,在其 pluginManagement 中管理了很多是插件。

总之:【重要】我们要使用SpringBoot就需要通过继承spring-boot-starter-parent ,该父工程为我们管理了很多很多的依赖和插件,如果我们要使用某个依赖,只需要在我们自己的项目的pom引入,无需指定版本号,因为SpringBoot已经帮我们把版本号管理起来了。比如我们要导入一个测试包,就在自己的项目的pom.xml这样导入

 
     junit
     junit

无需导入版本号,因为父工程已经管理起来了,除非你要修改默认的版本。

在导入 spring-boot-starter-web 的时候我们也是么有指定版本号,可想而知该依赖是被spring-boot-starter-parent管理起来了的,那么该依赖的作用是什么呢?看名字能够猜到,它是SpringBoot和WEB环境整合的一个依赖。我们可以打开该依赖的结构查看一下

【重要】可以看到,一个spring-boot-starter-web导入了很多的其他依赖,如:Spring的基础依赖,SpringMVC的基础依赖,Jackson基础依赖,日志基础依赖,Tomcat的依赖,自动配置的依赖,所以这个spring-boot-starter-web把集成Web环境所需要的所有依赖都导入进来了。你似乎明白点什么了?

【重要】顺便解答一个问题:为什么不需要部署Tomcat? 因为 spring-boot-starter-web 已经导入了一个tomcat(SpringBoot内嵌Tomcat),当我们启动main方法时,底层就会启动内嵌的Tomcat,不在需要我们自己部署。

2.2.启动类分析

下面我们来分析启动类,也就是配置类。在之前我们学习Spring的Java Config有说过,就是使用一个Java类来取代Spring的xml配置作为配置文件,SpringBoot就是使用Spring的Java Config配置。所以我们刚才的 ApplicationConfig 就是一个配置类,同时它提供了一个main方法来启动项目,所以也是启动类。有两个东西需要分析

    注解:@SpringBootApplication启动:SpringApplication.run(ApplicationConfig.class)

@SpringBootApplication 是SpringBoot提供的一个复合注解,它由三个注解组成,源码如下

//配置注解,该注解上又贴了一个 @Configuration
@SpringBootConfiguration
//开启自动配置
@EnableAutoConfiguration
//Spring IOC自动扫描
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanbasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class[] scanbasePackageClasses() default {};

    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

【重要】@SpringBootApplication 包含了三个注解

@SpringBootConfiguration :该注解的本质其实就是一个 @Configuration 配置注解,标记某个类成为配置类@EnableAutoConfiguration :开启SpringBoot自动配置的注解,比如我们集成SpringMVC并没有配置DispatcherServlet前端控制器,但是这个东西一定是存在的,就是SpringBoot帮我们自动配置好了。@ComponentScan :这个在讲Spring的Java Config就有介绍,它是Spring IOC的自动扫描的注解,默认扫描当前包及其子包中的打了 @Component;@Repository;@Service;@Controller 注解的类。也就是说我们的HelloController其实已经被启动类默认扫描到了。该注解中还提供了 exclude 可以让我们去排除某些类不需要被Spring注册。也可以通过 scanbasePackages 来修改扫描的包路径

【重要】也就是说标记了 @SpringBootApplication 注解的类,即是一个Spring的配置类,也拥有IOC自动扫描的能力,同时开启了SpringBoot的自动配置的能力。

对于main方法中的 SpringApplication.run 我们知道它的作用是用来启动程序的,该方法会初始化好SpringBoot的环境,并创建AnnotationConfigApplicationContext作为Spring的IOC容器类,然后会执行容器类的 refresh 方法进行刷新。加载Bean,注册Bean,实例化Bean,自动配置,内嵌的Tomcat启动都在该方法中。具体细节后面会专门说到,这里就做讨论了。

2.3.小扩展

dependencyManagement 和 dependencies

我们在SpringBoot的父项目中有看到 dependencyManagement 元素,那么在该元素中的依赖和 放在 dependencies中的依赖有什么区别呢?放在dependencies中的依赖是可以直接使用的,放在 dependencyManagement 中的依赖只是起到了声明或管理的作用,其中的依赖还不能直接使用,需要在dependencies引入才能使用。

那dependencyManagement有什么意义?它的意义就是管理版本,通常在父项目中使用 dependencyManagement 管理依赖,在子项目中dependencies导入依赖,然后无需版本号引入,因为版本号交给父项目管理了。SpringBoot就是这样干的。

packaging为jar和war的区别

我们需要在pom中指定 jar 来标记项目的打包类型,有四种类型可以指定

jar : 打jar包,执行maven的 package命令 就可以把项目打成一个 xx.jar ,这种打包用在普通java项目,SpringBoot默认打jar包。war :打 war 包,执行maven的 package命令 就可以把项目打成一个 xx.war ,如果是传统的SpringMVC开发的项目就是一个war的项目。pom :这种打包方式代表该项目是用来管理依赖的项目,不需要写任何java代码,通常是一个父项目,被子工厂来继承,比如SpringBoot的父项目 spring-boot-starter-parent 就是打 pom 包。maven-plugin :这个比较少用,它是用来开发maven插件的。 3.项目结构认识

SpringBoot项目标准结构如下

代码存放于java 目录 , resources目录中包括

static : 静态资源目录,比如css,js,html都放在该目录,类似于以前的webapp目录。默认情况下,Spring Boot从classpath下 的 /static ( /public , /resources 或 /meta-INF/resources )文件夹, 或从 ServletContext 根目录提供静态内容templates :模板文件目录 ,比如xxx.jsp文件就放到该目录,类似于 WEB-INF 目录application.properties : 该文件是SpringBoot默认的配置文件名,如果要对项目做一些自定义的配置就修改该文件的内容即可,比如要修改端口,我们加入如下内容 server.port=8181 。还有一个默认配置是application.yml ,这个我们后面再说。 4.创建项目的三种方式

下面介绍SpringBoot项目的几种创建方式第一种是手动创建,刚才我们已经演示过了 ,第二种是使用Spring官方提供的快捷创建网站 https://start.spring.io/

通过网站可以直接配置项目属性,添加依赖,然后点击 generate 生成项目,网站会下载一个基础的SpringBoot项目。

第三种是通过IDEA的Spring Initializr 创建,如下

对项目做相关配置

选择需要的jar包

点击下一步,项目创建成功

5.SpringBoot的特点总结

根据上面Hello分析我们可以总结出SpringBoot的一些特点

SpringBoot基于Spring高度封装,使用简单高效,很容易就能继承三方框架,比如继承SpringMVC就需要导入一个spring-boot-starter-web即可。SpringBoot基于Spring的注解式配置,无需xml,简化了大量的配置SpringBoot的父项目帮我们管理了很多的基础依赖和不能,大大简化了mavenSpringBoot内嵌了Tomcat,使用main方法即可启动,部署简单SpringBoot自动配置功能让配置更加简单

一个字,爽 , 但是缺点就是封装的太深,你需要花费很大的精力去了解它的封装过程。

文章就到这里把,喜欢的话请一定给个好评哦,喜欢的话请一定给个好评哦,喜欢的话请一定给个好评哦。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5703372.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存