如何在自定义的线程中获取注入到容器中的对象,并使用该对象操作数据
在自定义的线程中是无法最直接使用@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,不然启动就会报错,下面就可以愉快的操作数据库,各种方法了