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

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

@Import导入一个组件

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

1@Target({ElementType.TYPE}) 2@Retention(RetentionPolicy.RUNTIME) 3@Documented 4@Inherited 5@Import(DynamicRouteAutoConfiguration.class) 6public @interface EnablePigxDynamicRoute { 7}

实际核心是引入 DynamicRouteAutoConfiguration 这个配置类,此类并未被Spring 扫描管理

写个简单的例子

1public class Dog { 2} 3 4@Import({Dog.class}) 5@SpringBootApplication 6public class SpringLearnApplication { 7 8 public static void main(String[] args) { 9 ConfigurableApplicationContext context = SpringApplication.run(SpringLearnApplication.class, args); 10 Assert.isTrue(context.containsBean("com.pig4cloud.spring.learn.demo1.Dog"), "error dog bean"); 11 } 12}

注意 Dog 并未增加上文的声明式注解,注入了一个全类型名称的Bean

ImportSelector 接口

顾名思义导入的选择器,当 @Import 引入的类是ImportSelector接口的实现时,会按照此选择器进行匹配注入

1public class DogImportSelector implements ImportSelector { 2 @Override 3 public String[] selectImports(AnnotationMetadata importingClassMetadata) { 4 ... 匹配逻辑查询出来一堆要注入的全类名 5 return new String[]{"com.pig4cloud.spring.learn.demo1.Dog"}; 6 } 7} 8 9 10 11@Import({DogImportSelector.class}) 12@SpringBootApplication 13public class SpringLearnApplication { 14 15 public static void main(String[] args) { 16 ConfigurableApplicationContext context = SpringApplication.run(SpringLearnApplication.class, args); 17 Assert.isTrue(context.containsBean("com.pig4cloud.spring.learn.demo1.Dog"), "error dog bean"); 18 } 19}

ImportBeanDefinitionRegistrar

@Import 引入的是ImportBeanDefinitionRegistrar接口实现类,会自动引入registerBeanDefinitions 定义的Bean

以pig 的资源服务器配置设置,自动引入了一个 PigxResourceServerConfigurerAdapter的类,且bean 名称为resourceServerConfigurerAdapter

1public class PigxSecurityBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { 2 3 @Override 4 public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { 5 GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); 6 beanDefinition.setBeanClass(PigxResourceServerConfigurerAdapter.class); 7 registry.registerBeanDefinition(SecurityConstants.RESOURCE_SERVER_CONFIGURER, beanDefinition); 8 9 } 10}

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

1@Import({PigxSecurityBeanDefinitionRegistrar.class}) 2public @interface EnablePigxResourceServer { 3 4}

> 项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注

点赞
收藏

评论区

加载中...

相关推荐

Spring Boot快速入门(三):依赖注入

springboot使用依赖注入的方式很简单,只需要给添加相应的注解即可@Service用于标注业务层组件 @Controller用于标注控制层组件@Repository用于标注数据访问组件,即DAO组件 @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。然后在使用的地方使用@A

Spring全解系列

本文基于Spring5.2.x@Import注解@Import是Spring基于Java注解配置的主要组成部分。@Import注解提供了@Bean注解的功能,同时还有原来Spring基于xml配置文件里的<import标签组织多个分散的xml文件的功能,当然在这里是组织多个分散的

Spring的@Import 注解的作用与用法

@Import注解@Import(https://my.oschina.net/u/3201731)是Spring基于Java注解配置的主要组成部分。@Import(https://my.oschina.net/u/3201731)注解提供了@Bean(https://my.oschina.net/bean

Spring注解详解

概述  注解的优势主配置简单只需要添加标签,JAVA的反射机制就可以根据标签自动注入自动初始化。@Autowired  配置方式:属性、setter方法或构造器都可以    不推荐使用,建议使用@Resource(http://my.oschina.net/u/929718),因为要使这个注解生效还需要在Spring配置文件中配

SpringBoot2.0笔记四

当搞全局捕获异常时可以使用到AOP技术,采用异常通知,也可以用AOP搞日志记录在类上面加上@EnableAsyns注解开启异步调用@Asyns,在方法上加上此注解,可以实现异步调用,底层是多线程技术,相当于加上这个注解的方法重新开启了一个单独的线程正常情况下,当A方法调用B方法时,是需要B方法执行完成,有返回结果时等待返回。这是顺序的方式从上到下

Spring常用的三种注入方式

Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入。构造方法注入先简单看一下测试项目的结构,用maven构建的,四个包:entity:存储实体,里面只有一个User类dao:数据访问,一个接口,两个实现类service:服务层,一个接口,一个