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的工具类操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java中&和&&的基本区别与常见的误用

    java中&和&&的基本区别与常见的误用

    & 和&&是Java中用于逻辑运算的两个运算符,&是按位与和逻辑与兼用的运算符,而&&仅用于逻辑与运算,并具有短路特性,这篇文章主要介绍了java中&和&&的基本区别与常见的误用,需要的朋友可以参考下
    2025-02-02
  • Spring Boot使用过滤器Filter过程解析

    Spring Boot使用过滤器Filter过程解析

    这篇文章主要介绍了Spring Boot使用过滤器Filter过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 使用Lombok时@JsonIgnore注解失效解决方案

    使用Lombok时@JsonIgnore注解失效解决方案

    这篇文章主要为大家介绍了使用Lombok时@JsonIgnore注解失效问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java面试题之HashMap 的 hash 方法原理是什么

    Java面试题之HashMap 的 hash 方法原理是什么

    那天,小二去蔚来面试,面试官老王一上来就问他:HashMap 的 hash 方法的原理是什么?当时就把裸面的小二给蚌埠住了,这篇文章将详细解答该题目
    2021-11-11
  • Druid连接池未关闭导致内存泄漏问题

    Druid连接池未关闭导致内存泄漏问题

    这篇文章主要介绍了Druid连接池未关闭导致内存泄漏问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • java优先队列PriorityQueue中Comparator的用法详解

    java优先队列PriorityQueue中Comparator的用法详解

    这篇文章主要介绍了java优先队列PriorityQueue中Comparator的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 浅谈Storm在zookeeper上的目录结构

    浅谈Storm在zookeeper上的目录结构

    这篇文章主要介绍了浅谈Storm在zookeeper上的目录结构的相关内容,涉及storm使用zookeeper的操作以及详细结构图,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java零基础精通方法篇

    Java零基础精通方法篇

    方法,也称函数,如果想要重复一段或者多段代码块的使用,可以将这些代码封装成一个方法,方法具体表现为某种行为,使用方法可以提高代码的复用性
    2022-05-05
  • Java实现简单的RPC框架的示例代码

    Java实现简单的RPC框架的示例代码

    本篇文章主要介绍了Java实现简单的RPC框架的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • SpringBoot:JPA + AuditingEntityListener时区设置方式

    SpringBoot:JPA + AuditingEntityListener时区设置方式

    这篇文章主要介绍了SpringBoot:JPA + AuditingEntityListener时区设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论