SpringBoot 到底帮 Spring 自动做了什么?为什么突然不用写 XML 了?
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?
更多推荐

所有评论(0)