Springboot 解析:自动配置

SpringBoot的自动配置功能基于条件注解,如@Conditional,根据类路径、配置属性等条件自动装配组件。例如,添加web依赖会自动配置Servlet相关组件。MyBatis的自动配置涉及MybatisAutoConfiguration类,通过@ConditionalOnClass、@EnableConfigurationProperties等注解实现,结合配置属性和@MapperScan扫描Mapper接口,简化了配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念

Spring Boot的自动配置功能是通过条件注解实现的。这种方式可以根据一定的条件来判断是否需要自动配置某些组件,在程序启动时自动装配这些组件到Spring容器中。这样,我们在使用Spring Boot时,只需要添加相应的依赖,就可以直接使用这些组件了,无需手动配置。

具体来说,Spring Boot对于每个需要自动配置的组件会提供一个对应的 @Conditional 注解,用于判断条件是否成立。这些注解可以基于配置属性、类路径、其他Bean的存在和其他条件进行条件判断。

当条件成立时,Spring会使用指定的自动配置类进行自动配置。这些自动配置类包含了几乎所有常见组件的配置。

比如,当我们添加了Spring Boot的Web依赖(spring-boot-starter-web)时,自动配置会检查类路径下是否存在org.springframework.web.servlet.DispatcherServlet类。如果存在,就使用内置的Servlet容器(Tomcat、Jetty或Undertow)创建Web应用,并自动配置Servlet相关的组件(DispatcherServletHandlerMappingViewResolver等等)。

通过这种方式,Spring Boot实现了自动装配的功能,简化了应用程序的开发配置,同时提供了许多可重用的、已经有了推荐的最佳实践的组件。

二、解析

Spring Boot的自动配置机制源码比较复杂,但是关键的部分还是比较容易理解的。我们来分析一下自动配置的源码实现。

首先是 @Conditional:Spring Boot中大量使用了这个注解,它的作用是根据某些条件决定是否执行某些Bean的创建和初始化操作。

@Target({ ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Conditional.class)
public @interface Conditional {
    Class<? extends Condition>[] value();
}

可以看到,@Conditional注解是可以重复的,也就是说可以同时使用多个条件进行判断。

Condition接口用于表示自定义的条件:

public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

matches方法用于判断条件是否成立,返回值类型为布尔值。

然后是自动配置的实现,以MyBatis Starter为例:

在pom.xml中添加如下依赖:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

使用mybatis-spring-boot-starter依赖就可以自动配置MyBatis相关Bean。

在Spring Boot自动配置中,MybatisAutoConfiguration是用于自动配置Mybatis的核心类。它是一个@Configuration注解的类,用于定义Bean的创建和初始化过程。

@Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
    // ...
}

其中,@ConditionalOnClass表示当classpath中存在指定的类时才进行自动配置;@EnableConfigurationProperties表示自动启用Spring的配置属性机制;@AutoConfigureAfter表示此配置类需要在哪些自动配置类完成后执行。

将具体的Mybatis配置细节从application.properties中分离出来:

mybatis.mapper-locations=classpath:mappers/*.xml

在MybatisAutoConfiguration类中,通过使用 @ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX) 来绑定application.properties中的属性值:

@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)
public class MybatisProperties {
    public static final String MYBATIS_PREFIX = "mybatis";

    // ...

    private String mapperLocations;

    // ...
}

然后,通过@Configuration注解的方法创建SqlSessionFactoryBean:

@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    Resource[] mapperLocations = resolver.getResources(properties.getMapperLocations());
    factory.setMapperLocations(mapperLocations);
    return factory.getObject();
}

这里的@ConditionalOnMissingBean注解表示当容器中不存在指定Bean时才去创建。

最后,通过 @MapperScan 注解自动扫描Mapper接口,使其成为Spring Bean:

@MapperScan(basePackages = "${mybatis.mapper-locations:}")
static class MybatisMapperScannerConfigurer {
    // ...
}

整个自动配置的流程就是这样,通过条件注解、自动配置类、配置属性机制和相关的Bean的创建与初始化来实现。在Spring Boot中,各种自动配置机制相互配合,使开发者能够更加专注于业务逻辑的开发,提高了开发的效率和便利性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暗星涌动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值