SpringBoot的自动装配@SpringBootApplication的浅显分析

SpringBoot的自动装配@SpringBootApplication

一、@SpringBootApplication
二、自定义starter
三 、总结

一、@SpringBootApplication

随着Spring框架的流行,在web服务器端的开发,Spring几乎成了开发的标准。但是随着开发的业务越来越复杂,分布式微服务的出现。基于SpringBoot开发在web服务端以及分布式微服务应用中,SpringBoot和基于SpringBoot的SpringCloud等也已经成为了主流。

SpringBoot的特点

1.创建独立的Spring应用程序,SpringBoot是基于Spring开发。
2.直接嵌入Tomcat、Jetty或Undertow(无需部署WAR文件)
3.提供一个start启动项来简化配置
4.尽可能自动配置Spring和第三方库

@SpringBootApplication的组成
SpringBoot的自动装配@SpringBootApplication的浅显分析_第1张图片

@SpringBootApplication注解由组合注解构成,其中包括四大元注解以及 @SpringBootConfiguration 、 @EnableAutoConfiguration 、 ComponentScan 三个注解构成。
其中
1.@SpringBootConfiguration注解是由@Configuration注解构成,也就是@SpringBootConfiguration作用等同于Spring中的@Configuation注解的作用一致,表明该类能被IoC容器扫描到。
2.@EnableAutoConfiguration注解由@AutoConfigurationPackage和@Import注解组成。
在这里插入图片描述
SpringBoot的自动装配@SpringBootApplication的浅显分析_第2张图片

@Import注解中传入一个class,可以将该类作为配置类注入到IoC中等同于
在这里插入图片描述

在这里插入图片描述
进入AutoConfigurationImportSelector类中,找的selectImports方法,进入getAutoConfigurationEntry方法中。
SpringBoot的自动装配@SpringBootApplication的浅显分析_第3张图片
SpringBoot的自动装配@SpringBootApplication的浅显分析_第4张图片
在这里插入图片描述
进入CandidateConfigurations方法中找到loadFactoryByNames
在这里插入图片描述

SpringBoot的自动装配@SpringBootApplication的浅显分析_第5张图片
SpringBoot的自动装配@SpringBootApplication的浅显分析_第6张图片

在springfactory文件中有一个对应的key 为org.springframework.boot.autoconfigure.EnableAutoConfiguration,后面的值有很多,截取一部分我们比较熟悉的。
SpringBoot的自动装配@SpringBootApplication的浅显分析_第7张图片

SpringBoot就是通过这种方式将我们需要的配置自动装配到IoC容器中。

二、自定义starter

1、所有正式的启动程序都遵循类似的命名模式;spring-boot-starter-,其中是一种特殊类型的应用程序。此命名结构用于在需要查找启动器时提供帮助。许多ide中的Maven集成允许您按名称搜索依赖项。例如,在安装了适当的Eclipse或STS插件后,您可以在POM编辑器中按ctrl空格键并键入“springbootstarter”以获得完整的列表。正如“创建您自己的启动器”一节中所解释的,第三方启动器不应该从springboot开始,因为它是为正式的springboot构件保留的。相反,第三方启动程序通常以项目名称开头。例如,名为thirdpartyproject的第三方starter项目通常被命名为thirdpartyproject -spring-boot-starter。
2、start的目录结构
SpringBoot的自动装配@SpringBootApplication的浅显分析_第8张图片

项目名字遵循:xxx-spring-boot-starter这种形式。
接口里面就一个方法

public interface HelloInterface {
     
    void hello();
}

public class HelloImpl implements HelloInterface{
     
    @Autowired
    private  HelloProperties helloProperties;

    public void hello() {
     
        System.out.println(helloProperties.getName()+" hello World");
    }
}
@Component
@ConfigurationProperties("spring.zzz")
public class HelloProperties {
     
    private String name = "zzz";

    public String getName() {
     
        return name;
    }

    public void setName(String name) {
     
        this.name = name;
    }
}
@Configuration
@ConditionalOnClass
@EnableConfigurationProperties(HelloProperties.class)
public class MyTestStartAutoConfiguration {
     

    @Bean
    @ConditionalOnMissingBean
    public HelloImpl getHello(){
     
        return new HelloImpl();
    }
}

SpringBoot的自动装配@SpringBootApplication的浅显分析_第9张图片

在pom文件中我们需要添加

SpringBoot的自动装配@SpringBootApplication的浅显分析_第10张图片

至此一个starter创建完成。
将该项目打成jar包。
SpringBoot的自动装配@SpringBootApplication的浅显分析_第11张图片

在这里插入图片描述

在另一个项目中引用。
SpringBoot的自动装配@SpringBootApplication的浅显分析_第12张图片

引入成功
SpringBoot的自动装配@SpringBootApplication的浅显分析_第13张图片

测试:
SpringBoot的自动装配@SpringBootApplication的浅显分析_第14张图片

启动项目
SpringBoot的自动装配@SpringBootApplication的浅显分析_第15张图片

该值为默认值,我们通过在application.properties修改name为zhangsan
SpringBoot的自动装配@SpringBootApplication的浅显分析_第16张图片
SpringBoot的自动装配@SpringBootApplication的浅显分析_第17张图片

由此就实现了通过在配置文件中修改值,就可以将start中的初始值改变,这也是为什么可以通过server.port可以配置服务器的端口,为什么可以通过配置集成jdbc、redis等。

三 、总结

对于Springboot的自动装配,通过@SpringBootApplication注解的分析,引出EnableAutoConfiguration注解,从而如何自定义一个starter。通过starter的这种方式,我们可以看到SpringBoot的这种可定制化可插拔式的好处,代码解耦方面体现淋漓尽致。

你可能感兴趣的:(springboot,spring,boot,java,分布式)