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 柠檬糖大人你尽然盗号 阅读(969) 评论(0) 编辑 收藏 举报