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

网友投稿 422 2022-11-25


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.CwVAWfomponent;

/**

* 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(Shttp://tring 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;

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Mybatis plus 配置多数据源的实现示例
下一篇:springboot+mybatis配置控制台打印sql日志的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~