今天来分享一下 pig4cloud
中涉及的 @Import
的注入形式。经过不一样形式的注入方式,最大程度使得架构简洁。spring
来看 EnablePigxDynamicRoute
这个注解,当咱们须要开始动态数据源时,只须要在main 方法加上此注解便可。segmentfault
@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 并未增长上文的声明式注解,注入了一个全类型名称的Beanide
顾名思义导入的选择器,当 @Import 引入的类是ImportSelector
接口的实现时,会按照此选择器进行匹配注入spa
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"); } }
当@Import 引入的是ImportBeanDefinitionRegistrar
接口实现类,会自动引入registerBeanDefinitions
定义的Beancode
以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 { }