Springboot实现多线程注入bean的工具类操作

 更新时间:2020年08月26日 14:21:13   作者:buptmumu  
这篇文章主要介绍了Springboot实现多线程注入bean的工具类操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

场景: 使用springboot多线程,线程类无法自动注入需要的bean

解决方法: 通过工具类获取需要的bean

工具类代码:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @Description: 获取bean对象的工具类
 * @Author: Zhang Lin
 * @CreateDate: 2018/12/10
 */

@Component
public class ApplicationContextProvider implements ApplicationContextAware {
  /**
   * 上下文对象实例
   */
  private static ApplicationContext applicationContext;

  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
  }

  /**
   * 获取applicationContext
   *
   * @return
   */
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }

  /**
   * 通过name获取 Bean.
   *
   * @param name
   * @return
   */
  public static Object getBean(String name) {
    return getApplicationContext().getBean(name);
  }

  /**
   * 通过class获取Bean.
   *
   * @param clazz
   * @param <T>
   * @return
   */
  public static <T> T getBean(Class<T> clazz) {
    return getApplicationContext().getBean(clazz);
  }

  /**
   * 通过name,以及Clazz返回指定的Bean
   *
   * @param name
   * @param clazz
   * @param <T>
   * @return
   */
  public static <T> T getBean(String name, Class<T> clazz) {
    return getApplicationContext().getBean(name, clazz);
  }
}

使用方法:

在线程类的构造函数里调用工具类的getBeans方法获取实例,如:

public class ThreadA implements Runnable {
  private Service service;
  public ThreadA() {
    this.service = ApplicationContextProvider.getBean(Service.class);
  }

  @Override
  public void run() {
  //TO BE DONE
  }
}

补充知识:在springboot中普通的线程类访问service类

1、首先在线程类上注解@Component

2、@Autowired

private IStudentService studentService;

3、调用时候

studentService = SpringUtils.getBean("studentService");

4、SpringUtils

package com.ruoyi.common.utils.spring;
 
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
 
/**
 * spring工具类 方便在非spring管理环境中获取bean
 * 
 * @author ruoyi
 */
@Component
public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware
{
  /** Spring应用上下文环境 */
  private static ConfigurableListableBeanFactory beanFactory;
  private static ApplicationContext applicationContext = null;
 
  @Override
  public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
  {
    SpringUtils.beanFactory = beanFactory;
  }
 
  /**
   * 获取对象
   *
   * @param name
   * @return Object 一个以所给名字注册的bean的实例
   * @throws org.springframework.beans.BeansException
   *
   */
  @SuppressWarnings("unchecked")
  public static <T> T getBean(String name) throws BeansException
  {
    return (T) beanFactory.getBean(name);
  }
 
  /**
   * 获取类型为requiredType的对象
   *
   * @param clz
   * @return
   * @throws org.springframework.beans.BeansException
   *
   */
  public static <T> T getBean(Class<T> clz) throws BeansException
  {
    T result = (T) beanFactory.getBean(clz);
    return result;
  }
 
  /**
   * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
   *
   * @param name
   * @return boolean
   */
  public static boolean containsBean(String name)
  {
    return beanFactory.containsBean(name);
  }
 
  /**
   * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
   *
   * @param name
   * @return boolean
   * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
   *
   */
  public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
  {
    return beanFactory.isSingleton(name);
  }
 
  /**
   * @param name
   * @return Class 注册对象的类型
   * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
   *
   */
  public static Class<?> getType(String name) throws NoSuchBeanDefinitionException
  {
    return beanFactory.getType(name);
  }
 
  /**
   * 如果给定的bean名字在bean定义中有别名,则返回这些别名
   *
   * @param name
   * @return
   * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
   *
   */
  public static String[] getAliases(String name) throws NoSuchBeanDefinitionException
  {
    return beanFactory.getAliases(name);
  }
 
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    if(SpringUtils.applicationContext == null){
      SpringUtils.applicationContext = applicationContext;
    } 
  }
 
  //获取applicationContext
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  } 
}

以上这篇Springboot实现多线程注入bean的工具类操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • springBoot基于webSocket实现扫码登录

    springBoot基于webSocket实现扫码登录

    最近做了个新项目,涉及到扫码登录。之前项目使用的是 ajax轮询的方式。感觉太low了。所以这次用webSocket的方式进行实现,感兴趣的可以了解一下
    2021-06-06
  • java实现Excel的导入、导出

    java实现Excel的导入、导出

    这篇文章主要为大家详细介绍了java实现Excel的导入、导出的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java中一些关键字的使用技巧总结

    Java中一些关键字的使用技巧总结

    这篇文章主要介绍了Java中一些关键字的使用技巧总结,其中重点讲述了this和super两个关键字的用法,需要的朋友可以参考下
    2015-09-09
  • Java对zip,rar,7z文件带密码解压实例详解

    Java对zip,rar,7z文件带密码解压实例详解

    在日常业务中,会遇到一些琐碎文件需要打包到一个压缩包中上传,业务方在后台接收到压缩包后自行解压,然后解析相应文件。而且可能涉及安全保密,因此会在压缩时带上密码,要求后台业务可以指定密码进行解压。本文将用Java解决这一问题,需要的可以参考一下
    2022-07-07
  • 关于jpa中无法删除onetomany中many问题的解决

    关于jpa中无法删除onetomany中many问题的解决

    这篇文章主要介绍了关于jpa中无法删除onetomany中many问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringMVC @RequestMapping注解作用详解

    SpringMVC @RequestMapping注解作用详解

    通过@RequestMapping注解可以定义不同的处理器映射规则,下面这篇文章主要给大家介绍了关于SpringMVC中@RequestMapping注解用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 教你如何在Intellij IDEA中集成Gitlab

    教你如何在Intellij IDEA中集成Gitlab

    今天来简单说下,如何在IDEA中集成gitlab项目,默认情况下IDEA中的 VCS => Checkout From Version Control 选项中是没有gitlab这一项的,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧
    2023-10-10
  • SpringBoot整合RabbitMQ实现延迟队列和死信队列

    SpringBoot整合RabbitMQ实现延迟队列和死信队列

    RabbitMQ的死信队列用于接收其他队列中的“死信”消息,所谓“死信”,是指满足一定条件而无法被消费者正确处理的消息,死信队列通常与RabbitMQ的延迟队列一起使用,本文给大家介绍了SpringBoot整合RabbitMQ实现延迟队列和死信队列,需要的朋友可以参考下
    2024-06-06
  • maven项目无法读取到resource文件夹的问题

    maven项目无法读取到resource文件夹的问题

    这篇文章主要介绍了maven项目无法读取到resource文件夹的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java 多线程Thread与runnable的区别

    java 多线程Thread与runnable的区别

    这篇文章主要介绍了java 多线程Thread与runnable的区别的相关资料,java线程有两种方法继承thread类与实现runnable接口,下面就提供实例帮助大家理解,需要的朋友可以参考下
    2017-08-08

最新评论