一篇文章读懂@SpringBootApplication

@SpringBootApplication

基于 springboot3.2 和 springframework6.1.4

@SpringBootApplication的三大功能

@SpringBootApplication 是 Spring Boot 提供的一个方便的组合注解,用于简化 Spring Boot 应用程序的配置和启动。它combines了以下三个注解的功能:

  1. @Configuration:

    • 标识该类是一个配置类,可以包含 Bean 定义的方法。
    • 它是 Spring 框架的核心注解,用于定义配置类和 Bean 的创建。
  2. @EnableAutoConfiguration:

    • 启用 Spring Boot 的自动配置机制。
    • Spring Boot 会根据类路径中的依赖和定义的 Bean 来自动配置应用程序的各个方面,如数据库连接、MVC 配置等。
    • 自动配置的目的是减少手动配置的工作量,提供开箱即用的功能。
  3. @ComponentScan:

    • 启用组件扫描,自动检测和注册 Spring 组件。
    • 默认情况下,它会扫描当前包及其子包中的组件,如 @Component@Service@Repository 等注解标记的类。
    • 通过组件扫描,Spring 可以自动发现和实例化应用程序中的组件,并将它们注册为 Bean。

除了组合这三个注解外,@SpringBootApplication 还提供了一些额外的功能和定制选项:

  • 可以通过 scanBasePackagesscanBasePackageClasses 属性来指定要扫描的包或类,覆盖默认的扫描行为。
  • 可以通过 excludeexcludeName 属性来排除特定的自动配置类或 Bean,从而定制自动配置的行为。

使用 @SpringBootApplication 注解标记主类(通常命名为 ApplicationMainApplication)有以下好处:

  • 简化配置: 通过一个注解即可启用多个 Spring Boot 功能,减少了显式配置的需求。
  • 自动配置: Spring Boot 会根据类路径中的依赖自动配置各种功能,如嵌入式服务器、数据库连接池等,提供开箱即用的体验。
  • 组件扫描: 自动发现和注册应用程序中的 Spring 组件,无需手动配置。
  • 易于启动: 使用 @SpringBootApplication 标记的主类可以直接运行,无需额外的配置或部署步骤。

总之,@SpringBootApplication 注解简化了 Spring Boot 应用程序的配置和启动过程,提供了自动配置和组件扫描等便利功能,使得开发者可以快速创建和运行 Spring Boot 应用程序。


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

@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 {
   
	//..............
}

1. @Configuration

@Configuration 是 Spring Framework 提供的一个重要注解,用于定义配置类并声明 Bean。它是 Spring 基于 Java 的配置方式的核心组件。

以下是 @Configuration 注解的主要作用:

  1. 声明配置类:

    • 标记了 @Configuration 注解的类表示这是一个配置类,用于定义 Bean 和应用程序的配置。
    • 配置类通常包含一个或多个使用 @Bean 注解标记的方法,这些方法用于声明和配置 Bean。
    • Spring 容器会识别并处理标记了 @Configuration 的类,并根据其中的 @Bean 方法创建和管理相应的 Bean。
  2. 定义 Bean:

    • 在配置类中,可以使用 @Bean 注解标记方法来定义 Bean。
    • @Bean 注解告诉 Spring 容器该方法返回的对象应该被注册为一个 Bean,并由容器管理其生命周期。
    • 通过在配置类中使用 @Bean 方法,可以以编程方式创建和配置 Bean,灵活地控制 Bean 的创建过程和依赖关系。
  3. 组合和模块化配置:

    • @Configuration 类可以相互引用和组合,以创建模块化和可重用的配置。
    • 一个配置类可以通过在方法上标记 @Bean 注解来引用另一个配置类中定义的 Bean。
    • 通过组合多个 @Configuration 类,可以将应用程序的配置划分为不同的模块,提高配置的可读性和可维护性。
  4. 启用依赖注入:

    • @Configuration 类中,可以使用 @Autowired@Inject@Resource 等注解来注入依赖。
    • Spring 容器会根据这些注解自动进行依赖注入,将所需的 Bean 注入到配置类中。
    • 通过依赖注入,可以轻松地组装和配置复杂的对象关系,无需手动创建和管理依赖对象。
  5. 支持条件化配置:

    • @Configuration 类可以与条件化注解(如 @Conditional)结合使用,以根据特定条件有条件地创建和配置 Bean。
    • 通过使用条件化注解,可以根据运行时环境、类路径上的依赖项或自定义条件来动态地启用或禁用配置类或 Bean 的创建。
  6. 集成测试支持:

    • @Configuration 类可以在集成测试中使用,以配置测试所需的 Bean 和依赖项。
    • 通过在测试类中使用 @ContextConfiguration 注解并指定 @Configuration 类,可以加载测试所需的应用程序上下文和 Bean。
    • 这种方式使得编写集成测试变得更加简单和可控,无需依赖外部的配置文件。

总之,@Configuration 注解是 Spring 基于 Java 的配置方式的核心组件。它允许开发者使用 Java 类来定义和配置 Bean,提供了更加灵活和强大的配置能力。通过使用 @Configuration 类,可以模块化和组合配置,启用依赖注入,并支持条件化配置和集成测试。

使用 @Configuration 注解,开发者可以以编程方式控制应用程序的配置和组装,提高了配置的可读性、可维护性和灵活性。它是 Spring 基于 Java 的配置方式的基石,与其他注解(如 @Bean@Autowired 等)配合使用,构成了 Spring
应用程序配置的完整生态系统。

public class ConfigurationClassPostProcessor {
   

	public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
   
		//获取所有的bean names
		String[] candidateNames = registry.getBeanDefinitionNames();
		//遍历candidateNames,找出所有被标注@Configuration配置类
		if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
   
			configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
		}
		//创建配置类解析器ConfigurationClassParser
		ConfigurationClassParser parser = new ConfigurationClassParser(this.metadataReaderFactory, this.problemReporter, this.environment, this.resourceLoader, this.componentScanBeanNameGenerator, registry);
		//解析配置类
		parser.parse(candidates);
		//获取解析后的配置类ConfigurationClass集合
		Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.getConfigurationClasses())
  • 68
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值