Spring Boot——入门
spring boot简化了spring的开发,是J2EE一站式解决方案。
Spring Boot 的优缺点
优点
- 快速创建独立运行的服务,与主流框架集成。
- 使用嵌入式Serverlet容器,应用无需达成war包。
- starters自动依赖与版本控制。
- 大量的自动配置,简化开发,支持自定义配置。
- 无需xml配置,开箱即用。
- 准生产环境的运行时应用监控。
- 云计算的天然集成。
缺点
入门容易,精通难;因为很多事情是spring boot自动完成的。
微服务
实例讲解
Hello World
- main函数所在的HelloWorld类
/**
* @SpringBootApplication 用来告诉程序这是一个 spring boot 应用
*/
@SpringBootApplication
public class Helloworld {
public static void main(String[] args) {
// 启动Spring应用
SpringApplication.run(Helloworld.class, args);
}
}
controller类
@Controller public class HelloController { @ResponseBody @RequestMapping("/hello") public String hello(){ return "Hello world"; } }
Pom文件
<!-- spring boot 所有spring boot starter的父项目
是真正管理spring boot应用中所有依赖版本
是spring boot的版本仲裁中心(决定依赖库的版本)
以后我们导入依赖默认是不需要写版本的(但是那些没有在父项目中管理的依赖自然是需要声明版本号的)-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<dependencies>
<!--开发web应用需要的库-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!--将应用打包为jar包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Spring Boot 主程序分析
/**
* @SpringBootApplication 用来告诉程序这是一个 spring boot 应用
*/
@SpringBootApplication
public class Helloworld {
public static void main(String[] args) {
// 启动Spring应用
SpringApplication.run(Helloworld.class, args);
}
}
@SpringBootApplication 注解标注在某个类上的时候,说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用。该注解为组合注解,由以下注解组成:
// 指定该注解可以给一个类型进行注解,比如类、接口、枚举
@Target(ElementType.TYPE)
// 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
@Retention(RetentionPolicy.RUNTIME)
// 它的作用是能够将注解中的元素包含到 Javadoc 中去。
@Documented
// 如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。
@Inherited
// 表明这个类是一个SpringBoot的配置类
@SpringBootConfiguration
// 告诉SpringBoot开启自动配置功能,自动配置才会生效
@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 {}
其中,@Configuration注解是Spring框架中基本的一个注解,在配置类上标记该注解,表明这个类是Spring的配置类。
@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效。其组成为:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
其中 @AutoConfigurationPackage自动配置包,将主配置类(即@SpringBootApplication标注的类)所在包及其下面所有子包里面的所有组件扫描到Spring容器中。其组成为:
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
@Import为Spring的底层注解,表明给容器中导入一个组件,导入的组建由AutoConfigurationPackages.Registrar类提供。
@Import(AutoConfigurationImportSelector.class) 表明开启自动导入哪些组建的选择器;
AutoConfigurationImportSelector.class将要导入的组件以全类名的方式返回,这些容器会被导入到Spring容器。会给容器中导入非常多的自动配置类(一般以xxxAutoConfiguration结尾)。这些自动配置类的作用就是给容器中导入场景所需的自动配置,有了自动配置类,就可以不用手动写配置了
自动配置类是怎么找到的呢?
AutoConfigurationImportSelector
- selectImports(AnnotationMetadata annotationMetadata)
- List<String> configurations = getCandidateConfigurations(annotationMetadata,
attributes); // 返回所有配置,对应上面的图
- List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
- protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
- String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
- Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
从类路径下(如引用的各个jar包)的 META-INF/spring.factories中获取 EnableAutoConfiguration制定的值(自动配置类),这些值作为自动配置类导入到容器中,自动配置类就生效了,帮我们进行自动配置工作。以前我们需要自己配置的类,spring boot都自动配置了:
spring-boot-autoconfigure包中,包含了J2EE 所有整合方案和所有自动配置。
org\springframework\boot\spring-boot-autoconfigure\1.5.9.RELEASE\spring-boot-autoconfigure-1.5.9.RELEASE.jar!\org\springframework\boot\autoconfigure
使用Spring Initializer快速创建Spring Boot项目
- 首先,需要在IDEA中安装 Spring Assisstant插件。
- 选择需要的模块,IDEA会自动联网下载Spring boot 应用模板:
resources 文件夹中目录结构:
- static:保存所有静态资源,如js、css、images;
- templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持jsp页面);可以使用模板引擎(freemarker,thymeleaf);
- application.properties:Spring Boot 应用的配置文件,可以修改一些默认设置,如服务的端口号。