你知道springboot的自动装载机制吗?一篇文章让你豁然开朗!!!

14 篇文章 0 订阅
5 篇文章 0 订阅

之前学完ssm的时候,当时做了一个简单的小网站,非常开心,但是对于那些配置文件刚开始还是有些头疼。后来学习到springboot,就感觉太清爽了!!!去nmd配置文件,我们只需要在application.properties配置一些mybatis、数据源、端口、视图解析器等就可以了。开发一个小网站很快就完成了。

不知道大家第一次接触springboot是什么感觉,我第一感觉就是不用配置那么多配置文件了。但是真的不用配置了吗?为什么不需要我们配置了呢?大家想过这个问题吗?这里有一个叫做springboot自动装载机制

1、让我们来认识两个接口

public interface ImportSelector {
    String[] selectImports(AnnotationMetadata var1);
}

这个接口对于自动装载有着至关重要的位置!!!

ImportSelector接口是Spring导入外部配置的核心接口,在SpringBoot的自动化配置和@EnableXXX(功能性注解)中起到了决定性的作用。当在@Configuration标注的Class上使用@Import引入了一个ImportSelector实现类后,会把实现类中返回的Class名称都定义为bean。
 
public interface DeferredImportSelector extends ImportSelector {
 //...省略
}

DeferredImportSelector接口继承ImportSelector,他和ImportSelector的区别在于装载bean的时机上,DeferredImportSelector需要等所有的@Configuration都执行完毕后才会进行装载。

大家看完是不是一脸懵B?这说的是啥?人话?先带着这些个问题,我们来看一个demo。

2、自己写一个配置让springboot加载,不使用@Configuration注解

我们的目标是用配置类,注入一个IOC对象。

先看一个实体


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;

@AllArgsConstructor
@Data
public class User {
    private String username;
    private Integer age;
}

定义一个配置类


import org.springframework.context.annotation.Bean;


public class UserConfiguration {

    @Bean
    public User getUser() {
        return new User("张三",18);
    }
}

看着啊,划重点了!!!这里的配置类没有@Configuration注解吧,要是加上咱们还玩啥呀,对吧!!这里如果能够被springboot加载,那么就能够注入一个ioc对吧。这是我们最后验证是否成功的重要标志!!!

大佬要上线了!



import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class UserImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{UserConfiguration.class.getName()};
    }
}

看这个大佬的方法,new String[]{UserConfiguration.class.getName()。对应着我们上面配置类的名字。我们只需要把配置类的名字放到字符串数组里就可以自动加载了。当然我们还需要一个@Import注解来帮助我们与Springboot建立连接!!

package com.springcloud.demo;

import org.springframework.context.annotation.Import;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
@Import(UserImportSelector.class)
public @interface EnableUserBean {
}
package com.springcloud.demo;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

@EnableUserBean
public class TestApplication {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new
                AnnotationConfigApplicationContext(TestApplication.class);
        User user = applicationContext.getBean(User.class);
        System.out.println(user);
    }
}

我们只需要在启动的java程序的时候(可以是main方法)加上这个注解,我们的springboot就会去注解里找@Import(UserImportSelector.class),找到UserImportSelector,通过它找到我们的配置类,然后就可以加载配置类了。就是这么一个流程!!!

3、这个是怎么加载的呢?

我们在这打一个断点就能够看到取到了,他首先会递归的获取我们自定义导入的配置类的信息。

这里面包含了,你是哪个注解。注解在哪个类上的。

如果不是ImportSelector呢?

就当作@Configuration注解的配置类加载处理。

我们打断点来看:

首先这里的是ImportSelector

 之后是拿出来的configuration。

4、让我们一起分析springboot自动加载自己的配置文件

先瞅一眼启动类

点进去

再点!!

这个跟我们上面做的demo是不是一样的了?又是熟悉的味道,又是熟悉的你!!!

再点!!!!

进入AutoConfigurationImportSelector的类。然后往下滑。

woc,这是什么东西?熟悉吧,上面我们自定义的也有这个方法吧!!之后的加载是不是就和给大家截屏分析源代码那块串起来了?

但是现在是不是还有一个问题,就是怎么获得springboot自己配置的那些再jar里面的配置类?

重点看一下这个代码:

重点在于这个FACTORIES_RESOURCE_LOCATION。我们来看一下它的值

说白了就是在"META-INF/spring.factories"下面得到资源是不是?我们找到一个springboot的jar包看一下这里面的文件!!一定是要有这个注解(EnableAutoConfiguration)的!!这个需要注意!

我们可以看到这个文件里有配置的信息,key是我们的注解,value就是对应要加载的配置类。这样就找到了对应的配置类。

 

至此,springboot自动装载就整个打通了!!!

源码:git@gitee.com:Zesystem/springclouddemoerueka.git

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值