Spring Boot 自动装配

Spring Boot 自动装配

愚见

  1. @Configuration + @Bean 用于注册bean
  2. Spring 不会将 第三方的包 注册 为bean
  3. Spring 只会管理 当前包 和 子包 里面的类
  4. Spring 可以 通过 @Import 注解引入第三方包 里面的类
  5. 理解自动装配主要需要 解决 以下三个问题

一、自动装配做了什么?

  • 自动装配:提前将默认配置实现好,然后判断项目中是否有 手动配置;如果有就覆盖,没有则使用默认配置。这就是 默认 > 手动,默认兜底的思想。
  • 具体实现:创建 Java 配置类,实现默认配置,通过 注解 交给Spring 容器管理

二、第三方包的配置类是如何交给 Spring 容器管理的?

  • 第三方包里面的配置类 也是通过 Spring 注解 @Configuration + @Bean ,将配置类加载到 Spring 容器中的
  • 以阿里巴巴的数据库连接池 Druid 的 start 包 druid-spring-boot-starter-1.1.14.jar举例:
    用 @Configuration + @Bean 注册bean
    用 @ConditionalOnClass()、@ConditionalOnMissingBean() 条件注解 控制 bean 是否注册
    用 @AutoConfigureBefore() 控制 bean 注册顺序
    用 @EnableConfigurationProperties() 注册 读取配置文件的类(DruidStatProperties)为 bean
    用 @Import() 导入其他类 交给 Spring 管理
package com.alibaba.druid.spring.boot.autoconfigure;

@Configuration
@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
    private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceAutoConfigure.class);

    public DruidDataSourceAutoConfigure() {
    }

    @Bean(
        initMethod = "init"
    )
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        LOGGER.info("Init DruidDataSource");
        return new DruidDataSourceWrapper();
    }
}

三、Spring Boot 是如何扫描到第三方包的?

  1. Spring Boot 扫描所有路径下面的 spring.factories 文件
  2. 读取 spring.factories 文件里面的 类全名配置
  3. Spring Boot 通过 ImportSelector 接口的实现类 :AutoConfigurationImportSelector ,将 读取到的类 交给 Spring 管理
  1. ImportSelector 接口的作用

将 多个类 通过类全名的方式,交给 Spring 管理

public class Myclass implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"com.yc.Test.TestDemo2","com.yc.Test.TestDemo1"};
    }
}
@Import({Myclass.class})
public class TestDemo {
        @Bean
        public AccountDao2 accountDao2(){
            return new AccountDao2();
        }

}
  1. spring.factories 文件
    druid-spring-boot-starter-1.1.14.jar/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure

引用

ImportSelector 接口使用


如有不当之处,敬请指正
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值