java多线程访问beans对象_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

* @return

*/

public static T getBean(Class clazz) {

return getApplicationContext().getBean(clazz);

}

/**

* 通过name,以及Clazz返回指定的Bean

*

* @param name

* @param clazz

* @param

* @return

*/

public static T getBean(String name, Class 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 getBean(String name) throws BeansException

{

return (T) beanFactory.getBean(name);

}

/**

* 获取类型为requiredType的对象

*

* @param clz

* @return

* @throws org.springframework.beans.BeansException

*

*/

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值