kim.zhang

风在前,无惧!


  • 首页

  • 标签42

  • 分类12

  • 归档94

  • 搜索

加载第三方组件.md

发表于 2020-08-10 更新于 2021-11-21 分类于 SpringBoot
本文字数: 1.8k 阅读时长 ≈ 2 分钟

我们平常开发写的@Compone将类加入到IOC容器中,主要针对的是业务类。如果想把第三方的jar包中的类加入到IOC容器中,应该怎么操作呢?

在@SpringBootApplication注解中有一个@EnableAutoConfiguration。这是导入第三方jar包的关键

image-20200530234855275

在@EnableAutoConfiguration中,@import了一个select类。

image-20200530235049756

在这个select类中加载了一个.factories的文件。这个文件配置了所有要导入IOC容器的类。如果第三方想把类加入到IOC容器中,那么jar包提供者应该提供一个.factories的文件,里面包含了所有要导入IOC容器的类。

image-20200530235449350


如何自定义一个启动类来验证AutoConfiguration的机制?

1
2
3
4
5
6
7
8
9
10
11
12
//@ComponentScan
@Import(Config.class)
public class LOLApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context =
new SpringApplicationBuilder(LOLApplication.class)
.web(WebApplicationType.NONE)
.run(args);
Connect connect = (Connect) context.getBean("mysql");
connect.connect();
}
}

自定义的启动类如果加上@ComponentScan,会扫描与启动类同级目录和子目录下的bean,将其加入到IOC容器中。刚好这里Config配置类在扫描路径中,所以加上@ComponentScan可以启动服务器。

如果使用@Import来导入配置类,则会缺少很多@SpringBootApplication默认的配置。启动服务器会报错。第7行代码就是解决单独导入配置类引起的错误。

源码中@Import的是一个Select的类,我们也来实现一下。实现创建一个类实现ImportSelector接口。

方法的返回值是一个字符串数组,数组的元素就是需要导入的配置类的类名。这里可以使用class.getName()

1
2
3
4
5
6
public class LOLSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[] {Config.class.getName()};
}
}

接着启动类可以import我们编写好的Selector。但是源码中使用的是@EnabledAutoConfiguration,我们也来还原一下。

首先编写一个注解,导入Selector配置类。

1
2
3
4
5
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(LOLSelector.class)
public @interface EnabledAutoConfiguration {
}

接着在启动类就可以直接使用@EnabledAutoConfiguration了。

1
2
3
4
5
6
7
8
9
10
11
@EnabledAutoConfiguration
public class LOLApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context =
new SpringApplicationBuilder(LOLApplication.class)
.web(WebApplicationType.NONE)
.run(args);
Connect connect = (Connect) context.getBean("mysql");
connect.connect();
}
}
一毛也是爱~
Kim.Zhang 微信支付

微信支付

# 加载第三方组件
自动配置.md
ResponseBody.md
Kim.Zhang

Kim.Zhang

且行且珍惜
94 日志
12 分类
42 标签
E-Mail Weibo
粵ICP备19091267号 © 2019 – 2022 Kim.Zhang | 629k | 9:32
本站总访问量 4 次 | 有 309 人看我的博客啦 |
博客全站共176.7k字
载入天数...载入时分秒...
0%