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 提供的新类。