概述
之前学完ssm的时候,当时做了一个简单的小网站,非常开心,但是对于那些配置文件刚开始还是有些头疼。后来学习到springboot,就感觉太清爽了!!!去nmd配置文件,我们只需要在application.properties配置一些mybatis、数据源、端口、视图解析器等就可以了。开发一个小网站很快就完成了。
不知道大家第一次接触springboot是什么感觉,我第一感觉就是不用配置那么多配置文件了。但是真的不用配置了吗?为什么不需要我们配置了呢?大家想过这个问题吗?这里有一个叫做springboot自动装载机制
1、让我们来认识两个接口
public interface ImportSelector {
String[] selectImports(AnnotationMetadata var1);
}
这个接口对于自动装载有着至关重要的位置!!!
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
最后
以上就是端庄飞机为你收集整理的你知道springboot的自动装载机制吗?一篇文章让你豁然开朗!!!的全部内容,希望文章能够帮你解决你知道springboot的自动装载机制吗?一篇文章让你豁然开朗!!!所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复