SpringBoot的学习(一)

这篇文章是用来记录我学习Springboot的,也欢迎各位大佬指点。

首先SpringBoot帮我们做了什么
SpringBoot的特点
1.基于Spring的开发提供更快的入门体验
2.开箱即用,没有代码生成,也无需XML配置。也支持修改默认配置
3.提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等
SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式。



通常搭建一个基于Spring的web应用,需要以下几个步骤:
1.pom文件中引入相关jar包,包括spring、springmvc、redis、mybaits、log4j、mysql-connector-java 等等相关jar ...
2、配置web.xml,Listener配置、Filter配置、Servlet配置、log4j配置、error配置 ...
3、配置数据库连接、配置spring事务
4、配置视图解析器
5、开启注解、自动扫描功能
6、配置完成后部署tomcat、启动调试

起步依赖:
1.引入jar

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<!--mybatis 开发包-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

<!--springboot web模块支持-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<!--druid 的数据源-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
   <version>1.0.31</version>
</dependency>

其中spring-boot-starter-web包自动帮我们引入了web模块开发需要的相关jar包,mybatis-spring-boot-starter帮我们引入了dao开发相关的jar包。spring-boot-starter-xxx是官方提供的starter,xxx-spring-boot-starter是第三方提供的starter。在这个mybatis-spring-boot-starter 中,并没有任何源码,只有一个pom文件,它的作用就是帮我们引入了相关jar包。

所以起步依赖的原理是将一些特定版本的依赖整合到spring-boot-dependencies项目中,然后其他SpringBoot项目通过Maven的传递依赖继承这些依赖,这样就不用我们自己手动配置Spring组件了。手动创建SpringBoot项目的时候,我们还导入web相关的依赖,相当于SpringMVC框架的引入。





2.配置数据源
starter机制帮我们完成了项目起步所需要的相关的jar包

spring:
  datasource:
    name: druidDataSource
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8
      username: root
      password: 123456
      filters: stat,wall,log4j,config
      max-active: 100
      initial-size: 1
      max-wait: 60000
      min-idle: 1
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: select 'x'
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-open-prepared-statements: 50
      max-pool-prepared-statement-per-connection-size: 20



自动配置的原理
在手动创建Spring boot项目的时候,还创建了一个项目启动类


@SpringBootApplication
public class MySpringbootApplication {

    public static void main(String[] args) {
    SpringApplication.run(MySpringbootApplication.class, args);
    }
}

这个@SpringBootApplication就是默认配置的关键,@SpringBootApplication是Spring Boot的核心注解, 它是一个组合注解,它的核心功能是由@EnableAutoConfiguration注解提供,并由@Import注解导入EnableAutoConfigurationImportSelector类实现自动配置。如下图

image.png

有启动配置和组建扫描比如controller,service,mapper等。我们只要在控制器中添加@Controller注解,SpringBoot项目就会自动识别为控制器的原因,即自动配置的原理。
需要注意的是组建注解扫描的范围是启动类所在的包以及其子包下的所有包。



在启动类里面标注了@Configuration,意味着它其实也是一个 IoC容器的配置类。
@EnableAutoConfiguration:
springboot 应用把所有符合条件的@Configuration 配置都加载到当前 SpringBoot 创建并使用的 IoC 容器中。



spring中使用redis需要在xml定义bean,现在只需要依赖一个spring-boot-starter-data-redis的jar包,jar中定义了RedisConfiguration,当启动的时候spring会自动装载RedisConfiguration,那spring是如何知道配置类在哪里的呢?

RedisConfiguration类的路径放在了classpath*META-INF/spring.factories的文件中,spring会加载这个文件中配置configuration
(1)SpringApplication.run(AppConfig.class,args);执行流程中有refreshContext(context);这句话.
(2)refreshContext(context);内部会解析我们的配置类上的标签.实现自动装配功能的注解@EnableAutoConfiguration
(3)会解析@EnableAutoConfiguration这个注解里面的@Import引入的配置类.AutoConfigurationImportSelector
(4)AutoConfigurationImportSelector这个类中有这个方法。          SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
(5)SpringFactoriesLoader.loadFactoryNames的作用就是读取jar包中的/项目中的META-INF/spring.factories文件.
(6)spring.factories配置了要自动装配的Configuration类



Spring的优点也是SpringBoot的优点,SpringBoot还解决了Spring的缺点
SpringBoot对上述Spring的缺点进行的改善和优化,基于 约定优于配置 的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。









关于作者

Taurus
获得点赞
文章被阅读