详解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})
@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 {
}
上一篇:解决SpringBoot项目启动后网页显示Please sign in的问题
栏 目:JAVA代码
下一篇:详解Java 序列化与反序列化(Serialization)
本文标题:详解Spring 注解之@Import 注入的各种花活
本文地址:http://www.codeinn.net/misctech/176340.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




