zoukankan      html  css  js  c++  java
  • SpringBoot手动获取Bean

    SpringBoot手动获取Bean

    此事起因是用多线程编写定时任务,任务结束后有存储数据库的操作。我在线程的实现类里自动注入dao类,结果执行save操作报注入类实例空指针异常。

    Exception in thread "bd213f61a79f4436bf8f0bcd668a8e07" java.lang.NullPointerException: Cannot invoke "com.lhx.upgrade.repositories.UpgradeRecordRepository.save(Object)" because "this.recordRepository" is null

    看来Spring是不会给线程自动注入。

    找到一种手工从bean工厂获取依赖的办法:

    @Component
    public class BeanFactory implements ApplicationContextAware {
        private static ApplicationContext applicationContext = null;
    
        @Override
        public void setApplicationContext(ApplicationContext arg0) throws BeansException {
            // TODO Auto-generated method stub
            BeanFactory.applicationContext = arg0;
        }
        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }
    
        public static <T> T getBean(Class<T> clazz) {
            return getApplicationContext().getBean(clazz);
        }
    }
    

    在线程的run函数里添加下面代码即可

    UpgradeRecordRepository recordRepository = BeanFactory.getBean(UpgradeRecordRepository.class);
    recordRepository.save(record);
    
    敌人总是会在你最不想它出现的地方出现!
  • 相关阅读:
    Swift的闭包(一):闭包简介、闭包表达式的优化
    iOS 用户体验之音频
    【iOS】Core Bluetooth
    【iOS】3D Touch
    golang中channel的超时处理
    Objective-C 中的 BOOL
    2015年总结
    load vs. initialize
    正则表达式
    When does layoutSubviews get called?
  • 原文地址:https://www.cnblogs.com/longhx/p/15741114.html
Copyright © 2011-2022 走看看