• applicationContext.getBean 为null


    场景:

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

    SpringUtils

    1. public class SpringUtils implements ApplicationContextAware {
    2. private static ApplicationContext applicationContext;
    3. @Override
    4. public void setApplicationContext(@Nonnull ApplicationContext applicationContext) throws BeansException {
    5. SpringUtils.applicationContext = applicationContext;
    6. }
    7. public static ApplicationContext getApplicationContext() {
    8. return applicationContext;
    9. }
    10. public static Object getBean(String name) {
    11. return applicationContext.getBean(name);
    12. }
    13. public static T getBean(Class clazz) {
    14. return applicationContext.getBean(clazz);
    15. }
    16. }

    实例化:

    1. @Configuration
    2. @AutoConfigureOrder(value = Ordered.LOWEST_PRECEDENCE)
    3. public class SpringAutoConfiguration {
    4. @Bean
    5. @ConditionalOnMissingBean(name = "springUtils")
    6. public SpringUtils springUtils() {
    7. return new SpringUtils();
    8. }
    9. }

    问题场景1:

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

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

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

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

    问题场景2:

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

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

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

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

    1. @Service
    2. public class IassAppConfiguration {
    3. public static IassService createService() {
    4. return SpringUtils.getBean(IassServiceImpl.class);
    5. }
    6. }

    总结:

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

  • 相关阅读:
    leetcode_2586 统计范围元音字符串
    【C语言】指针与动态内存
    Python+appium 自动化测试-Android 端环境配置
    Android 设计模式六大原则
    Java条件语句
    【WSN】无线传感器网络 X-Y 坐标到图形视图和位字符串前缀嵌入方法研究(Matlab代码实现)
    客快物流大数据项目(八十三):Kudu的优化
    简单理解推挽输出和开漏输出
    Leetcode周赛368补题(3 / 3)
    酷开科技丨酷开系统重塑家庭娱乐生态,开启家庭生活新体验
  • 原文地址:https://blog.csdn.net/qq_35461948/article/details/134454545