springboot自动装配原理初探

自动装配

原理初探

pom.xml

  • spring-boot-dependencies   核心依赖在父工程中 
  • 我们在引入springboot依赖时 不需要版本号 是因为有这些版本仓库的支持

启动器

 

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

         启动器 :就是springboot所需场景的启动器

         例如: spring-boot-starter-web  配置这个启动器他就会加载web相关的一些组件和服务 比如tomcat

        springboo会将所有的功能场景变成一个个启动器

        如果我们需要使用某些功能 我们只需要找到对应的启动器 引入pom.xml 即可

主程序

 

//@SpringBootApplication 标注这个类是一个springboot的应用
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        //此方法将springboot应用启动
        SpringApplication.run(Application.class, args);
    }

}
  • 注解  

@ComponentScan注解作用
        @ComponentScan用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里。会被自动装配的注解包括@Controller、@Service、@Component、@Repository等等。其作用等同于<context:component-scan base-          package="com.maple.learn" />配置

    

@SpringBootConfiguration:springboot的配置文件

        @Configuration:spring 配置类
             @Component:说明这也是spring的一个组件


@EnableAutoConfiguration:自动配置
    @AutoConfigurationPackage:自动配置包
         @Import({AutoConfigurationPackages.Registrar.class}):自动配置"包注册"
    @Import({AutoConfigurationImportSelector.class}):自动配置导入选择

 //获取所有的配置
 List<String>configurations=this.getCandidateConfigurations(annotationMetadata,attributes);

获取候选的配置

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
 List<String> configurations = 
  SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), 
   this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

 META-INF/spring.factories:自动配置的核心文件

 Properties properties = PropertiesLoaderUtils.loadProperties(resource);
 所有的资源加载到配置类中

 

结论

springboot所有的自动装配都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面但是不一定生效,要判断条件是否成立,只要导入了对应的start启动器,自动装配就会生效然后就会配置成功了

springboot自动装配分为2部分 一部分自动装配是当前主启动类下所在包及包下类中所需由@AutoConfigurationPackage所导入 另一部分系统配置所需要的由@Import(AutoConfigurationImportSelector.class)所导入

  1. springboot在启动的时候 从类路径下:/META-INF/spring.facatories 获取指定的值;
  2. 将这些自动配置的类导入容器,自动配置类就会生效帮我们进行自动配置
  3. 以前我们需要自动配置的东西,现在springboot帮我们做了
  4. 整个javaEE,解决方案和自动配置的的东西都在spring-boot-autoconfigure-2.3.5.RELEASE.jar这个包下
  5. 他会将所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器中
  6. 容器中也会存在非常多的XXXAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件并自动配置,@Configuration,javaConfig
  7. 有了自动配置类就免去了我们手动编写配置文件的工作了 
 
 

通过对配置文件的分析 发现配置文件和自动配置之间的关系

/表示这是一个配置类
@Configuration(proxyBeanMethods = false)
//自动配置属性 ServerProperties
@EnableConfigurationProperties(ServerProperties.class)
//spring的底层注解:根据不同的条件来判断当前配置或者类是否生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)

通过注解

@ConfigurationProperties(prefix = "") 绑定配置文件和java类 在通过源码展示发现 

1、SpringBoot启动会加载大量的自动配置类

2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;

3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)

4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;

 xxxxAutoConfigurartion:自动配置类;给容器中添加组件

 xxxxProperties:封装配置文件中相关属性;

 xxxxAutoConfigurartion:自动配置类===》注入所需要的类格式为 xxxxProperties==》封装相关的属性(默认属性)=====》applicatio.yaml可以修改默认属性来增加程序的灵活性

 

在springboot中,有非常多的XXXConfiguration帮我们进行扩展配置只要看见了这个东西我么就要注意了

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值