如何在自定义的线程中获取注入到容器中的对象,并使用该对象操作数据

在自定义的线程中是无法最直接使用@Autowired创建对象的,因为我们使用的线程是new对象的方式创建的·,所以和spring容器半毛钱关系都没有

这里需要小伙伴手动创建

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

/**
 * @Author Yourheart
 * @Date 2022/12/6 16:12
 */
@Component
public class SpringBeanUtil  implements ApplicationContextAware {

    private static  ApplicationContext applicationContext;

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

    public static ApplicationContext getContext(){
        return applicationContext;
    }

    public static Object getBeanByName(String beanName){
        if (applicationContext==null){
            return null;
        }
        return applicationContext.getBean(beanName);
    }

    public static <T> T getBean(Class<T> type){
        return applicationContext.getBean(type);
    }
}

  然后呢获取对象

import com.alibaba.fastjson.JSONObject;
import com.java.mapper.TestMapper;
import com.java.util.SpringBeanUtil;
import com.java.util.Utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author Yourheart
 * @Date 2022/12/6 15:46
 */
@Slf4j
@Component
@Lazy
public class TestDemo  implements Runnable{

    private TestMapper testMapper=SpringBeanUtil.getBean(TestMapper.class);


    @Override
    public void run() {
        for (int k=0;k<200;k++){
            log.error("k:{}",k);
            testMapper.dataTest();
        }

    }

}

  这里使用@Lazy,不然启动就会报错,下面就可以愉快的操作数据库,各种方法了

 

posted @ 2022-12-06 20:54  不忘初心2021  阅读(38)  评论(0编辑  收藏  举报