Spring Boot 入门随笔(一)
今天开始学习Spring Boot的相关内容
首先来介绍一下Spring Boot。
spring boot 基于spring 的各个项目 mvc , spring容器等等
帮助我们进行配置。进行了依赖管理让我们只用进行少量配置就可以快速构建出一个企业级项目。
所有依赖管理都在spring-boot-dependencies父项目中进行了管理。
它有专门的场景启动器,spring-boot-starter – 各种场景,我们只用导入某个场景,他就会自动导入这个场景开发所需要的各种依赖。
这里我写了一个Spring Boot的入门程序hello world,项目使用maven管理,导入相应的依赖:
<!-- 默认的spring boot项目的父项目,由它进行spring 项目所需要的各种依赖的版本管理 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.21.RELEASE</version>
</parent>
<!-- spring boot的web开发场景启动器 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
package study.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootMainApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMainApplication.class, args);
}
}
如这段代码所示,这个标注了@SpringBootApplication注解的类,就是spring boot 的主程序,spring boot只用运行一段jar代码,就可以替代以前的war打包方式的项目。因为他集成了tomcat ,只要运行这个主程序,他就会自动启动tomcat。
@Controller
public class HelloController {
@RequestMapping("/hallo")
@ResponseBody
public String hallo() {
return "hallo world";
}
}
这是我随便写的一个hellocontroller,放在了SpringBootMainApplication 同一包下的子包中,启动spring boot就可以访问它。
这就是spring boot的神奇之处,明明没有进行任何的配置,包括spring mvc的配置,包括包扫描器的配置,tomcat等等,但是它却可以独立完整运行。这跟它的注解@SpringBootApplication有关。我们ctrl+单击这个注解,看看它的源码发现他是由几个底层注解组合而成的
@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) })
@SpringBootConfiguration 表示Spring Boot 的配置类注解
标注在某个类上,表示这是一个配置类
@Configuration :配置类上标注这个注解,它是spring底层的注解之一。
将配置文件,用注解配置类的形式替代了,实际上就是一个 @Component组件。
@EnableAutoConfiguration开启自动配置功能
有了自动配置之后,以前我们需要配置的东西,都不用自己配置了,由Spring Boot帮我们自动配置
@EnableAutoConfiguration的源码
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
@Import(EnableAutoConfigurationImportSelector.class)
其中import导入的EnableAutoConfigurationImportSelector.class,是一个开启自动配置类的导包的选择器 组件
他会将所有需要导入的组件,以全类名的方式返回。
它会给容器导入非常多的自动配置类(xxxAutoConfiguration)并配置好这些组件。
有了自动配置类,就免去了手动编写配置注入功能组件等工作。
Spring Boot启动的时候从
META-INF/spring.factories 在这个目录下,配置了spring 的场景自动配置类的名字。
@AutoConfigurationPackage自动配置包扫描
它的源码里面,也标注了import注解
@Import(AutoConfigurationPackages.Registrar.class)导入组件,
被导入的组件,由AutoConfigurationPackages.Registrar.class类来进行获取。
它会获取主配置类所在包及其子包的所有注解进行导入。所以在我的hello world中,我明明没有配置包扫描器,但是spring却能将controller加入容器中。