详解Spring 注解之@Import 注入的各种花活
程序员文章站
2022-05-06 19:16:29
今天来分享一下 pig4cloud 中涉及的 @import 的注入形式。通过不同形式的注入方式,最大程度使得架构简洁。
@import导入一个组件
来看 enablepigx...
今天来分享一下 pig4cloud 中涉及的 @import 的注入形式。通过不同形式的注入方式,最大程度使得架构简洁。
@import导入一个组件
来看 enablepigxdynamicroute 这个注解,当我们需要开始动态数据源时,只需要在main 方法加上此注解即可。
@target({elementtype.type}) @retention(retentionpolicy.runtime) @documented @inherited @import(dynamicrouteautoconfiguration.class) public @interface enablepigxdynamicroute { }
实际核心是引入 dynamicrouteautoconfiguration 这个配置类,此类并未被spring 扫描管理
写个简单的例子
public class dog { } @import({dog.class}) @springbootapplication public class springlearnapplication { public static void main(string[] args) { configurableapplicationcontext context = springapplication.run(springlearnapplication.class, args); assert.istrue(context.containsbean("com.pig4cloud.spring.learn.demo1.dog"), "error dog bean"); } }
注意 dog 并未增加上文的声明式注解,注入了一个全类型名称的bean
importselector 接口
顾名思义导入的选择器,当 @import 引入的类是 importselector 接口的实现时,会按照此选择器进行匹配注入
public class dogimportselector implements importselector { @override public string[] selectimports(annotationmetadata importingclassmetadata) { ... 匹配逻辑查询出来一堆要注入的全类名 return new string[]{"com.pig4cloud.spring.learn.demo1.dog"}; } }
@import({dogimportselector.class}) @springbootapplication public class springlearnapplication { public static void main(string[] args) { configurableapplicationcontext context = springapplication.run(springlearnapplication.class, args); assert.istrue(context.containsbean("com.pig4cloud.spring.learn.demo1.dog"), "error dog bean"); } }
importbeandefinitionregistrar
当@import 引入的是 importbeandefinitionregistrar 接口实现类,会自动引入 registerbeandefinitions 定义的bean
以pig 的资源服务器配置设置,自动引入了一个 pigxresourceserverconfigureradapter 的类,且 bean 名称为 resourceserverconfigureradapter
public class pigxsecuritybeandefinitionregistrar implements importbeandefinitionregistrar { @override public void registerbeandefinitions(annotationmetadata metadata, beandefinitionregistry registry) { genericbeandefinition beandefinition = new genericbeandefinition(); beandefinition.setbeanclass(pigxresourceserverconfigureradapter.class); registry.registerbeandefinition(securityconstants.resource_server_configurer, beandefinition); } }
这也就意味着,若使用 enablepigxresourceserver 注解即可开启 pig4cloud 封装的oauth 资源客户端操作类,也是源码的入口
@import({pigxsecuritybeandefinitionregistrar.class}) public @interface enablepigxresourceserver { }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 怎么样,怕了吧