栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Bean的动态装载

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Bean的动态装载

下面是我用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的动态装载总结
  1. 写自定义的importSelector类,实现importSelector接口,重写selectimports方法;selectimports方法返回是HelloimportSelectorConfiguration的类名
  2. 写HelloimportSelectorConfiguration类,这是一个@Configuration注解的配置类,同时要扫描我们要装载类的包,或者在内部用bean方法的方式
  3. 在要装载类上加上@Component注解(如果是用配置类中bean方法的方式注入对象,则这个步骤不用)
  4. 在启动类上添加@import注解
二、importBeanDefinitionRegistrar实现bean的动态装载 2.1 自定义类实现importBeanDefinitionRegistrar解口,重写registerBeanDefinitions方法,完成特定对象的装载
@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的动态装载总结
  1. 自定义@EnableHelloRegistrar 注解在@EnableHelloRegistrar注解上增加@import(HelloimportBeanDefinitionRegistrar.class)注解
  2. HelloimportBeanDefinitionRegistrar类实现importBeanDefinitionRegistrar接口,重写registerBeanDefinitions方法,在此方法中设置GenericBeanDefinition对象的BeanClassName和registerBeanDefinition属性
  3. 在启动类上加@EnableHelloRegistrar 注解
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/591327.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号