盘点Spring/Boot的那些常用扩展点( 三 )


show me the code
这里我自定义一个类 , ation作为键 , 值就是User
1
2
class ation {
}
.文件
1
com....spi.ation=com....User
然后放在META-INF底下
测试:
class{
public static void main(String[] args) {List classNames = SpringFactoriesLoader.loadFactoryNames(MyEnableAutoConfiguration.class, MyEnableAutoConfiguration.class.getClassLoader());classNames.forEach(System.out::println);}
}
结果:
com....User
可以看出 , 通过r的确可以从.文件中拿到ation键对应的值 。
到这你可能说会 , 这SPI机制也没啥用啊 。的确 , 我这个例子比较简单 , 拿到就是遍历 , 但是在中 , 如果在加载类的话使用SPI机制 , 那我们就可以扩展 , 接着往下看 。
启动扩展点
项目在启动的过程中有很多扩展点 , 这里就来盘点一下几个常见的扩展点 。
1、自动装配
说到的扩展点 , 第一时间肯定想到的就是自动装配机制 , 面试贼喜欢问 , 但是其实就是一个很简单的东西 。当项目启动的时候 , 会去从所有的.文件中读取@ion键对应的值 , 拿到配置类 , 然后根据一些条件判断 , 决定哪些配置可以使用 , 哪些不能使用 。
.文件?键值?不错 , 自动装配说白了就是SPI机制的一种运用场景 。
@ion注解:
@(.class)
@ ion {
//忽略
}
我擦 , 这个注解也是使用@注解 , 而且配置类还实现了接口 , 跟前面也都对上了 。在中 , @ion是通过@n来使用的 。
在中还有这样一段代码
所以 , 这段代码也明显地可以看出 , 自动装配也是基于SPI机制实现的 。
那么我想实现自动装配怎么办呢?很简单 , 只需两步 。
第一步 , 写个配置类:
@
class n {
@Beanpublic UserFactoryBean userFactoryBean() {return new UserFactoryBean();}
}
这里我为了跟前面的知识有关联 , 配置了一个 。
第二步 , 往.文件配置一下
org..boot..ion=
com.....n
到这就已经实现了自动装配的扩展 。
接下来进行测试:
@n
class{
public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class);User user = applicationContext.getBean(User.class);System.out.println("获取到的Bean为" + user);}
}
运行结果:
调用的方法生成 Bean:com....User@
获取到的Bean为com....User@
从运行结果可以看出 , 自动装配起了作用 , 并且虽然往容器中注入的Bean的class类型为 , 但是最终会调用的的实现获取到User对象 。
自动装配机制是的一个很重要的扩展点 , 很多框架在整合的时候 , 也都通过自动装配来的 , 实现项目启动 , 框架就自动启动的 , 这里我举个整合 。
整合的.文件
2、
 , 这是干啥的呢?
我们都知道 , 在环境下 , 外部化的配置文件支持和yaml两种格式 。但是 , 现在不想使用和yaml格式的文件 , 想使用json格式的配置文件 , 怎么办?
当然是基于该小节讲的来实现的 。
{
//可以支持哪种文件格式的解析
[] ();
// 解析配置文件 , 读出内容 , 封装成一个结合返回回去 List