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

网友投稿 273 2022-12-16


详解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 http://GenericBeanDefinition();

beanDefinition.setBeanClass(PigxResourceServerConfigurerAdapter.class);

registry.registerBeanDefinition(SecurityConstants.RESOURCE_SERVER_CONFIGURER, beanDefinition);

}

}

这也就意味着,若使用 EnablePigxResourceServer 注解即可开启 pig4cloud 封装的oauth 资源客户端操作类,也是源码的入口

@Import({PigxSecurityBeanDefinitionRegistrar.class})

public @interface EnablePigxResourceServer {

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot Redis缓存数据实现解析
下一篇:Java枚举类接口实例原理解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~