Spring Boot在Spring框架的基础上进行了多方面的简化,其中就包括自动配置:
它能根据项目中添加的依赖(通常是通过starter POMs)自动配置Spring组件,从而大大减少了手动配置的工作量。例如,加入spring-boot-starter-web
就会自动配置嵌入式的Tomcat服务器、Spring MVC等,无需显式定义这些配置。
Spring Boot的自动配置类位于其自身的库中,通常在org.springframework.boot.autoconfigure
包及其子包下。这些类不是放在你的应用程序的源代码目录中,而是作为Spring Boot框架的一部分提供,当你在项目中引入Spring Boot的依赖时,这些自动配置类就会生效。
当你想要查看或定制这些自动配置时,可以通过阅读Spring Boot的文档或者直接查看Spring Boot的源代码来了解具体配置类的位置和功能。此外,在你的应用程序启动过程中,Spring Boot会生成一个条件报告(condition evaluation report),这个报告会详细列出哪些自动配置类因为哪些条件而被启用或忽略。在Spring Boot应用运行时,可以通过在应用程序启动参数中添加--debug
或设置环境变量SPRING_BOOT_APPLICATION_JSON
来查看这个报告。
当然,并不是所有Spring Boot的自动配置类都会在每个应用中自动生效。自动配置是否执行取决于几个因素,主要是你的项目依赖管理和你的应用程序上下文中的类。
-
依赖管理:Spring Boot通过分析你的项目依赖来决定启用哪些自动配置。比如,如果你的项目中加入了
spring-boot-starter-data-jpa
依赖,Spring Boot就会自动配置JPA相关的bean,如数据源、实体扫描、事务管理等。这是因为这些配置类的激活条件检查到了相应的类或库存在于类路径中。 -
条件注解:自动配置类使用了Spring的
@ConditionalOnClass、
@ConditionalOnMissingBean
、@ConditionalOnProperty
等注解来控制它们何时被应用。这意味着只有当满足特定条件时(例如存在某个类、某个属性被设置为特定值等),这些配置才会生效。 -
自定义配置优先:如果你自己定义了一个与自动配置冲突的bean或属性,Spring Boot的自动配置会优雅地退让,不会覆盖你的自定义配置。这是遵循“你已经说了的就听你的”原则。
-
启用手动排除:你还可以通过在
application.properties
或application.yml
中设置spring.autoconfigure.exclude
来显式排除不希望应用的自动配置类。
@ConditionalOnClass:
此注解用于基于类存在的条件来决定是否应用某个配置类或配置方法。如果类路径(classpath)上存在指定的类(通过value
属性指定)或类名(通过name
属性指定),那么标记了此注解的配置就会生效。这常用于确保只有当特定的类库可用时,相关的配置才会被注册。例如,如果你的应用只有在连接数据库时才需要数据源配置,就可以用这个注解来确保数据库驱动类存在时才配置数据源。
@ConditionalOnMissingBean:
此注解用于确保在Spring容器中不存在某个类型的bean时,才创建并注册一个新的bean。通过它,你可以防止相同类型的bean被多次定义,确保了bean的唯一性。如果已经存在一个匹配的bean(可以根据类型或名称匹配,可通过属性自定义),那么带有此注解的bean定义将不会被注册。这有助于避免不必要的覆盖和潜在的冲突,提高配置的灵活性和可重用性。
@ConditionalOnProperty:
此注解用于基于配置属性的值来决定是否应用某个配置。它允许你根据application.properties
或application.yml
等配置文件中的属性值来控制配置的激活。你可以指定属性的名称、是否必须存在以及期望的值或值的前缀等。如果属性的条件得到满足(例如,某个属性被设置为特定的值),那么标记此注解的配置就会被执行。这对于按需开启或关闭某些功能非常有用,增加了应用的可配置性和灵活性。