1.前言
1.1springboot的优势
Spring Boot是一个用于构建独立、生产级的Spring应用程序的开发框架,它在简化配置、提高开发效率、增强功能丰富性等方面具有以下优势:
简化配置:Spring Boot采用了约定优于配置的原则,通过自动配置和默认属性设置,大大减少了开发者需要手动配置的工作量。它使用了一些智能推断和默认值机制,可以根据项目的依赖和环境来自动配置应用程序,并提供了一个统一的配置文件(application.properties或application.yml)来集中管理配置。
快速开发:Spring Boot提供了一套简洁、一致的编码风格和开发模式,使得开发者可以快速搭建和开发应用程序。它提供了内嵌的Servlet容器(如Tomcat、Jetty),省去了部署的繁琐步骤,可以直接运行项目。此外,Spring Boot还提供了丰富的Starter依赖,可以快速集成常用的第三方库和框架,减少了开发的重复劳动。
微服务支持:Spring Boot天然支持微服务架构的开发。它提供了Spring Cloud生态系统,集成了众多微服务相关组件(如服务注册与发现、负载均衡、断路器、配置中心等),可以方便地搭建和管理微服务应用。同时,Spring Boot还提供了对容器化部署的支持,可以直接打包成Docker镜像,并与容器编排工具(如Kubernetes)无缝集成。
自动化测试:Spring Boot对于单元测试和集成测试提供了很好的支持。它引入了JUnit和Spring Test框架,并通过自动配置和模拟对象等技术,简化了测试的编写和执行过程。开发者可以快速编写可靠的测试用例,并使用Spring Boot的测试工具集成测试各个组件和功能。
监控和管理:Spring Boot提供了丰富的监控和管理功能,可以帮助开发者更好地了解应用程序的运行状况和性能指标。它集成了Actuator模块,可以通过HTTP或JMX暴露出一系列的端点(endpoints),包括应用信息、健康状况、性能指标等,方便实时查看和监控应用程序。
总的来说,Spring Boot通过简化配置、提高开发效率、支持微服务架构、优化测试和监控等方面的特性,使得开发者可以更加专注于业务逻辑的实现,快速构建高质量的应用程序。它的优势在于简化和规范化了Spring应用开发的过程,提供了一种快速、便捷、高效的开发体验。
1.2spring和springboot对比
spring框架:需要手动引入大量的依赖,并且我们所引入的依赖版本还要匹配,否则就可能出现版本冲突的问题,这是非常繁琐的
springboot框架:引入起步依赖即可,原理就是maven的依赖传递。
2.springboot的原理分析
2.1起步依赖
起步依赖:大大简化pom文件中依赖的配置就可以来解决spring框架中依赖配置繁琐的问题
主要原理就是maven的依赖传递
Spring Boot使用了Spring框架的依赖注入机制来管理对象之间的依赖关系。依赖注入是指将一个对象所依赖的其他对象,通过注入的方式来实现,而不是在对象内部通过new关键字主动创建依赖对象。
Spring Boot使用了IoC容器(Inversion of Control)来管理对象和它们之间的依赖关系。在Spring Boot应用中,可以通过在类上添加注解(如@Component、@Service、@Controller等)将类标记为一个可被Spring管理的组件。当应用启动时,Spring会自动扫描并创建这些组件,并将它们注册到IoC容器中。
当一个组件需要依赖其他组件时,可以通过构造函数、属性注入或方法注入等方式来实现。Spring框架会根据依赖关系自动将相应的依赖组件注入到目标组件中,从而完成依赖注入
2.3自动配置
自动配置(Auto-configuration): Spring Boot的自动配置使用了条件化配置的机制。它通过扫描项目的classpath和注解,根据预定义的条件来决定是否要自动配置某个组件或功能。自动配置是通过@Configuration注解的类实现的,这些类被称为自动配置类(AutoConfiguration Classes)。
自动配置类通常使用了条件注解(@Conditional)来判断是否满足某个条件。如果满足条件,那么就会执行自动配置逻辑,将相关的组件注册到Spring容器中。例如,当classpath中存在特定的库时,自动配置类会根据这个条件来决定是否要进行相应的配置。
自动配置还可以使用外部的配置文件(application.properties或application.yml)来进行参数的配置,从而进一步定制自动配置的行为。
当我们在Spring Boot应用中使用
@EnableAutoConfiguration
注解时,它会触发自动配置机制。
主启动类封装了
@EnableAutoConfiguration
注解:主启动类使用了@EnableAutoConfiguration
注解,这个注解是一个组合注解,包含了多个元注解,例如@AutoConfigurationPackage
、@Import
等。
@EnableAutoConfiguration
注解内部包含了@AutoConfigurationPackage
注解:@AutoConfigurationPackage
注解的作用是将主启动类所在的包及其子包下的所有组件(类)注册到Spring的上下文中。这样,自动配置机制就能够扫描到这些组件并进行自动配置。
@EnableAutoConfiguration
注解内部使用了@Import
注解:通过@Import
注解,@EnableAutoConfiguration
注解引入了一个类,这个类实现了ImportSelector
接口。引入的类实现了
ImportSelector
接口并重写了selectImports
方法:通过@Import
注解导入的类实现了ImportSelector
接口,并重写了selectImports
方法。selectImports
方法的作用是读取配置文件(通常是以.imports为后缀的文件),并返回一个字符串数组,其中包含了需要自动配置的类的全类名。配置文件(.imports文件)的位置和内容:配置文件通常位于
META-INF/spring.factories
文件中,它是在项目的classpath下的资源目录中。这个配置文件列出了需要自动配置的类的全类名,每个类名占据一行。根据配置类进行自动配置:根据配置文件中列出的全类名,自动配置机制会扫描并注册这些配置类。这些配置类通常由Spring Boot的起步依赖(Starter)提供,起步依赖中包含了一组预定义的配置类和依赖项。配置类中可能包含了多个Bean的定义,例如数据库连接、Web服务器等。
条件注解控制注册:在自动配置过程中,还会使用条件注解来控制是否注册某个配置类中的Bean对象。条件注解可以根据特定的条件判断是否应该注册某个Bean对象,例如某个类是否存在于Classpath中、某个属性是否被配置等。这样可以根据不同的环境和需求,仅注册符合条件的Bean。
通过以上的自动配置原理,我们能够方便地使用Spring Boot的起步依赖,无需手动配置大量的Bean对象,简化了项目的搭建和配置过程。自动配置机制使得开发者可以更专注于业务逻辑的实现,减少了重复性的配置工作,并提高了开发效率。
总而言之就是: Spring Boot的自动配置机制通过@EnableAutoConfiguration
注解和配置文件,根据预定义的配置类和条件注解,自动扫描、注册和配置Bean对象,简化了项目的搭建和配置过程。
并且配置文件中的配置类是由我们提供jar包的厂家提供的。最了解该产品的还是厂家自己,所以由厂家自己封装最合适不过。
3.代码模拟
3.1自动配置类
@AutoConfiguration声明当前类是一个自动配置类
@Import({CommonConfig.class}):导入CommonConfig这个类,当springboot读取到这个配置类的时候就会读取到@Import这个注解,间接的就会读到了CommonConfig这个类
@AutoConfiguration
@Import({CommonConfig.class})
public class CommonAutoConfig {
public CommonAutoConfig() {
}
}
3.2 配置类
这个类分别注入了,Country对象和Province对象
public class CommonConfig {
public CommonConfig() {
}
@ConditionalOnProperty(
prefix = "country",
name = {"name", "system"}
)
@Bean
public Country country(@Value("${country.name}") String name, @Value("${country.system}") String system) {
return new Country(name, system);
}
@Bean
public Province province() {
return new Province();
}
}
3.3配置文件