美文网首页
Spring 注解之@Import 注入的各种花活

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

作者: 冷冷zz | 来源:发表于2020-01-16 14:51 被阅读0次

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

    相关文章

      网友评论

          本文标题:Spring 注解之@Import 注入的各种花活

          本文链接:https://www.haomeiwen.com/subject/nuvfzctx.html