SpringBoot自动装配原理

一,自动装配是什么

        为什么我们在使用springboot时,只需要添加启动器坐标,容器中就会有启动器对应的bean,这都要得益于springboot的自动装配,springboot启动类会在程序运行时,读取META-INF/spring.factories文件中需要自动装配的类,并根据不同类中的不同条件进行bean的装配。

二,自动装配的流程

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

}

        在启动类中有一个名为@SpringBootApplication的注解,这个注解标注着这是要一个springboot应用,实现了自动装配@EnableAutoConfiguration,组件扫描@ComponentScan等功能,简化配置,提供默认行为加速了应用的开发和部署。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    //。。。
}

        在这之中,@EnableAutoConfiguration便是自动装配的注解,以前我们需要自己配置的东西,而现在SpringBoot可以自动帮我们配置,@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效;

再点进去进去看一下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    //。。。
}

        这之中有自动配置包@AutoConfigurationPackage:

//AutoConfigurationPackage的子注解
//Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}

        还和我们需要关心的@Import,@Import中的导入了自动配置导入选择器AutoConfigurationImportSelector,在这个类中会向容器中导入组件:

        导入所有需要自动配置的类后,根据类对应启动器中的自动配置类条件进行bean的装配,例如redis的自动配置类:

@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}
        如果环境中有RedisOperation这个类,才会根据有没有对应的bean来进行模板类的装配,如果没有则装配,有则不进行装配。
三,总结原理:
        1)@EnableAutoConfiguration 注解内部使用 @Import(AutoConfigurationImportSelector. class )来加载配置类。
        2)配置文件位置:META-INF/spring.factories ,该配置文件中定义了大量的配置类, SpringBoot应用启动时,会自动加载这些配置类,初始化Bean。
        3)并不是所有的Bean 都会被初始化,在配置类中使用 Condition 来加载满足条件的 Bean。
        @EnableAutoConfiguration的实现方式是导入配置文件META-INF/spring.factories中EnableAutoConfiguration所对应的所有的类,最后根据条件@Conditional导入容器中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值