下面是我用spi实现的restTemplate对象的自动装载,与本文介绍的两种有所不同,感兴趣的可以看一下:
web-starter: web-starterhttps://gitee.com/qianwx/web-starter.git
Bean的动态装载有两种方式:
- importSelector
- importBeanDefinitionRegistrar
下面我们用两种方式来实现Bean的动态状态。
一、importSelector实现bean的动态装载 1.1 自定义类实现importSelector接口,重写selectimports接口,通知spring需要加载的配置类,完成bean的自动装载
public class HelloimportSelector implements importSelector {
@Override
public String[] selectimports(Annotationmetadata importingClassmetadata) {
System.out.println("HelloimportSelector ============== selectimports");
return new String[] { HelloimportSelectorConfiguration.class.getName() };
}
}
@ComponentScan("com.qwx.beanAutoload1.demo")
@Configuration
public class HelloimportSelectorConfiguration {
}
@Component
public class HelloService {
}
1.2 启动类上不加任何注解,HelloService未装载,获取对象时报错:
1.3 启动类上加注解@import(HelloimportSelector.class):
成功获取到helloService对象。
1.4 importSelector实现bean的动态装载总结- 写自定义的importSelector类,实现importSelector接口,重写selectimports方法;selectimports方法返回是HelloimportSelectorConfiguration的类名
- 写HelloimportSelectorConfiguration类,这是一个@Configuration注解的配置类,同时要扫描我们要装载类的包,或者在内部用bean方法的方式
- 在要装载类上加上@Component注解(如果是用配置类中bean方法的方式注入对象,则这个步骤不用)
- 在启动类上添加@import注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@documented
@import(HelloimportBeanDefinitionRegistrar.class)
public @interface EnableHelloRegistrar {
}
public class HelloimportBeanDefinitionRegistrar implements importBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(Annotationmetadata importingClassmetadata, BeanDefinitionRegistry registry) {
BeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClassName(HelloService.class.getName());
registry.registerBeanDefinition("helloService", beanDefinition);
}
}
@Component
public class HelloService {
}
2.2 启动类上加注解
2.3 importBeanDefinitionRegistrar实现bean的动态装载总结
- 自定义@EnableHelloRegistrar 注解在@EnableHelloRegistrar注解上增加@import(HelloimportBeanDefinitionRegistrar.class)注解
- HelloimportBeanDefinitionRegistrar类实现importBeanDefinitionRegistrar接口,重写registerBeanDefinitions方法,在此方法中设置GenericBeanDefinition对象的BeanClassName和registerBeanDefinition属性
- 在启动类上加@EnableHelloRegistrar 注解



