Spring注解@Import如何实现多样注入技巧详解?

2026-05-28 09:122阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计565个文字,预计阅读时间需要3分钟。

Spring注解@Import如何实现多样注入技巧详解?

今天分享一点pig4cloud中的@Import及其注入形式。通过不同形式的注入,最大程度实现架构简洁。

@Import导入一个组件,例如查看EnablePigxDynamicRoute这个注解,当我们需要开始动态数时。

今天来分享一下 pig4cloud 中涉及的 @Import 的注入形式。通过不同形式的注入方式,最大程度使得架构简洁。

@Import导入一个组件

来看 EnablePigxDynamicRoute 这个注解,当我们需要开始动态数据源时,只需要在main 方法加上此注解即可。

Spring注解@Import如何实现多样注入技巧详解?

@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 { }

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

标签:

本文共计565个文字,预计阅读时间需要3分钟。

Spring注解@Import如何实现多样注入技巧详解?

今天分享一点pig4cloud中的@Import及其注入形式。通过不同形式的注入,最大程度实现架构简洁。

@Import导入一个组件,例如查看EnablePigxDynamicRoute这个注解,当我们需要开始动态数时。

今天来分享一下 pig4cloud 中涉及的 @Import 的注入形式。通过不同形式的注入方式,最大程度使得架构简洁。

@Import导入一个组件

来看 EnablePigxDynamicRoute 这个注解,当我们需要开始动态数据源时,只需要在main 方法加上此注解即可。

Spring注解@Import如何实现多样注入技巧详解?

@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 { }

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

标签: