欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Spring 注解之@Import 注入的各种花活

程序员文章站 2022-08-06 21:18:41
今天来分享一下 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 {

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。