SpringBoot01
简介
背景
- J2EE笨重的开发, 繁多的配置, 低下的开发效率, 复杂的部署流程, 第三方技术集成难度大.
- SpringBoot来简化Spring的应用开发, 是整个Spring技术的一个大整合, J2EE开发的一站式解决方案.
- SpringBoot的优点
- 快速创建独立运行的Spring项目以及主流框架集成.
- 使用嵌入式的Servlet容器, 应用无需达成war包, jar包即可.
- starters自动依赖与版本控制.
- 大量的自动配置, 简化开发, 也可修改默认值.
- 无需配置xml, 无代码生成, 开箱即用.
- 准生产环境的运行时应用监控.
- 与云计算的天然集成.
微服务
- 微服务是一种架构风格, 即一个应用应该是一组小型服务.
- 小型服务之间可以通过http的方式进行互通.
- 每个功能元素最终都是一个可独立替换和独立升级的软件单元.
- 单体应用: all in one
- 微服务
第一个SpringBoot工程
HelloWorld
- 实现: 浏览器发送hello请求, 服务器接收请求并处理, 响应helloworld字符串.
- 创建maven工程(jar)
-
- 启动自动导入功能
- 引入依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
- 编写主程序, 启动springboot
/** * @SpringBootApplication: 标识一个主程序类, 说明这是一个SpringBoot应用 */ @SpringBootApplication public class HelloWorldMain { public static void main(String[] args) { //Spring应用启动起来 SpringApplication.run(HelloWorldMain.class, args); } }
- 编写Controller
@Controller public class HelloController { @ResponseBody @RequestMapping("/hello") public String hello() { return "hello world"; } }
- 直接运行主启动类后即可直接访问.(访问路径默认不加项目名)
- 简化部署工作
- 在pom.xml中导入插件, 可以将应用打包成可执行的jar包
<!-- 这个插件,可以将应用打包成一个可执行的jar包;--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
- 打包后的jar包可以直接用java -jar运行.
- 在pom.xml中导入插件, 可以将应用打包成可执行的jar包
HelloWorld探究
- pom文件
- 父项目
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent>
- 它的父项目: springboot版本仲裁中心, 来真正管理类springboot应用里的所有依赖版本.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.9.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath> </parent>
- 所以有在dependencies中管理的就不用再写版本号了.
- 父项目
- 导入的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
- spring-boot-starter-web: spring-boot场景启动器
- 导入了web模块正常运行所需的所有依赖
- SpringBoot将所有的功能场景都抽取出来, 做成一个个starter(启动器), 只需要在项目里引入这场景启动器, 相关依赖都会导进来.
- spring-boot-starter-web: spring-boot场景启动器
主启动类
- 核心注解: @SpringBootApplication
- SpringBoot应用标注在某一个类上说明这个类是SpringBoot的主配置类, SpringBoot就应该运行这个类的main方法来启动SpringBoot应用.
- @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 {
- @SpringBootConfiguration: SpringBoot的配置类
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
- 标注在某个类上, 表示是一个SpringBoot的配置类.
- @Configuration配置类来标注这个注解.
- @EnableAutoConfiguration: 开启自动配置功能
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {
- Spring中繁多的配置, SpringBoot通过它帮我们自动配置.
- 将主配置类所在包及下面所有子包里边所有组件扫描到Spring容器中.
- @AutoConfigurationPackage: 自动配置包
@Import(AutoConfigurationPackages.Registrar.class) public @interface AutoConfigurationPackage { }
- Import(): 给容器中导入一个组件.
- @Import({EnableAutoConfigurationImportSelector.class}): 导入了哪些组件的选择器
- 将所有需要导入的组件以全类名的方式返回: 这些组件被添加到容器中.
- 会给容器中导入非常多的自动配置类(xxxAutoConfiguration): 给容器中导入该场景所有组件并配好.
- 有了自动配置类, 就免去了我们手动写配置注入功能组件等工作.