@import注解_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})@SpringBootApplicationpublic 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})@SpringBootApplicationpublic 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 {}

ecbd8d71a9ea5ae3a40051362f3c496b.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值