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

 更新时间:2020年01月16日 15:47:00   作者:冷冷gg  
这篇文章主要介绍了详解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 {

}

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

相关文章

  • 使用maven对springboot项目进行瘦身分离jar的多种处理方案

    使用maven对springboot项目进行瘦身分离jar的多种处理方案

    springboot项目打包一般我们都使用它自带的spring-boot-maven-plugin插件,这个插件默认情况下,会把所有的依赖包全部压缩到一个jar里面,今天给大家分享几种方案来如何减小我们的打包文件,需要的朋友可以参考下
    2024-02-02
  • java的jps命令使用详解

    java的jps命令使用详解

    这篇文章介绍了java的jps命令使用详解,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Spring Security权限管理小结

    Spring Security权限管理小结

    SpringSecurity是一个权限管理框架,核心是认证和授权,前面已经系统的给大家介绍过了认证的实现和源码分析,本文重点来介绍下权限管理,需要的朋友可以参考下
    2022-08-08
  • Spring Boot 如何通过ServletRequestHandledEvent事件实现接口请求的性能监控

    Spring Boot 如何通过ServletRequestHandledEvent事件实现接口请求的性能监控

    在Spring框架中,监控接口请求的性能可以通过ServletRequestHandledEvent事件实现,这篇文章给大家介绍Spring Boot 如何通过ServletRequestHandledEvent事件实现接口请求的性能监控,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • 简单了解JAVA SimpleDateFormat yyyy和YYYY的区别

    简单了解JAVA SimpleDateFormat yyyy和YYYY的区别

    这篇文章主要介绍了简单了解JAVA SimpleDateFormat yyyy和YYYY的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java 对象实例化过程中的多态特性解析

    java 对象实例化过程中的多态特性解析

    这篇文章主要介绍了java 对象实例化过程中的多态特性解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot中使用com.alibaba.druid.filter.config.ConfigTools对数据库密码加密的方法

    SpringBoot中使用com.alibaba.druid.filter.config.ConfigTools对数据库

    这篇文章主要介绍了SpringBoot中使用com.alibaba.druid.filter.config.ConfigTools对数据库密码加密的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Spring Security登陆流程讲解

    Spring Security登陆流程讲解

    本文主要介绍了Spring Security登陆流程讲解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 使用Java 实现一个“你画手机猜”的小游戏

    使用Java 实现一个“你画手机猜”的小游戏

    这篇文章主要介绍了使用Java 实现一个“你画手机猜”的小游戏,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 详谈Jedis连接池的使用

    详谈Jedis连接池的使用

    下面小编就为大家带来一篇详谈Jedis连接池的使用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论