springboot自动配置

1. SpringBoot自动配置

@SpringBootApplication

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}), @Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class})}
)
public @interface SpringBootApplication{}

1.1 @SpringBootConfiguration
@Configuration
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
@Configuration:代表当前是一个配置类

1.2 @EnableAutoConfiguration
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

Class<?>[] exclude() default {};

String[] excludeName() default {};
}

1.2.1 @AutoConfigurationPackage
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
String[] basePackages() default {};

Class<?>[] basePackageClasses() default {};
}

@AutoConfigurationPackage:自动配置包

@Import:给容器中导入一个组件(Registrar.class),利用Registrar给容器中导入一系列组件;

registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry)方法中metadata代表注解的元信息,我们这个这个注解是@AutoConfigurationPackage;registerBeanDefinitions方法体的内部有一行代码getPackageNames()代表获取元注解的包信息,所以我们拿到的包信息就是Springboot的main方法的包路径;

public class AutoConfigurationPackages{
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
Registrar() {
}

public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}

public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new AutoConfigurationPackages.PackageImports(metadata));
}
}
}
所以,@Import 注解最终实现的结果就是将启动类路径下的包和子包,全部扫描进容器中;(全部扫描不意味着全部加载,能够被加载需要满足加载所需的条件)

springboot的自动配置是什么,有什么作用?

springboot的自动配置是一种机制,它能够根据应用程序中的依赖关系和配置信息,自动地配置和初始化应用程序中的各种组件和功能,从而使开发人员能够更快速地开发应用程序,提高开发效率。

具体来说,springboot的自动配置可以帮助我们自动配置数据库连接池、web容器、缓存、消息队列等常用的组件,还可以自动注册bean、扫描注解、配置日志等。通过自动配置,我们可以避免繁琐的手动配置,降低出错风险,让开发更加便捷和高效。

举一个简单的例子来说明springboot自动配置的作用:

假设我们需要使用Spring JDBC来连接数据库,并且使用HikariCP作为连接池。在传统的Spring应用程序中,我们需要手动配置数据源和连接池等信息,代码可能如下:

@Configuration
public class DataSourceConfig {
    @Bean
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
        config.setUsername("username");
        config.setPassword("password");
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        return new HikariDataSource(config);
    }
}

在Springboot中,我们不需要手动配置,只需要在pom.xml文件中引入相关的依赖,例如:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
</dependency>

然后在application.properties或application.yml文件中配置相关的属性,例如:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=username
spring.datasource.password=password

这样,Springboot就会自动配置数据源和连接池等信息,我们只需要在代码中注入DataSource即可使用。这样,我们就不需要手动编写大量的配置代码,能够更加高效地开发应用程序。

对以上例子的在代码中注入datasource举例说明

在以上例子中,我们可以在代码中注入DataSource,代码如下:

@RestController
public class MyController {
    @Autowired
    private DataSource dataSource;
    
    @GetMapping("/test")
    public String test() {
        try (Connection connection = dataSource.getConnection()) {
            // 使用连接进行数据库操作
            return "success";
        } catch (SQLException e) {
            e.printStackTrace();
            return "error";
        }
    }
}

在上面的代码中,我们在MyController中注入了DataSource,然后在test方法中使用getConnection方法获取连接进行数据库操作。由于我们在application.properties或application.yml文件中配置了相关的属性,Springboot会自动配置数据源和连接池,从而让我们能够更加方便地使用数据库。

springboot是怎么实现自动配置的呢?通过什么方法开启这个功能呢?

Spring Boot实现自动配置的核心是使用了Spring框架的条件注解和Spring Boot提供的自动配置类。条件注解可以根据特定的条件来决定某个Bean是否需要被创建,而自动配置类则提供了一种默认的配置方案,当某个Bean不存在时,Spring Boot会尝试根据默认的配置方案自动创建这个Bean。

Spring Boot内置了很多自动配置类,比如DataSourceAutoConfiguration、JdbcTemplateAutoConfiguration等,这些自动配置类都有一个@EnableXXX注解与之对应,通过在Application类上加上这个注解,就可以开启对应的自动配置。例如,如果需要开启DataSourceAutoConfiguration,可以在Application类上加上@EnableAutoConfiguration注解或@EnableDataSourceAutoConfiguration注解。

@EnableAutoConfiguration注解是一个元注解,它包含了一些常用的自动配置注解,比如自动配置数据源、Web、JPA等。如果只需要开启某个自动配置,可以使用相应的注解,比如@EnableDataSourceAutoConfiguration注解就只会开启数据源的自动配置。

需要注意的是,有时候Spring Boot的自动配置可能会与我们的实际需求不符,此时我们可以通过配置exclude属性来禁用某个自动配置类。例如,如果我们不需要使用数据源,可以在Application类上使用@EnableAutoConfiguration注解,并在exclude属性中指定DataSourceAutoConfiguration.class来禁用数据源的自动配置。

总之,Spring Boot的自动配置功能可以让我们更加方便地使用Spring框架和第三方库,减少了很多繁琐的配置工作,提高了开发效率。

posted @   人在代码在  阅读(187)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示