多线程时Autowired自动注入问题

在多线程时使用@Autowired总是获取不到bean,原因是:new thread不在spring容器中,也就无法获得spring中的bean对象。

解决方法:手动获取

package com.test.configs;

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

@Component
public class BeanContext implements ApplicationContextAware {

	private static ApplicationContext applicationContext;

	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		BeanContext.applicationContext = applicationContext;
	}

	public static ApplicationContext getApplicationContext(){
		return applicationContext;
	}

	@SuppressWarnings("unchecked")
	public static <T> T getBean(String name) throws BeansException {
		return (T)applicationContext.getBean(name);
	}

	public static <T> T getBean(Class<T> clz) throws BeansException {
	    return (T)applicationContext.getBean(clz);
	}
}

  

创建thread

<code class="language-java">package com.test.handler;  

import com.test.configs.BeanContext;
import com.test.service.TestService;
import com.test.model.User;  

/**
 * created by huguoju on 2017/11/13.
 */
public class TestHandler implements Runnable {  

    private User user;
    private TestService testService;
    @Override
    public void run() {
        this.testService= BeanContext.getApplicationContext().getBean(TestService.class);
        User user=testService.queryUserById(11);
    }  

    public User getUser() {
        return user;
    }  

    public void setUser(User user) {
        this.user = user;
    }
}

  


在其他service里调用

ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("upFinancial-pool-%d").build();
            ExecutorService pool = new ThreadPoolExecutor(corePoolSize, maxPoolSize,
                    6000L, TimeUnit.MILLISECONDS,
                    new LinkedBlockingDeque<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
            UpFinancialContractHandler handler=new UpFinancialContractHandler();
            handler.setUser(user);
            pool.execute(handler);

  

原文地址:https://www.cnblogs.com/albertzhangyu/p/9648576.html

时间: 2024-11-13 10:36:24

多线程时Autowired自动注入问题的相关文章

Spring 注解Autowired自动注入bean异常解决

错误: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xx' is defined 错误的一般解决办法: 1.看xxbean是否已经注入,或者得到的bean名字错误. 2.看spring的配置文件<context:component-scan base-package="com.xx"></context:component-scan>是否扫描了 c

Action中如何通过@Autowired自动注入spring bean ?

1.讲Action纳入spring的IOC控制 <!-- 采用注解方式自动扫描装配 --> <context:component-scan base-package="com.wetalk.*" /> 2.引入jar包 struts2-spring-plugin-2.2.1.jar 3.在Action中使用@Autowired引入即可

@Autowired自动注入失败

新手注意的问题 package cn.ryq.web.controller; import cn.ryq.domain.company.Company;import cn.ryq.service.company.CompanyService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springf

关于springboot项目中自动注入,但是用的时候值为空的BUG

最近想做一些web项目来填充下业余时间,首先想到了使用springboot框架,毕竟方便 快捷 首先:去这里 http://start.spring.io/ 直接构建了一个springboot初始化的项目框架 然后:在页面上选择相应的依赖包,然后点击构建按钮,然后下载并且导入IDE中,目前喜欢使用IDEA 于是一个简答的springboot项目就搭建好了 废话说完,然后想体验下spring中redis的使用: 那就直接新建了一个类,然后 @Autowired 自动注入 RedisTemplate

使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法

使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法 idea中springboot整合mybatis时,通过@Autowired注入的对象一直有下划线提示,但是项目能运行,虽然不影响运行,但是强迫症的程序员肯定看不下去. 如何去除呢?解决:改变@Autowired的检查级别即可.快捷键:Ctrl+Alt+s,进入idea设置界面,输入inspections检索,如下: 原文地址:https://www.cnblogs.com

struts2与spring集成时,关于class属性及成员bean自动注入的问题

正常来说按照Spring官方配置,在struts2与spring整合时,struts配置文件中class属性指向spring配置的bean id,但是在class指向类路径时,依然能注入service. public class LoginAction extends ActionSupport{ private LoginService loginService; public void setLoginService(LoginService loginService) { System.o

@Autowired @Resource @Inject 自动注入

一.@AutoWired ( spring 的注解 )自动注入 /** * @Autowired: * 默认按照 Student 类型去容器中找对应的组件:applicationContext.getBean(Student.class); * 如果找到多个相同类型的组件,再将 student 这个属性名作为 id 去容器中找对应组件 applicationContext.getBean("student"); * required = false,容器中如果没有该组件,就为 null

Injection of autowired dependencies failed; autowire 自动注入失败,测试类已初始化过了Spring容器。

1 严重: StandardWrapper.Throwable 2 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'searchController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreatio

Spring自动注入有关的注解

Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. 1,@Component 构件 与 @Repostiry @Control @Service @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分是name和type