spring boot ?
spring boot是pivotal团队提供的一个全新框架,用来简化spring应用搭建及开发过程,以提供默认配置的方式,使开发人员不需要定义模板化的配置。巴拉巴拉巴拉 .....一堆。
在没有spring boot之前我们要使用spring整合hibernate怎么搞,先要引入包,然后开始各种sessionfactory、DataSource、Transactional的配置,然后下次有新的项目,再照着这一堆配置在重新写一次,当时我就在想,这样搞太cd(操蛋)了,要是有个什么东西能让我再引入包的时候就自动把这些东西给我配置好了,我只需要填一下必要的参数就好了。呐,想睡觉就有人送枕头(spring boot)了。
如何自动配置
根据刚才的说法,spring boot就是一个能完成各类框架自动配置整合的框架,简单的来讲就是一个框架的自动装配机。
那它是如何来完成自动装配的呢?
先想想如果是我们自己搞一个自动整合,该如何去搞?
1、我们框架整合最难搞的是什么? jar包!jar包!jar包!各个功能的jar包,各个版本的jar包能把你到怀疑人生,所以如何解决这个问题,maven,管理jar的小能手。
2、jar包我们搞定了,那配置呢?如何自动配置呢?想想 想想 再想想? 叮咚(小脑袋的灯亮了),既然是引入jar包,那把自动配置的部分写好不就行了,比如现在要用hibernate,我们把spring整合hibernate需要配置的各种sessionfactory配置好打成jar就行了赛。
3、现在是有jar包,有配置,如何才能把jar加入到新的环境中呢?想想过滤器是怎么搞得,是不是在web.xml中配置一个实现类,那我们也搞一个配置文件,新项目在启动的时候,去jar包里面加载这个配置文件,然后再根据定的实现类,装载配置。
我们想实现一个自动配置框架,分着三大步也就差不多了,spring boot的实现思路也差不多,它通过maven来管理各个框架的jar包,利用jar包里面的spring.factories文件来完成对框架的自动配置,所以spring boot重要的概念之一就是它的启动器,这点从它的命名也可以看出来,如spring-boot-starter-web,翻译:spring boot 启动 web应用。
spring boot 启动器
org.springframework.boot spring-boot-starter-parent 2.0.2.RELEASE
在spring boot项目中,我们需要引入这样一个配置,意思是说我要继承一个spring boot 启动器,版本为2.0,编程里面继承是什么意思,是不是继承了某个类就可以直接使用它的方法,属性等巴拉巴拉一堆,换句话中我继承了某种类型是不是就是我要变成它那种类型。这里就是这个意思,把我们构建的这个项目变成一个启动器。
spring boot starter工作原理
首先spring boot是用@SpringBootApplication注解和main方法启动的,main方法好理解,程序入口嘛,那@SpringBootApplication呢?我们打开@SpringBootApplication看看有什么
除了Java的那个几个注解声明还有什么
@ComponentScan:扫描包 @SpringBootConfiguration:加载配置文件
用过spring对上面这两个都比较好理解,但是还有一个@EnableAutoConfiguration,这个是什么呢?打开看一下,
其它的看不懂,但是,Class[]?刚才我们怎么说来着,spring.factories文件配置实现类,打开spring-boot-autoconfigure看一下呢,里面果然有一个spring.factories,并且spring.factories文件里面配置的就是各类名字映射的类
看左边是不是很熟悉,servlet?DispatcherServlet?WebMvc?是不是感觉有点像spring mvc的一些东西,对,这里就是装配spring mvc的入口。 再看刚才@EnableAutoConfiguration里面的东西是不是就明白了,Class[]是装载,那excludeName是不是就是排除一些我们不希望它装载的东西。
@EnableAutoConfiguration还有一个@Import({AutoConfigurationImportSelector.class}),看名字就知道了,配置选择器,用来查找和加载配置项。
现在我们已经差不多了解SpringBootApplication干了啥,直白一点就是准备启动参数,现在我们来看一下main方法中的SpringApplication.run();
最好的方式就是点进去看一下
- 判断 web环境
- 加载 ApplicationContextInitializer
- 加载 ApplicationListener
public ConfigurableApplicationContext run(String... args) { ... //加载spring.factories文件,构建ApplicationStartingEvent事件 SpringApplicationRunListeners listeners = this.getRunListeners(args); listeners.starting(); //启动初始化 try { //设置环境变量 ApplicationArguments applicationArguments = new DefaultApplicationArguments(args); //创建ApplicationContext context = this.createApplicationContext(); /装配ApplicationContext this.prepareContext(context, environment, listeners, applicationArguments, printedBanner); //加载spring 容器 this.refreshContext(context); //回调ApplicationRunner、CommandLineRunner接口 this.afterRefresh(context, applicationArguments); spring 容器初始化完成 listeners.started(context); 调用ApplicationRunner、CommandLineRunner实例run方法 this.callRunners(context, applicationArguments); //容器准备完成 listeners.running(context);
SpringApplication.run()基本就搞了这些操作,当然还有其它的东东,太细节的东东这里就不赘述了,也写不下,有兴趣的去看看源码。
好了,spring boot starter就聊这么多,如果还想知道更细节的东西,建议看源码,spring boot starter只是一个上层框架,它还是离不开spring的那一套东西。