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

applicationContext.getBean 为null

场景:

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

SpringUtils

public class SpringUtils implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic 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:

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

@PostConstructpublic 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.lryc.cn/news/232918.html

相关文章:

  • 无线WiFi安全渗透与攻防(六)之WEP破解-Gerix-wifi-cracker自动化破解WEP加密
  • 华为OD机试 - 环中最长子串(Java JS Python C)
  • bug-跨域访问问题
  • Babyk勒索病毒数据集恢复,计算机服务器中了babyk勒索病毒怎么办?
  • (.htaccess文件特性)[MRCTF2020]你传你呢 1
  • 微软Ignite 2023大盘点:GPT-4 Turbo、DALL-E 3等
  • 应用架构的演进 I 使用无服务器保证数据一致性
  • jupyter修改默认打开目录
  • HTML5学习系列之标题和正文、描述性信息
  • 互联网医院系统:数字化时代中医疗服务的未来
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • 蓝桥杯模拟赛:最远滑行距离 ← dfs
  • 广东电信手机号余额查询接口
  • 这次轮到微软炸场了;5000+AI工具调研报告 (500万字);狂打一星开喷AI聊天机器人;CMU LLM课程;AI创业的方向与时机 | ShowMeAI日报
  • --max-old-space-size=8192报错
  • 单区域OSPF配置
  • VsCode 安装 GitHub Copilot插件 (最新)
  • 人工智能基础_机器学习039_sigmoid函数_逻辑回归_逻辑斯蒂回归_分类神器_代码实现逻辑回归图---人工智能工作笔记0079
  • 购买阿里云服务器需要多少钱?活动价3000元-5000元的阿里云服务器汇总
  • CentOS修改root用户密码
  • Android消息机制(Handler、Looper、MessageQueue)
  • Pikachu漏洞练习平台之XXE(XML外部实体注入)
  • ubuntu中/etc/rc.local和/etc/init.d/rc.local的区别是什么
  • vue项目中 commonJS转es6
  • 【C++】AVL树(动图详解)
  • 「Verilog学习笔记」用3-8译码器实现全减器
  • rocketmq: MQClientException: No route info of this topic
  • 【Vue全家桶 合集 关注收藏】
  • react+video.js h5自定义视频暂停图标
  • CentOS和Ubuntu中防火墙相关命令