【深入浅出】SpringBoot 自动装配原理 以及 自定义Starter

SpringBoot 自动装配原理剖析及应用(自定义Starter)

引言: SpringBoot 为啥这么方便?

在早期的Spring + Spring MVC项目开发过程中,需要大量的xml配置,这一点让广大程序员们苦不堪言,web.xmlapplicationContext.xml ……这些配置文件拖慢了开发效率,对于新手程序员也十分不友好,直接劝退。

Spring团队也意识到了此问题,推出了SpringBoot来解决此问题,其遵循“约定大于配置”的理念,配合各种Starter几乎可以“零配置”编码,那到底是什么样神奇的黑魔法让我们的开发变得如此轻松快速呢?

解密黑魔法:自动装配

所谓装配是指 SpringBoot框架自动把项目依赖的对象,装入IOC容器,便于开发者直接使用。自动装配虽然方便了开发者,但是增大了依赖提供者(造轮子的人)的工作量,提供者需要屏蔽掉内部细节,把需要注入到IOC容器内的对象暴露给SpringBoot框架。

其实原理非常简单,核心就在于 org.springframework.core.io.support.SpringFactoriesLoader 这个类, loadFactoryNames() 这一方法根据 META-INF/spring.factories这一配置文件去加载所需要管理的类。很多同学不清楚的原因在于这个方法的调用链路比较长,自己一层一层深入容易搞晕,可参加下面的流程图从 @SpringBootApplication 注解开始,去完整走一遍,会清楚很多。

SpringBoot 自动配置原理-调用图

Starter 四部曲

有过SpringBoot开发经验的同学肯定对 starter 这一词非常熟悉,在项目中我们会用到各种各样的starter,比如 spring-boot-starter-webspring-boot-starter-actuator……当我们需要给其他小伙伴提供“轮子”时,势必要提供自己的starter,把那些有用的对象,让SpringBoot框架自动注入进去。 以自动装配原理为基础,写一个Starter需要四步。

  1. 编写业务类

业务类负责主要的业务逻辑,也就是我们所要提供的主要功能。以一个简单的sayName功能为例:

public class ApiLogger {
    private String name;

    public String sayName() {
        System.out.println(name);
        return name;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}

  1. 编写属性类

该类主要用途为从application.yml or application.properties 中读取配置信息,使得程序更加灵活易拓展。

@ConfigurationProperties(prefix = "api-logger")
public class ApiLoggerProperties {
    private String name = "777";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

@ConfigurationProperties 可以理解为多个@value的集合,会根据前缀与字段名称自动匹配。
prefix 属性对应着配信息的前缀,以此程序为例配置信息应该这样抒写:

api-logger:
  name: 999

此时 “999” 会把默认的 “777” 给覆盖掉,若没有配置则使用默认值。

  1. 编写自动配置类

该类将属性类与业务类结合起来,是自动配置的中心。

@Configuration
// 开启配置属性
@EnableConfigurationProperties(ApiLoggerProperties.class)
@ConditionalOnClass(ApiLogger.class)
@ConditionalOnProperty(prefix = "api-logger",value = "enabled",matchIfMissing = true)
public class ApiLoggerAutoConfiguration {
    @Autowired
    ApiLoggerProperties properties;

    // 返回所需要注入的业务类
    @Bean
    public ApiLogger apiLogger(){
        ApiLogger logger = new ApiLogger();
        logger.setName(properties.getName());
        return logger;
    }


}
  1. 编写spring.factories

暴露所需要自动注入的对象给SpringBoot框架

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.demo.logger.ApiLoggerAutoConfiguration

文件路径

此时可以将此项目打包,发布到Maven仓库共其他小伙伴使用啦。其他小伙伴只需要引入此项目,然后直接使用@Autowired注入使用。

后记

此篇文章只是简单介绍了SpringBoot 自动装配原理 以及 自定义Starter基本步骤,复杂的项目肯定不会是仅仅自动注入一个对象那么简单,还会配合有很多复杂的功能以 Seata 为例:其底层利用AOP实现了AT模式的分布式事务,但对于开发者来说只需要在程序中加入一个@GlobalTransactional即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值