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 {

}复制代码

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

原文 

https://juejin.im/post/5e2007ae6fb9a02fe34bc066

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring 注解之@Import 注入的各种花活

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址