栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

今天来分享一下 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 {

}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/135450.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号