今天来分享一下 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权限管理系统 欢迎关注