千家信息网

SpringBoot四大神器之怎么使用Auto onfiguration

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"SpringBoot四大神器之怎么使用Auto onfiguration",在日常操作中,相信很多人在SpringBoot四大神器之怎么使用Auto onfiguration问题上存
千家信息网最后更新 2026年11月01日SpringBoot四大神器之怎么使用Auto onfiguration

这篇文章主要介绍"SpringBoot四大神器之怎么使用Auto onfiguration",在日常操作中,相信很多人在SpringBoot四大神器之怎么使用Auto onfiguration问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"SpringBoot四大神器之怎么使用Auto onfiguration"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    Spring Boot非常简单容易上手,它隐藏了很多内容而不需要你去关心。但对于一个好的开发人员也许希望知道Spring Boot自动配置背后到底发生了什么?

    Spring Boot并不属于一种新的技术,只不过Spring Boot的启动器帮我们配置了若干个被Spring管理的bean,当我们的项目依赖这些jar并启动Spring应用时,Spring的Container容器已经把jar包下的对象加以创建及管理了。

    简而言之,Spring Boot自动配置代表了一种基于类路径上存在的依赖关系自动配置Spring应用程序的方法。还可以通过定义消除自动配置类中包含的某些bean。这些可以使开发更快更容易。

    springboot auto configuration的本质就是自动配置spring的各种bean。然后使应用可以通过@Autowired等注入方式来直接使用bean。比如自动配置redisTemplate,jdbcTemplate等bean。

    1. 通过启动类创建Spring Boot应用

    创建Spring Boot应用非常简单,只要创建一个包含main的启动类即可。

    import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ApplicationContext; @SpringBootApplicationpublic class App{    public static void main(String[] args)    {        ApplicationContext ctx = SpringApplication.run(App.class, args);    }}

    上面这个类被称为Spring Boot应用的启动类,它通过一个java的main()方法来引导和启动一个Spring应用。它通常包含了以下内容:

    • 创建一个Spring ApplicationContext实例。

    • 接收命令行参数并将其转为Spring属性。

    • 按照配置加载所有Spring Bean。可以根据项目需求进行其他操作。

    2. @SpringBootApplication注解

    这个注解其实是一个应用了3个注解的快捷方式。

    2.1 @SpringBootConfiguration

    @SpringBootConfiguration是在Spring Boot2中出现的一个新的注解。之前我们都是使用的 @Configuration注解,可以用 @Configuration来替换它,2个都是实现同样的功能。

    它表示该类是一个配置类,应该对其进行扫描,以获得进一步的配置和bean定义。

    2.2 @EnableAutoConfiguration

    此注解用于启用Spring Application Context的自动配置,尝试猜测和配置您可能需要的bean。自动配置类通常基于您的类路径以及您定义的bean来应用。

    自动配置尝试尽可能智能,并在您定义更多自己的配置时进行后退。您始终可以使用两种方法来手动排除任何您不想应用的配置:

    • 使用excludeName()

    • 使用spring.autoconfigure.exclude属性文件中的属性。

    2.3 @ComponentScan

    此注解提供了与Spring XML context:component-scan元素并行的支持。

    无论是basePackageClasses()或basePackages()可以定义特定的软件包进行扫描。如果未定义特定包,则将从声明此注解的类的包进行扫描。

    3.自定义自动配置

    要创建自定义自动配置,我们需要创建一个注释为@Configuration的类并注册它。

    让我们为MySQL数据源创建自定义配置:

    @Configurationpublic class MySQLAutoconfiguration {  //...}

    下一个必须的步骤是通过在标准文件资源/ META-INF / spring.factories中的属性org.springframework.boot.autoconfigure.EnableAutoConfiguration下添加类的名称,将类注册为自动配置候选者:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.peterwanghao.samples.springboot.autoconfiguration.MySQLAutoconfiguration

    如果我们希望我们的自动配置类优先于其他自动配置候选者,我们可以添加@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)注解。

    自动配置是使用标有@Conditional注解的类和bean设计的,以便可以替换自动配置或其特定部分。

    请注意,只有当应用程序中未定义自动配置的bean时,自动配置才有效。如果您定义了bean,那么将覆盖默认值。

    3.1 基于类的条件注解

    Class conditions允许我们指定使用@ConditionalOnClass注解指定的类,或者使用@ConditionalOnMissingClass注解来指定不存在于 classpath 上的类。

    让我们指定只有存在类DataSource的情况下才会加载MySQLConfiguration,在这种情况下我们可以假设应用程序将使用数据库:

    @Configuration@ConditionalOnClass(DataSource.class)public class MySQLAutoconfiguration {    //...}

    3.2 基于Bean的条件注解

    如果我们只想在指定的bean存在的情况下包含bean,我们可以使用@ConditionalOnBean和@ConditionalOnMissingBean注解。

    举例说明,让我们将一个entityManagerFactory bean 添加到我们的配置类中,并指定如果存在一个名为dataSource的bean 并且尚未定义一个名为entityManagerFactory的 bean,我们就创建这个bean :

    @Bean @ConditionalOnBean(name = "dataSource") @ConditionalOnMissingBean public LocalContainerEntityManagerFactoryBean entityManagerFactory() {  final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();  em.setDataSource(dataSource());  em.setPackagesToScan("com.peterwanghao.samples.springboot.autoconfiguration.example");  em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());  if (additionalProperties() != null) {   em.setJpaProperties(additionalProperties());  }  return em; }

    让我们配置一个只在尚未定义类型为JpaTransactionManager的bean时才会加载的transactionManager bean :

    @Bean @ConditionalOnMissingBean(type = "JpaTransactionManager") JpaTransactionManager transactionManager(final EntityManagerFactory entityManagerFactory) {  final JpaTransactionManager transactionManager = new JpaTransactionManager();  transactionManager.setEntityManagerFactory(entityManagerFactory);  return transactionManager; }

    3.3 基于属性的条件注解

    @ConditionalOnProperty注解用于指定是否配置将基于Spring环境属性的存在和值被加载。

    首先,让我们为配置添加一个属性源文件,以确定从哪里读取属性:

    @PropertySource("classpath:mysql.properties")public class MySQLAutoconfiguration {    //...}

    我们可以配置主DataSource bean,它将用于创建与数据库的连接,只有在存在名为usemysql的属性时才会加载它。

    我们可以使用属性havingValue来指定必须匹配的usemysql属性的某些值。

    如果usemysql属性设置为local,让我们使用默认值定义dataSource bean,该默认值连接到名为myDb的本地数据库:

    @Bean @ConditionalOnProperty(name = "usemysql", havingValue = "local") @ConditionalOnMissingBean public DataSource dataSource() {  final DriverManagerDataSource dataSource = new DriverManagerDataSource();  dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");  dataSource.setUrl("jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true&&serverTimezone=GMT%2B8");  dataSource.setUsername("root");  dataSource.setPassword("123456");  return dataSource; }

    如果usemysql属性设置为自定义,则数据源 bean将使用自定义属性值的数据库URL,用户和密码进行配置:

    @Bean(name = "dataSource") @ConditionalOnProperty(name = "usemysql", havingValue = "custom") @ConditionalOnMissingBean public DataSource dataSource2() {  final DriverManagerDataSource dataSource = new DriverManagerDataSource();  dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");  dataSource.setUrl(env.getProperty("mysql.url"));  dataSource.setUsername(env.getProperty("mysql.user") != null ? env.getProperty("mysql.user") : "");  dataSource.setPassword(env.getProperty("mysql.pass") != null ? env.getProperty("mysql.pass") : "");  return dataSource; }

    该mysql.properties文件将包含usemysql属性:

    usemysql=local

    如果使用MySQLAutoconfiguration的应用程序希望覆盖默认属性,则它需要做的就是为mysql.properties文件中的mysql.url,mysql.user和mysql.pass属性添加不同的值以及添加usemysql = custom行。

    3.4 基于资源的条件注解

    添加@ConditionalOnResource注解意味着仅在存在指定资源时才加载配置。

    让我们定义一个名为additionalProperties()的方法,该方法将返回一个Properties对象,该对象包含entityManagerFactory bean 使用的特定于Hibernate的属性,仅当存在资源文件mysql.properties时:

    @ConditionalOnResource(resources = "classpath:mysql.properties") @Conditional(HibernateCondition.class) final Properties additionalProperties() {  final Properties hibernateProperties = new Properties();  hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("mysql-hibernate.hbm2ddl.auto"));  hibernateProperties.setProperty("hibernate.dialect", env.getProperty("mysql-hibernate.dialect"));  hibernateProperties.setProperty("hibernate.show_sql",    env.getProperty("mysql-hibernate.show_sql") != null ? env.getProperty("mysql-hibernate.show_sql")      : "false");  return hibernateProperties; }

    我们可以将Hibernate特定的属性添加到mysql.properties文件中:

    mysql-hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialectmysql-hibernate.show_sql=truemysql-hibernate.hbm2ddl.auto=create-drop

    3.5 自定义条件

    如果我们不想使用Spring Boot中的任何可用条件,我们还可以通过扩展SpringBootCondition类并重写getMatchOutcome()方法来定义自定义条件。

    让我们为additionalProperties()方法创建一个名为HibernateCondition的条件,该方法将验证类路径上是否存在HibernateEntityManager类:

    static class HibernateCondition extends SpringBootCondition {  private static final String[] CLASS_NAMES = { "org.hibernate.ejb.HibernateEntityManager",    "org.hibernate.jpa.HibernateEntityManager" };  @Override  public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {   ConditionMessage.Builder message = ConditionMessage.forCondition("Hibernate");   return Arrays.stream(CLASS_NAMES)     .filter(className -> ClassUtils.isPresent(className, context.getClassLoader()))     .map(className -> ConditionOutcome.match(message.found("class").items(Style.NORMAL, className)))     .findAny().orElseGet(() -> ConditionOutcome.noMatch(       message.didNotFind("class", "classes").items(Style.NORMAL, Arrays.asList(CLASS_NAMES))));  } }

    然后我们可以将条件添加到additionalProperties()方法:

    @Conditional(HibernateCondition.class)Properties additionalProperties() {  //...}

    3.6 申请条件

    我们还可以通过添加@ConditionalOnWebApplication或@ConditionalOnNotWebApplication注释来指定只能在Web上下文内部/外部加载配置。

    4. 测试自动配置

    让我们创建一个非常简单的例子来测试我们的自动配置。我们将使用Spring Data 创建一个名为MyUser的实体类和一个MyUserRepository接口:

    @Entitypublic class MyUser { @Id private String email; public MyUser() { } public MyUser(String email) {  super();  this.email = email; } public String getEmail() {  return email; } public void setEmail(String email) {  this.email = email; }}
    public interface MyUserRepository extends JpaRepository {}

    要启用自动配置,我们可以使用@SpringBootApplication或@EnableAutoConfiguration注解:

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

    接下来,让我们编写一个保存MyUser实体的JUnit测试:

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = AutoconfigurationApplication.class)@EnableJpaRepositories(basePackages = { "com.peterwanghao.samples.springboot.autoconfiguration.example" })public class AutoconfigurationLiveTest {    @Autowired    private MyUserRepository userRepository;    @Test    public void whenSaveUser_thenOk() {        MyUser user = new MyUser("user@email.com");        userRepository.save(user);    }}

    由于我们尚未定义DataSource配置,因此应用程序将使用我们创建的自动配置连接到名为myDb的MySQL数据库。

    连接字符串包含createDatabaseIfNotExist = true属性,因此数据库不需要存在。但是,需要创建用户mysqluser或通过mysql.user属性指定的用户mysqluser。

    我们可以检查应用程序日志,看看是否正在使用MySQL数据源:

    10:31:47.092 [main] INFO org.hibernate.Version - HHH000412: Hibernate Core {5.3.7.Final}
    10:31:47.094 [main] INFO org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found
    10:31:47.227 [main] INFO o.h.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {5.0.4.Final}
    10:31:48.039 [main] INFO org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
    Hibernate: drop table if exists MyUser
    Hibernate: create table MyUser (email varchar(255) not null, primary key (email)) engine=InnoDB
    10:31:48.655 [main] INFO o.h.t.s.internal.SchemaCreatorImpl - HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@3a0b6a'
    10:31:48.666 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default'
    10:31:49.496 [main] INFO o.s.s.c.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
    10:31:49.569 [main] WARN o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration$JpaWebMvcConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
    10:31:49.701 [main] WARN o.s.b.a.t.ThymeleafAutoConfiguration$DefaultTemplateResolverConfiguration - Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration)
    10:31:50.091 [main] INFO c.p.s.s.a.AutoconfigurationLiveTest - Started AutoconfigurationLiveTest in 4.803 seconds (JVM running for 5.519)
    Hibernate: select myuser0_.email as email1_0_0_ from MyUser myuser0_ where myuser0_.email=?
    Hibernate: insert into MyUser (email) values (?)
    10:31:50.279 [Thread-2] INFO o.s.s.c.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor'
    10:31:50.281 [Thread-2] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default'
    10:31:50.282 [Thread-2] INFO o.h.t.s.i.SchemaDropperImpl$DelayedDropActionImpl - HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down'
    Hibernate: drop table if exists MyUser

    5. 禁用自动配置类

    如果我们想要从加载中排除自动配置,我们可以将带有exclude或excludeName属性的@EnableAutoConfiguration注解添加到配置类:

    @Configuration@EnableAutoConfiguration(  exclude={MySQLAutoconfiguration.class})public class AutoconfigurationApplication {    //...}

    禁用特定自动配置的另一个方法是设置spring.autoconfigure.exclude属性:

    spring.autoconfigure.exclude=com.peterwanghao.samples.springboot.autoconfiguration.MySQLAutoconfiguration

    到此,关于"SpringBoot四大神器之怎么使用Auto onfiguration"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

    配置 属性 注解 应用 方法 条件 数据 应用程序 数据库 文件 程序 神器 可以通过 资源 学习 只有 对象 尚未 情况 数据源 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 科技互联网企业 高科技互联网 互联网科技行业发展 互联网科技垄断 互联网络科技有限公司 互联网金融科技创新 腾讯科技 互联网女皇 中国互联网有什么科技含量 互联网企业和科技型企业 彤创互联网科技有限公司 青岛科技大学互联网大赛研究生 搜狐科技互联网 深圳育鹏互联网科技有限公司招聘 想开互联网科技公司怎么样 中国互联网有什么科技 版纳互联网科技选哪家 艺电能源互联网科技有限公司招聘 平安好医生打造互联网科技医疗 上海旺乐尼互联网科技有限公司 科技互联网企业 互联网科技公司的优势 融势互联网科技 互联网科技产品 须眉科技是互联网公司吗 赶超互联网科技 微信多开 哈尔滨屹滨互联网科技有限公司 佛山市翊博互联网络科技有限公司 互联网科技企业商标注意事项 第三届互联网大会安防黑科技
    0