SpringBoot 到底帮 Spring 自动做了什么?为什么突然不用写 XML 了?

刚学 Spring 的时候,我被 XML 折磨过很久。

那时候创建一个 Bean:

<bean id="userService"
      class="com.demo.UserService"/>

配置数据源:

<bean id="dataSource"
      class="com.alibaba.druid.pool.DruidDataSource">
    ...
</bean>

配置事务:

<tx:annotation-driven/>

配置组件扫描:

<context:component-scan base-package="com.demo"/>

一个项目下来,XML 文件几百上千行。

后来 SpringBoot 出现了。

突然发现:

@SpringBootApplication
public class Application {

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

启动就完了。

数据源自动配置了。

事务自动开启了。

Tomcat 自动启动了。

连 XML 都不用写了。

很多人第一次接触 SpringBoot 都有一个疑问:

SpringBoot 到底帮 Spring 自动做了什么?


先说结论

SpringBoot 不是 Spring 的替代品。

很多人以为:

SpringBoot = 新框架

其实不是。

真正的关系是:

SpringBoot
      ↓
Spring

SpringBoot 底层依然是 Spring。

BeanFactory 还是那个 BeanFactory。

IOC 还是那个 IOC。

AOP 还是那个 AOP。

事务还是那个事务。

SpringBoot 做的事情其实很简单:

把原来需要手动配置的事情自动帮你配置了。


Spring 时代有多麻烦

以前要整合 MySQL。

第一步:

引入依赖。

第二步:

配置数据源。

<bean id="dataSource">
    ...
</bean>

第三步:

配置事务管理器。

<bean id="transactionManager">
    ...
</bean>

第四步:

开启事务。

<tx:annotation-driven/>

第五步:

配置 Mapper 扫描。

<bean>
    ...
</bean>

少一步都可能启动失败。

很多新人刚学 Spring:

业务代码还没写
配置文件先写半天

SpringBoot 干了什么

SpringBoot 发现:

绝大多数项目都在重复做同样的事情。

比如:

引入 MySQL
↓
配置数据源
↓
配置事务

几乎人人都这么干。

既然大家都一样。

那为什么不自动配置?

于是 SpringBoot 的思想出现了:

约定大于配置

你告诉我需要什么。

剩下的我帮你配。


最经典的例子

引入依赖:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>
        mybatis-spring-boot-starter
    </artifactId>
</dependency>

然后配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: root

结束。

数据源有了。

事务有了。

SqlSessionFactory 有了。

MapperScanner 也有了。

很多人觉得神奇。

其实 SpringBoot只是偷偷帮你写了大量配置代码。


为什么大家都喜欢 SpringBoot

因为程序员最讨厌重复劳动。

假设公司有100个项目。

如果每个项目都要写:

<context:component-scan/>
<tx:annotation-driven/>
<bean/>
<bean/>
<bean/>

那就是纯体力活。

SpringBoot做的事情就是:

把重复配置标准化

然后自动生成。

所以它解决的不是技术问题。

而是效率问题。


一个很多人误解的问题

很多人会说:

SpringBoot 比 Spring 更高级。

其实这句话不准确。

真正应该这么理解:

Spring 负责能力

SpringBoot 负责易用性

比如事务。

真正实现事务的是:

@Transactional

背后的 Spring AOP。

不是 SpringBoot。

比如 IOC。

真正创建 Bean 的是:

BeanFactory

也不是 SpringBoot。

SpringBoot 更像一个装修公司。

Spring 才是地基。

装修再漂亮。

地基还是 Spring。


那为什么突然不用 XML 了

很多人以为:

SpringBoot 干掉了 XML

其实也不准确。

准确来说是:

SpringBoot 用 Java 配置
替代了 XML 配置

以前:

<bean/>

现在:

@Bean
public UserService userService() {
    return new UserService();
}

以前:

<context:component-scan/>

现在:

@ComponentScan

以前:

<tx:annotation-driven/>

现在:

@EnableTransactionManagement

本质没变。

只是配置方式变了。


SpringBoot 真正厉害的地方

很多人觉得:

SpringBoot = 自动配置

其实只说对了一半。

真正厉害的是:

条件装配

比如:

项目里有 MySQL 驱动。

自动配置数据源。

没有 MySQL 驱动。

自动配置失效。

项目里有 Redis。

自动配置 Redis。

没有 Redis。

自动跳过。

SpringBoot 能根据环境动态决定是否装配 Bean。

这才是它最强的地方。


Debug 一下就明白了

启动 SpringBoot:

@SpringBootApplication

断点打到:

SpringApplication.run()

你会发现:

启动过程最终还是进入 Spring 容器。

还是创建 Bean。

还是 IOC。

还是 AOP。

只是 SpringBoot 在启动前帮你提前注册了一大堆配置。

所以:

SpringBoot 没有创造新能力

只是把 Spring 用起来变简单了

如果你现在还觉得:

SpringBoot 很神秘

那记住一句话:

SpringBoot 不是魔法,它只是把以前你手动写的配置偷偷帮你写了。


上一篇:

《Spring 为什么必须三级缓存?看懂三级缓存才真正理解循环依赖》

下一篇:

《一个注解启动整个项目?@SpringBootApplication 到底做了什么?》


评论区聊聊:

你第一次接触 SpringBoot 的时候,最震惊的是哪个功能?

是自动配置?

还是彻底不用写 XML?

更多推荐