spring框架具体流程_spring源码分析启动_spring启动流程

在上篇文章中,我们创建了一个RESTFul风格的接口项目,并且分析了它的相关依赖,这里我们就来看一下这个项目还有什么值得我们分析的地方。前面提到的,在SpringBoot的场景启动器中,我们提供了一些自动配置的功能,那么在之前我们也说过,这些自动配置,除了可以自动配置之外,还可以由程序员来自行根据需求进行配置。那么下面我们就从配置文件入手开始详细说明?

什么是配置文件?

在之前的项目中我们看到在resource目录中有一个application.properties的文件spring启动流程,现在我们习惯使用application.yml配置文件,其实二者所实现的效果是一样的。

在Spring Boot中为开发者提供了很多的场景启动器,并且这些启动器的配置信息并不是在内部写死的,例如配置数据库、配置中间件、配置服务的端口号这些内容。在Spring Boot中统一使用了Properties类对这些配置进行了抽象。

在Spring启动的时候可以通过对应的配置前缀进行读取相应的配置值。我们来通过一段简单的源码来分析一下。在WebMvcAutoConfiguration配置类中,找到了Spring MVC相关配置的配置项,会看到有如下一个配置类。其中@ConfigurationProperties(prefix = “spring.mvc”)就表示它的访问前缀,在这之后跟的都是对应的配置项,以及配置的值。在项目启动的时候就可以自动装配到项目中并且运行起来。

@ConfigurationProperties(prefix = "spring.mvc")
public class WebMvcProperties {

关于配置文件的内容,在后续的深入介绍中还有更加详细的介绍。这里就不在深入介绍。

启动类介绍

在我们演示Hello World项目的时候spring启动流程,提到了一个概念就是启动项目,那么如何启动项目呢。就需要启动类的帮助。我们知道无论是什么样的程序,它都有一个main方法作为所有程序代码的入口,Spring Boot项目也不例外,既然没有外部容器作为启动运行的环境,那么在Spring Boot中提供了如下的一些操作来完成项目启动的操作。

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

观察Spring Boot启动类不难发现。在这个启动类上有@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、@EnableAutoConfiguration、@ComponentScan 三个。其中@ComponentScan注解大家都应该不陌生,就是指定扫描那些组件。通过配置可以知道,只要这个注解在什么地方,就从这个地方开始扫描其同类包或者是子包下的所有内容。然后将其注入容器中

@SpringBootConfiguration 注解上面没有太多的配置,但是其内部有着其他的一些配置。代码如下

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {

不难发现@Configuration 表示它就是一个简单的配置类。

这其中最让人关注的其实是@EnableAutoConfiguration 注解,直译之后就是允许自动配置的意思。

@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

这里有一个比较经典的注解@Import,将外部的内容注入到容器中。这里由于是介绍性的内容,我们就不在深入地了解这些注解都是什么意思,完成的是那些操作,在后续的分享中,我们也会详细介绍这些注解的意思。

怎么进行单元测试

首先单元测试作为在开发中比较常用的一种测试方法,在整个项目没有开发完成之前,有些功能是不能联调使用的,所以需要将独立的功能进行单元测试。

在Spring Boot 中提供了如下的单元测试工具类,其中@SpringBootTest 注解就是单元测试类的注解。在这个类中可以直接获取到容器中的Bean对象。例如我们可以在这其中直接调用到Controller类的方法。

@SpringBootTest
class DemoApplicationTests {
    @Test
    void contextLoads() {
    }
}

在项目小的时候可能单元测试会很方便,但是随着业务越来越复杂,代码量越来越大,单元测试就显得没有那么必要了。直接部署测试环境,都比单元测试测试得快,所以这里也只是简单地介绍一下有单元测试这样一个东西。

总结

通过上面的内容,也让我们更加深入的了解了SpringBoot项目的优势,以及如何能够更好的理解自动装配。有些东西虽然是浅尝辄止,但是对后续我们深入的了解有着巨大的帮助。在后续的分享中,也会继续带着大家深入了解Spring Boot背后的东西。

限时特惠:本站每日持续更新海量展厅资源,一年会员只需29.9元,全站资源免费下载
站长微信:zhanting688