首页 > 其他分享 >SpringBoot中如何动态加载类到容器

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

时间:2023-03-30 18:22:38浏览次数:37  
标签:容器 类到 SpringBoot class String 场景 public 加载

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

场景:

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中那些类需要启动就交个容器管理。

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

 

 

     关注二维码,一起交流

标签:容器,类到,SpringBoot,class,String,场景,public,加载
From: https://www.cnblogs.com/huxuhong/p/17273936.html

相关文章

  • SpringBoot2.7集成Swagger3
    1、引入pom坐标<!--swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>3.0.0</version></dependency><dependency><groupId&......
  • springboot注册Servlet、Filter、Listener的方式
    方式一:注解@WebServlet@WebFilter@WebListener在实现类上使用该注解即可一键注册方式二:配置类在@Configuration标识的配置类中通过RegistrationBean进行注册@Beanp......
  • SpringBoot 项目使用 Sa-Token 完成登录认证
    一、设计思路对于一些登录之后才能访问的接口(例如:查询我的账号资料),我们通常的做法是增加一层接口校验:如果校验通过,则:正常返回数据。如果校验未通过,则:抛出异常,告知其需......
  • SpringBoot中集成Redis实现对redis中数据的解析和存储
    场景SpringBoot中操作springredis的工具类:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108335645上面讲的操作redis的工具类,但是对于redis的集成并没......
  • 移动端实现页面滚动到下面,自动加载更多
    css代码.box{width:500px;height:500px;overflow-y:auto;}html<divclass="box"ref="box"><!--列表内容放在这里--><!--列表内容如果......
  • 关于:找不到.dll文件||已加载但找不到入口点的解决方法
    程序运行报错:  1,首先不是简简单单的重新下载缺失文件然后添加到对应的window64文件夹里就可以了!也不是重新注册对应的dll文件!2,缺失的这些文件是VC++的版本运行库文......
  • SpringBoot——更换Tomcat服务器为 Jetty 服务器
    Jetty服务器(可能会用到)Jetty比Tomcat更轻量级,可拓展性更强(相较于Tomcat),谷歌应用引擎(GAE)已经全面切换为Jetty首先要启动Jetty服务器 --> 到nexus.exe文件夹中cmd输......
  • springboot获取小程序二维码图片
    获取小程序二维码前需要获取小程序的token。这个不赘述了。获取小程序二维码官方文档上找到2个处理的Api接口。经测试,现有一个能用的 https://api.weixin.qq.com/wxa/ge......
  • vue 实现下拉滑动触底加载
    实现下拉滑动触底加载可以分为以下几个步骤:监听滚动事件,判断是否到达底部。到达底部后,发起数据请求,获取数据。将获取到的数据添加到页面上。下面是一个基于Vue......
  • spring-boot-devtools 热部署造成的类加载问题
    如果你的项目在IDE中出现了像下面这些奇怪的错误objectisnotaninstanceofdeclaringclass//对象不是声明类的实例java.lang.ClassCastException:com.exam......