概述
Spring Boot简化Spring应用开发,约定大于配置,去繁从简,just run 就能创建一个独立的,产品级别的应用。
优点
- 快速创建独立运行的Spring项目以及与主流框架集成。
方便与三方框架集成。 - 使用嵌入式的Servlet容器,应用无需打成WAR包。
- starters自动依赖与版本控制。
版本控制容易,jar包版本一致性。 - 大量的自动配置,简化开发,也可修改默认值。
- 无需配置XML,无代码生成,开箱即用。
- 准生产环境的运行时应用监控。
- 与云计算的天然集成。
微服务
2014,martin fowler发表了一篇介绍微服务的文章。
微服务是一种架构风格。
- 一个应用应该是一组小型服务的组合;可以通过http等协议的调用方式进行互通。
- 每个功能元素最终都是一个可单独替换和独立升级的软件单元。
简单的hello world场景
浏览器请求服务器,服务器接收请求并返回hello world给浏览器。
创建Idea 创建Spring boot 项目
编写Controller
浏览器调用接口
打包部署
pom.xml中添加maven插件
maven执行打包命令
命令行执行jar包
场景启动器
parent启动器之版本管理
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- starter-parent父项目,用来真正的管理不同依赖的版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.4.4</version>
</parent>
spring-boot-starter-parent项目用来作为依赖版本的仲裁中心,我们在导入依赖Jar包时可以不写版本号;
对于不在spring-boot-dependencies中管理的组件包,我们还是要添加版本号的。
自动导入依赖组件
不同的场景启动器把需要依赖的组件导入,启动器就是一系列相关组件的组合,无需手动导入相关组件了,启动器中的没有指定版本号的组件版本受parent启动器的版本管理。
比如web场景启动器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring-boot-starter-web中具体内容 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.4.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.4.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.4.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.5</version>
<scope>compile</scope>
</dependency>
</dependencies>
springboot内置了许多场景启动器,需要用到相应场景时直接导入启动器依赖即可,相关组件都会自动导入,版本由springboot自动管理。
可以查看官网看看有哪些场景启动器:https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot
下面是部分截图:
主程序类(入口类)
@SpringBootApplication
public class PracticeApplication {
public static void main(String[] args) {
SpringApplication.run(PracticeApplication.class, args);
}
}
@SpringBootApplication
Spring Boot应用注解标注在某个类上,说明这个类是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 {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "nameGenerator"
)
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
@SpringBootConfiguration
标注在某个类上,表示这是SpringBoot的配置类。
@SpringBootConfiguration内容:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
可以看到@SpringBootConfiguration其实就是Spring中的@Configuration注解,作用一样,只是通过不同的名称做一个项目区分而已。
@Configuration
标注在某个类上,表示这是一个java config配置,作用相等于Spring中的xml配置文件,且本身是一个@Component标注的Spring 容器中的组件。
@EnableAutoConfiguration
开启自动配置功能
以前我们需要配置的东西,Spring Boot帮我们自动配置了,SpringBoot就是通过@EnableAutoConfiguration来告诉自己开启自动配置功能,这样自动配置才能生效。
@EnableAutoConfiguration内容
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
@AutoConfigurationPackage
自动配置包注解。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
}
@Import({Registrar.class}):@Import 是Spring的底层注解,给容器导入一个组件;导入哪些组件由Registrar.class来指定。
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
Registrar() {
}
// getPackageNames将主配置类(@SpringBootApplication标注的类)所在的包及其子包中所有的组件(组件标注的bean)导入Spring容器中。
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new AutoConfigurationPackages.PackageImports(metadata));
}
}
从上面可以看到@AutoConfigurationPackage 注解的作用:将主配置类(@SpringBootApplication标注的类)所在的包及其子包中所有的组件(组件标注的bean)扫描到Spring容器中。
@Import({AutoConfigurationImportSelector.class})
- 该注解是告诉Springboot导入哪些组件的选择器到Spring容器中,这些组件选择器主要是一些自动配置类(类似与Spring中整合三方框架的xml配置文件)。
- 组件选择器就是各种自动配置类(xxxAutoConfiguration),这些配置类就是给容器中导入这个场景(比如使用redis功能场景)需要的所有组件,并配置好这些组件。
// 将所有需要导入的组件以全类名的方式返回,这些组件都会都会被导入到容器中。
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
// 通过SpringFactoriesLoader.loadFactoryNames找到springboot应用类路径下的所有jar包中的META-INFO/spring.factories中EnableAutoConfiguration变量对应的自动配置类。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
- spring.factories的内容如下:
这些自动配置类就免去了我们手动编写配置注入功能组件的工作 - 通过下图可以看到configurations就是autoconfigure包下面的各种配置类。
- 总结
SpringBoot在启动的时候从类路径下的所有META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效了,帮忙我们进行自动配置工作;所有以前我们自己配置的东西,这些自动配置类都帮忙我们完成了。
J2EE的整体整合方案和自动配置都spring-boot-autoconfigure-2.4.4.jar包下的 org.springframework.boot.autoconfigure包中。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100362.html