当前位置: 首页 > article >正文

applicationContext.getBean 为null

场景:

        使用SpringUtils 添加了统一类的调用。单元测试是正常的。

SpringUtils

public class SpringUtils implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

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

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }

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

}

实例化:

@Configuration
@AutoConfigureOrder(value = Ordered.LOWEST_PRECEDENCE)
public class SpringAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(name = "springUtils")
    public SpringUtils springUtils() {
        return new SpringUtils();
    }

}

问题场景1:

        在另外一个项目,引用SpringUtils,报错。applicationContext.getBean 这边为null了,设置调试。setApplicationContext也没有进来。

public void setApplicationContext(@Nonnull ApplicationContext applicationContext) throws BeansException {
        SpringUtils.applicationContext = applicationContext;
    }

检查了下启动类的@ComponentScan的包路径,也是没有问题的。 那会不会有个相似的实现类呢? idea双击Shift,输入 SpringUtil,真的有一个相似的,名字不一样。

        把前人写的那个类删了,把引用的地方进行了修改。再处理就正常了。

问题场景2:

        修改前人项目,把公共类做一个抽取,做单元测试的时候

@PostConstruct
    public void init() {
        SysConfig sysConfig = SpringUtils.getBean(SysconfigService.class).getSysConfig("CUST_SYNC_KEY_CONFIG");
        if (sysConfig != null && sysConfig.getSysVarValue() != null) {
			
        }
    }

这个也是报applicationContext.getBean为null。这边就更容易发现,因为@PostConstrut先初始化了,SpringUtils类都没有实例化。 这边就不适合使用SpringUtils了,把引用类,改@Resource注解进行引入。

项目使用一个统一的路口访问,这样要进行使用@ConditionalOnProperty不同类实现就比较方便,比如是postgre数据库的,sql语法不一样的,就可以直接进行配置,读取不同类。

@Service
public class IassAppConfiguration {

    public static IassService createService() {
        return SpringUtils.getBean(IassServiceImpl.class);
    }
}

总结:

        使用applicationContext进行初始化的话,要注意项目里面是有已经存在该实现类,其次注意初始化顺序,不能在项目初始的时候就进行调用。


http://www.kler.cn/a/132493.html

相关文章:

  • Stable Diffusion核心网络结构——CLIP Text Encoder
  • 【JavaEE初阶 — 多线程】定时器的应用及模拟实现
  • 【LeetCode 题】只出现一次的数字--其余数字都出现3次
  • 深度学习:计算卷积神经网络中输出特征图尺寸的关键公式
  • uniapp微信小程序转发跳转指定页面
  • sapiens推理的安装与使用
  • Python基础入门---conda 如何管理依赖包以及复制相同环境的
  • μC/OS-II---事件标志组管理1(os_flag.c)
  • Vue3 shallowRef 和 shallowReactive
  • WPF创建自定义控件编译通过但是找不到资源
  • Docker与Kubernetes结合的难题与技术解决方案
  • 2023.11.18 Hadoop之 YARN
  • 计算机毕业设计选题推荐-二手交易跳蚤市场微信小程序/安卓APP-项目实战
  • Python 的 @lru_cache() 装饰器
  • uniapp开发ios上线(在win环境下使用三方)
  • c#Nettonsoft.net库常用的方法json序列化反序列化
  • docker 部署mysql主从复制
  • ffmpeg和ffplay
  • Postgresql删除表或者序列时报SQL 错误 [2BP01]
  • 单元测试实战(五)普通类的测试
  • 合成事件在san.js中的应用
  • 单元测试实战(二)Service 的测试
  • Android Jetpack的组件介绍,常见组件解析
  • 力扣labuladong一刷day12拿下N数之和问题共4题
  • 一文搞懂设计模式之代理模式
  • AIGC创作系统ChatGPT源码,AI绘画源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图