目录
一、自动配置
Springboot实现自动配置的核心机制
@Conditional的作用是什么?
如何自定义自动配置?
步骤
例子分析
自动配置的优先级
如何禁用特定的自动配置?
二、starter
如何理解Spring Boot中的starter?
如何自定义starter?
三、自动配置和 Starter 的关系和区别?
一、自动配置
Springboot实现自动配置的核心机制
1)自动配置是通过 @EnableAutoConfiguration 注解实现的。
这个注解位于@SpringBootApplication 中。换句话说,@SpringBootApplication实际上包含了@EnableAutoConfiguration,从而启用了自动配置功能。
通过 @import 注解导入 AtuoConfigurationlmportSelector 类, 会通过扫描类路径中的依赖,根据应用的上下文自动加载配置类,并为应用自动注入合适的Bean。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";Class<?>[] exclude() default {};String[] excludeName() default {};
}
2)spring.factories 文件
Spring Boot 的自动配置依赖于META-INF/Spring.factories 文件(文件里定义了所有的自动配置类)。
springboot启动时,它会根据 spring.factories 文件中指定的配置类加载相应的自动配置。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
3)条件注解(Conditional)
自动配置类通常使用@Conditionalonclass、@@ConditionalonMissingBean、@ConditionalonProperty等条件注解。
它们控制自动配置的加载条件,例如,仅在类路径中存在某个类时才加载某些配置。
@Configuration
@ConditionalOnClass(DataSource.class) // 只有类路径中存在 DataSource 时才生效
public class DataSourceAutoConfiguration {@Bean@ConditionalOnMissingBean // 如果没有自定义 DataSource,则使用默认配置public DataSource dataSource() {return new HikariDataSource();}
}
@Conditional的作用是什么?
作用于有条件地装配Bean。可以根据特定的条件来决定某个Bean是否应该被加载到 Spring 容器中。
主要作用:
- 有条件地加载 Bean:@Conditional 根据某个条件来决定某个 Bean 是否需要注入到 Spring 容器中。条件可以是操作系统类型、类路径是否存在某个类、某个属性的值等。
- 实现动态配置:可以根据环境(如开发、测试、生产)或特定上下文条件动态装配Bean,避免不必要的Bean被加载。
使用场景:
- 在不同的操作系统或环境中注入不同的Bean。
- 根据应用程序的配置文件、属性值来动态启用某些功能。
- 在条件满足时,才装配某些依赖或服务。
如何自定义自动配置?
步骤
1)创建自动配置类
自定义自动配置类需要标注@Configuration注解,同时可以使用各种条件注解控制配置的加载。
@Configuration
@ConditionalOnClass(MyCustomService.class)
public class MyCustomAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyCustomService myCustomService() {return new MyCustomService();}
}
2)配置spring.factories文件
创建 META-INF/spring.factories 文件,并将自定义的自动配置类注册到EnableAutoConfiguration 中。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.config.MyCustomAutoConfiguration
3)打包并发布
自定义的自动配置类可以随应用一起打包,也可以打包成库供其他应用使用。当这个库被引入到其他Spring Boot应用时,自动配置就会生效。
例子分析
这段代码是用于Spring Boot框架的自动配置类。下面是对代码的具体分析:
@Configuration注解:是一个Spring框架的注解,表示该类是一个配置类,其中包含了一个或多个@Bean定义的方法。这些方法返回的对象会被注册为Spring容器中的bean。
@ConditionalOnClass(MyCustomService.class)条件注解:表示只有当类路径下存在MyCustomService类时,这个配置类才会被加载。这是一种常见的用于控制配置是否生效的手段。
@Bean注解:表明这个方法将返回一个对象,该对象会被注册到Spring IoC容器中作为bean。
@ConditionalOnMissingBean注解:表示只有在Spring容器中不存在相同类型的bean时,这个方法才会创建并注册新的bean。这可以避免在已有配置的情况下重复创建相同的bean。
定义一个MyCustomAutoConfiguration的公共类,通过@Configuration注解表示该类是一个自动配置类。通过@ConditionalOnClass(MyCustomService.class)条件注解,设置当该配置类路径下存在MyCustomService类时,该配置类才会被加载。
然后,@Bean和@ConditionalOnMissingBean这两个注解共同作用于myCustomService()方法上。只有在Spring容器中不存在相同类型的bean时,这个方法才会创建并注册新的bean。return new MyCustomService();表示返回一个新的MyCustomService实例,并将其注入到Spring容器中。
在/spring.factories 文件中,org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.config.MyCustomAutoConfiguration这行代码是Spring Boot自动配置的一部分,它告诉Spring Boot在启动过程中自动加载 MyCustomAutoConfiguration 配置类。
总结来说,这段代码定义了一个自动配置类,用于在满足特定条件时(即存在MyCustomService类且当前容器中没有同类型bean时),自动创建并注册一个MyCustomService bean到Spring容器中。这种方式简化了开发者的工作,使得应用可以根据项目实际情况自动调整。
自动配置的优先级
Spring Boot 提供了控制自动配置顺序的机制:可以通过@AutoConfigureBefore 和@AutoConfigureAfter注解,来指定自动配置类的加载顺序。
- @AutoConfigureBefore:让当前配置类在指定的配置类之前加载。
- @AutoConfigureAfter:让当前配置类在指定的配置类之后加载。
@Configuration
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
public class MyDataSourceAutoConfiguration {// 自定义的数据源配置
}
这段代码定义了一个自定义的自动配置类MyDataSourceAutoConfiguration
,用于在Spring Boot应用程序中进行数据源配置。下面是详细的分析:
首先,通过@Configuration注解表明这是一个配置类,意味着这个类包含了使用@Bean注解的方法,这些方法会生成Spring管理的bean。
然后,@AutoConfigureBefore(DataSourceAutoConfiguration.class)注解指定了此配置类应该在DataSourceAutoConfiguration之前被处理。其中, DataSourceAutoConfiguration是Spring Boot提供的一个自动配置类,用于配置数据源。通过这种方式,就可以确保这个自定义数据源配置优先于Spring Boot默认的数据源配置。
然后,就可以在类里自定义的数据源配置,代码中没有写具体的配置内容。
如何禁用特定的自动配置?
在某些情况下,SpringBoot的默认自动配置可能与业务需求不符,可以通过以下方式禁用不需要的自动配置类。
1)在 application.properties 中禁用
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
spring.autoconfigure.exclude
是一个配置属性,可以在application.properties
或application.yml
文件中设置,用来排除指定的自动配置类。
2)使用@SpringBootApplication注解的exclude属性
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})注解组合了@Configuration、@EnableAutoConfiguration和@ComponentScan。
注解里的exclude属性用于明确地排除指定的自动配置类,DataSourceAutoConfiguration就是被排除的配置类。
二、starter
如何理解Spring Boot中的starter?
starter就是一组依赖的集合,引l入一个starter就相当于引入了这一组依赖,简化依赖管理。
比如:spring-boot-starter-web 包含了json、tomcat、spring-webmvc等多个依赖。
<dependencies><!-- 使用 starter 管理依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 使用 starter 进行数据访问 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
</dependencies>
spring-boot-starter-web这个依赖项包含了Web应用开发所需的所有依赖,包括Spring MVC、嵌入式Tomcat服务器、JSON支持等。它简化了Web应用的依赖管理,开发者只需添加这一行依赖即可拥有完整的Web开发环境。
spring-boot-starter-data-jpa这个依赖项包含了JPA(Java Persistence API)相关的所有依赖,包括Spring Data JPA、Hibernate、数据库驱动等。它简化了数据访问层的依赖管理,开发者只需添加这一行依赖即可拥有完整的JPA支持。
如何自定义starter?
1)创建自动配置类:选择将哪些对象(比如连接客户端)注入到Spring容器中。
@Configuration
public class JedisAutoConfiguration {@Beanpublic MyService myService(JedisProperties properties) {return new Jedis(properties);}
}
2)创建属性类:加载使用者自定义的属性进来(username、password)。
@ConfigurationProperties("jedis")
public class JedisProperties {private String username;private String password;
}
3)创建spring.factories文件:即使用者的Spring容器初始化时,会将我们的自动配置类加载进去。
在resources/META-INF目录下创建spring.factories文件,内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.JedisAutoConfiguration
4)引入我们自定义的starter依赖。
三、自动配置和 Starter 的关系和区别?
Spring Boot 的自动配置和 Starter 之间有密切的关系,但它们的功能和用途有所不同。下面详细介绍这两者之间的关系和区别。
1)定义
自动配置是 Spring Boot 的核心特性之一,它根据类路径上的依赖和配置属性自动配置应用。自动配置的目标是尽可能减少开发者的手动配置工作。
而Starter 是一组依赖管理工具,简化了 Spring Boot 应用程序的依赖管理。Starter 提供了一组相关的依赖项,使开发者更容易地引入和管理所需的库。
2)关系
依赖关系:自动配置依赖于 starter 来引入所需的依赖项。例如,spring-boot-starter-data-jpa
包含了 JPA 相关的依赖,而自动配置则利用这些依赖来配置 JPA 相关的组件。
互补关系:Starter 提供了依赖管理,而自动配置则提供了基于这些依赖的自动化配置。
3)区别
目的不同:
- 自动配置的目的是减少手动配置工作,提高开发效率。
- Starter 的目的是简化依赖管理,减少项目构建文件中的冗余配置。
应用场景不同:
- 自动配置适用于希望快速启动并运行应用的场景,尤其是在没有太多自定义需求的情况下。
- Starter 适用于希望简化项目依赖管理和版本控制的场景。
总结一下,自动配置是通过条件注解和依赖检测自动配置应用组件。Starter是用来简化依赖管理,提供一组相关的依赖项。两者结合使用,可以显著提高开发效率,减少配置工作量。