SpringBoot中如何动态加载类到容器

任何业务脱离场景无任何实际意义。

场景:

1,实现了多种存储方式,redis和本地内存或者其它,但是你希望根据注解配置只加载一种类到容器。

2,经典场景:mybatis将接口的代理类动态加载到容器。

分类:

静态加载:

1,springboot中会扫描同包路径下的(@configuration @Service @Component)标记了上述注解,自动加入容器

2,@Import直接导入某个类

动态加载:

分为2种,一种Bean的初始化比较简单(比如:场景1),另外一个中Bean的构建比较复杂(比如:场景2需要根据XML和接口动态生成一个具体实现类)。

场景1:可以直接实现ImportSelector接口,根据一下判断条件,将需要加载的类,动态返回即可,容器会自动加载

@ImportSelectorThresholdAnnotation(value = "ttttttt")
public class CloudClassAdminApplication {

public static void main(String[] args) {
//设置默认时区
// TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("GMT+8")));
SpringApplication.run(CloudClassAdminApplication.class, args);
log.info("运营端启动成功");
}
}

 

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(ImportSelectorThreshold.class)
public @interface ImportSelectorThresholdAnnotation {
String[] value() default {};
}

 

public class ImportSelectorThreshold implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//根据importingClassMetadata创建的逻辑业务条件,动态过滤要加载的类
//String[] :中要加载到容器中具体类(全路径名)
return new String[0];
}
}

 

场景2:可以实现ImportBeanDefinitionRegistrar接口,手动加载某些类到容器中

@Import(value = {ImportCustomBeanDefinitionRegistrar.class})
public class CloudClassAdminApplication {

public static void main(String[] args) {
//设置默认时区
// TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("GMT+8")));
SpringApplication.run(CloudClassAdminApplication.class, args);
log.info("运营端启动成功");
}
}

 

public class ImportCustomBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//这里可以进行复杂的Bean初始化,如依赖各种外部条件,组装Bean
String simpleName = B.class.getName();
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
rootBeanDefinition.setBeanClass(B.class);
registry.registerBeanDefinition(simpleName, rootBeanDefinition);

}
}

 

动态加载类到容器,实际业务中基本上不会出现,常规场景中:如你的业务中有自定义JAR包,那么上述业务就很有存在的意义啦。你需要指定自定义的jar中那些类需要启动就交个容器管理。

个人不喜欢技术性文章中出现大量代码。介绍应用场景为主,具体使用为辅。

 

 

     关注二维码,一起交流

posted on 2023-03-30 18:14  柠檬糖大人你尽然盗号  阅读(829)  评论(0编辑  收藏  举报

导航