那些不为人知的SpringBoot那些事儿

一、SpringBoot简介

1.1 概念
  • 随着动态语言的流程(Ruby,Node.js),Java的开发显得格外笨重:配置繁多、开发效率低、项目部署复杂以及集成第三方技术难度大。
  • 在这种情况下,SpringBoot就应运而生。采用"习惯优于配置/约定大于配置"的理念让项目可以快速的运行起来(将大量的约定俗成的习惯性配置内置到项目中,我们无需再手动配置)。
  • 使用SpringBoot可以很容易的创建一个能够独立运行的准生产级别的基于Spring框架的项目,使用SpringBoot你可以不用或者很少进行Spring配置。
  • SpringBoot采用了习惯优于配置的理念快速的搭建项目开发环境,我们无需或者很少进行相关的Spring配置就能够快速的将项目运行起来。
1.2 优点
  • 快速的构建项目
  • 对主流的开发框架都提供无配置集成(SpringBoot内置了配置,无需手动配置)
  • 项目可以独立运行、无需依赖servlet容器(内置了servlet容器)
  • 极大提高了开发、部署效率
  • 提供了运行时监控系统
  • 与云计算有天然的集成
1.3 缺点
  • 版本迭代速度很快,一些模块改动较大
  • 由于配置都是内置的,报错时很难定位
  • 互联网上现成的解决方案资源并不多

二、第一个SpringBoot应用

2.1 File–New–Project

在这里插入图片描述

2.2 填写项目信息

在这里插入图片描述

2.3 选择项目依赖及SpringBoot版本

在这里插入图片描述

2.4 指定项目存储路径
2.5 pom.xml
  • parent:继承了Spring Boot的parent,表示此应用就是一个SpringBoot工程

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
  • starter POM:内置的应用场景,只要在依赖中引入一个starter,那么这个场景所需的依赖都会被传递性的引入

2.6 运行项目
  • 点击src目录下的SpringbootTestApplication类,点击运行按钮,即可运行

三、自定义启动banner

  • 在 Spring Boot 启动的时候会有一个默认的启动图案

      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v2.1.9.RELEASE)
    
  • 我们在 src/main/resources 目录下新建一个 banner.txt,通过
    http://patorjk.com/software/taag

    网站生成字符串,将网站生成的字符复制到 banner.txt 中,再次运行这个程序

佛祖注释代码:


//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//            佛祖保佑       永不宕机     永无BUG                   //

三、SpringBoot的全局配置

3.1 创建SpringBoot应用
3.1.1 使用IDEA的Spring Initializr

限制:如果网络不够流畅,会导致Spring Initializr无法加载,此时我们就可以在线生成SpringBoot应用

3.1.2 使用在线生成SpringBoot应用

地址:https://start.spring.io/

3.2 全局配置文件
  • SpringBoot项目使用了一个全局配置文件application.properties进行项目相关的配置

  • 如果SpringBoot默认的设置无法满足我们的需求,就可以在application.properties来进行修改

    # application.properties文件中的配置的 key 必须遵守 SpringBoot的要求
    server.port=9090
    server.servlet.context-path=/test
    
  • 全局配置文件的格式也支持yml,并且在企业开发中通常使用yml格式进行配置(yaml语言),与properties对比如下:

    • application.properties

      server.port=9090
      server.servlet.context-path=/test
      spring.datasource.url=jdbc:mysql://localhost:3306/test
      spring.datasource.username=root
      spring.datasource.password=1234
      spring.datasource.driver-class-name=com.mysql.jdbc.Driver
      
    • application.yml

      server:
        port: 9090
        servlet:
          context-path: /test
      spring:
        datasource:
          url: jdbc:mysql://localhost:3306/test
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
      

四、Java 配置方式

4.1 如何将一个类配置给Spring容器进行管理呢 ?
  • xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="user" class="com.zy.springboot.test.beans.User"></bean>
    
    </beans>
    
  • 注解配置

    @Component
    public class User {
      //...
    }
    
  • Java配置

    @Configuration
    public class SpringConfig {
    
        @Bean
        public Date getDate(){
            return new Date();
        }
        
    }
    
4.2 Spring版本发展
  • Spring 1.x
    • 所有bean的配置都必须在xml中完成
  • Spring 2.x
    • 基于JDK 1.5对注解的支持,Spring2.x开始使用注解配置
    • 企业开发中到时是使用xml还是注解呢 ?
      • 应用的基本配置用xml,比如:数据源、事务
      • 业务开发方面使用注解,比如:service、controller
  • Spring 3.x
    • 开始提供了基于Java的配置方式
  • Spring 4.x
    • Spring Boot 和Spring4.x 都提倡使用Java配置方式

五、Starter POM

Starter POM,指的是在pom文件中配置的SpringBoot提供的starter

  • 一个Starter我们就可以理解为对一种开发场景的支持

  • SpringBoot为我们提供了简化企业级开发绝大多数场景的支持(多个StarterPOM),在我们的项目中只要使用了对应场景的StarterPOM,相关的技术配置就会被内置进来(消除人工配置),同时我们就可以获得SpringBoot为我们提供的内置的Bean。

  • 案例: redis

    • 在pom.xml中引入redis对应的starter

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-redis</artifactId>
      </dependency>
      
    • 在service中就可以直接使用SpringBoot内置的基于redis的开发场景(直接使用Bean)

      @Service
      public class RedisService {
      
          @Resource
          private RedisTemplate redisTemplate;
      
      }
      
  • SpringBoot支持绝大多数的主流框架(提供对应的starter),但并不是所有;支持的主流框架如下:

    -地址如下: https://docs.spring.io/spring-boot/docs/2.1.9.RELEASE/reference/html/using-boot-build-systems.html#using-boot-starter

六、SpringBoot的自动配置

6.1 运行SpringBoot应用的启动类
@SpringBootApplication
public class SpringbootTestApplication {
	public static void main(String[] args) {
		//SpringApplication.run 启动一个SpringBoot应用
		//run传递的class对象需要有 @SpringBootApplication 注解,
        //SpringBoot应用的加载是从@SpringBootApplication开始
		SpringApplication.run(SpringbootTestApplication.class, args);
	}
}
  • @SpringBootApplication注解:是一个组合注解,包括配置、自动配置、扫描功能的启动
6.2 SpringApplication
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
    // Class[] primarySources  ------------   SpringbootTestApplication.class
    // 相当于SpringbootTestApplication.class-->SpringApplication然后调用run方法
    return (new SpringApplication(primarySources)).run(args);
}

//相当于用SpringbootTestApplication.class调用的此run方法,此run方法中的this就表示我们自己的应用
public ConfigurableApplicationContext run(String... args) {
	//...
    Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();
    //...
    // 获取我们自己的应用程序的Spring对象工厂实例
    exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
    //...
}
private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {
    //...
    Set<String> names = new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type, classLoader));
    //...
}
6.3 SpringFactoriesLoader
public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
    String factoryTypeName = factoryType.getName();
    return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
	//...
    //加载Spring的自动配置文件:
    Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
	//...

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值