说说 Spring Boot 项目引导与测试原理

1 引导项目

因为 Spring Boot 项目会以可执行 JAR 文件的形式来运行,所以 Spring Boot 项目会定义一个主类,主类中提供 main 方法,它会在 JAR 运行时被执行。这个主类以注解的形式绑定 Spring 框架,完成 Spring 基础配置。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DeniroSpring5Application {

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

}

@SpringBootApplication 注解表明这是一个 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 将该类声明为配置类,是 @Configuration 注解的特殊形式 。
@EnableAutoConfiguration 启用 Spring Boot的自动配置
@ComponentScan 启用组件扫描。这样配置了 @Component、@Controller、@Service 等注解的类,就会被 Spring 扫描到,然后将其注册为 Spring 上下文中的组件。

这里也顺便回顾下 Java 的元注解:

注解 说明
@Documented 把注解类型信息记录到 生成的 javadoc 文档中。
@Target(ElementType.TYPE) 说明了Annotation所修饰的对象范围,TYPE 表示用于描述类、接口(包括注解类型) 或enum声明。
@Retention(RetentionPolicy.RUNTIME) 指定注解的生命周期,RetentionPolicy.RUNTIME 表示注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在。
@Inherited 如果该注解定义在类上面时,子类会自动继承此注解。该注解只有在类上使用时才会有效。

主类中的 main 方法,调用 SpringApplication.run(DeniroSpring5Application.class, args); 执行项目引导过程,也就是创建 Spring 的应用上下文。静态的 run() 方法有两个入参,一个是配置类,另一个是命令行参数。

2 测试项目

Spring Initializr 在创建项目的同时,为我们提供了一个基本测试类:

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class DeniroSpring5ApplicationTests {

    @Test
    void contextLoads() {
    }

}

运行结果:

这个类中只有一个空的测试方法,虽然是空的,但会确保 Spring 应用上下文能够被正确加载。如果我们所做的修改导致 无法创建 Spring 应用上下文,那么这个测试方法就会失败。

这里使用了 org.junit.jupiter.api.Test 作为测试依赖类,这个类是 Junit 5 提供的新类。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章