一、概念
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置
- Spring Boot 是 Spring 的一套快速配置脚手架
- Spring Boot专注于快速、方便集成的单个微服务个体
- Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了
二、SpringBoot优点
极大的简化了我们开发Spring应用的初始搭建以及开发过程
平时我们搭建一个Spring Web项目, 需要做以下工作:
- 配置 web.xml,加载 Spring 和 Spring mvc
- 配置数据库连接、配置 Spring 事务
- 配置加载配置文件的读取,开启注解
- 配置日志文件
- …
- 配置完成之后部署 Tomcat 调试
- …
而使用SpringBoot, 这些都不用我们自己手动配置了
三、快速入门
1.Idea构建项目
- 选择 File -> New —> Project… 弹出新建项目的框
- 选择 Spring Initializr,Next 也会出现上述类似的配置界面,Idea 帮我们做了集成
- 填写相关内容后,点击 Next 选择依赖的包再点击 Next,最后确定信息无误点击 Finish。
2.项目结构
Spring Boot 的基础结构共三个文件:
src/main/java
程序开发以及主程序入口src/main/resources
配置文件src/test/java
测试程序
Spring Boot 建议的目录结构:
- Application.java 建议放到根目录下面,主要用于做一些框架配置
- model 目录主要用于实体与数据访问层(Repository)
- service 层主要是业务类代码
- controller 负责页面访问控制
启动项目,只需启动 Application main 方法
3.引入Web模块
①添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
pom.xml 文件中默认有两个模块:
spring-boot-starter
:核心模块,包括自动配置支持、日志和 YAML,如果引入了spring-boot-starter-web
web 模块可以去掉此配置,因为spring-boot-starter-web
自动依赖了spring-boot-starter
。spring-boot-starter-test
:测试模块,包括 JUnit、Hamcrest、Mockito。
②编写 Controller 内容:
@RestController
public class HelloWorldController {
@RequestMapping("/hello")
public String index() {
return "Hello World";
}
}
四、springboot原理
我们开发任何一个Spring Boot项目,都会用到如下的启动类
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
其中, Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)究竟为何物:
1.@SpringBootApplication
点开@SpringBootApplication注解, 里面包含了如何内容:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
虽然定义使用了多个Annotation进行了原信息标注,但实际上重要的只有三个Annotation:
- @Configuration(@SpringBootConfiguration点开查看发现里面还是应用了@Configuration)
- @EnableAutoConfiguration
- @ComponentScan
①@Configuration
此标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
②@EnableAutoConfiguration
主要是通过此注解,能所有符合自动配置条件的bean的定义加载到spring容器中
@EnableAutoConfiguration借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器,仅此而已!
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
...
}
其中,最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector @EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。
智能的自动配置功能来源于:Spring框架原有的一个工具类:SpringFactoriesLoader的支持
SpringFactoriesLoader属于Spring框架私有的一种扩展方案,其主要功能就是从指定的配置文件META-INF/spring.factories加载配置。
因此,@EnableAutoConfiguration自动配置的功能就是:从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。
③@ComponentScan
会扫描当前包及其子包下被@Component,@Controller,@Service,@Repository等注解标记的类并纳入到spring容器中进行管理。
2.SpringApplication.run
①实例初始化ApplicationContext
②将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕ApplicationContext。
参考文章: