SpringBoot调整ApplicationContextAware如何实现类加载顺序

 更新时间:2023年05月26日 15:13:56   作者:windSnowLi  
SpringBoot调整ApplicationContextAware实现类加载顺序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringBoot调整ApplicationContextAware实现类加载顺序

自己需要在项目中使用redis-cache插件,但是官方放出来的包太老了,仓库代码更新倒是还可以,所以打算自己封装下,修改下加载配置文件的方式。

需求

有时候需要在普通类获取到Bean,但是new出来的对象不会被注入,这时就需要通过SpringBoot上下文去获取Bean,思路很简单,实现ApplicationContextAware后在类上加个@Componse注解就可以很容易的实现加载上下文

例如:

@Component
public class SpringUtils implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(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);
    }
}

思路很简单,但是有个坑,有时使用到getBean的地方可能applicationContext还没被注入,这时会报空指针错误,但是在测试中又能正确注入,很是恼火。

本机使用Ubuntu+IDEA开发,由maven进行构建,本地环境以及版本与目标环境一致,但是构建出来的包(md5)不一样,本地构建出来的包可以在本地以及目标环境运行,但是直接在目标环境构建的在哪都会报applicationContext空指针错误,可能某些潜在原因,导致编译结果不一致,不过既然本地可以正常运行,那么肯定有解决办法。

解决思路

通过调试发现使用getBean的地方比注入ApplicationContext要早,最终也会注入,所以解决思路就是让需要ApplicationContext的类优先加载。

解决办法两个

1.最简单,但最奇葩

Bean工具类示例

@Component
public class SpringUtils implements ApplicationContextAware {
	// 还是老样子
}

启动类添加注解注解@DependsOn(value = "SpringUtils")

注:默认方式扫包必须保证SpringUtils在使用getBean文件的前边,例如同一个包下SpringUtils文件排在了前遍

2.比较常规的

Bean工具类示例

@Component //实测这个没有都行
public class SpringUtils implements ApplicationContextAware {
	// 还是老样子
}

启动类添加注解注解@Import(SpringUtils.class),并强依赖使用

···
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Import;
···
···
@Import(SpringUtils.class)
public class LBlogApplication {
		@Autowired
		public void setRedisConfigurationBuilder(RedisConfigurationBuilder redisConfigurationBuilder) {
	    	// 为了优先加载
		}
		public static void main(String[] args) {
 	   		···
		}
}

ApplicationContextAware加载顺序遇到的问题

公司使用的是自主研发的框架,类似ibatis,封装可统一的list查询接口,自定义SpringBeanFactory实现ApplicationContextAware获取spring上下文对象。

问题

之前在mvc环境下使用一直没有问题,最近切换成springboot框架,系统启动时list接口类会调用SpringBeanFactory的getbean方法注入一个bean,发现SpringBeanFactory的set方法还没有调用,就是系统还没有扫描到SpringBeanFactory对象;

开始在list接口类上加@Lazy注解,调用到当前类时再初始化,可以解决当前问题,后期发现这个类还有静态变量,其他地方要用到,如果没有调到这个接口他的静态变量使用是否会有问题?静态代码块是否执行?(时间问题,没有测试)考虑到这些问题,决定不使用@Lazy注解,百度一下发现

@DependsOn(value = “springBeanFactory”)

可以解决这个问题。 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Eclipse中实现JS代码提示功能(图文教程)

    Eclipse中实现JS代码提示功能(图文教程)

    本文通过图文并茂的形式给大家介绍了Eclipse中实现JS代码提示功能,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-11-11
  • Spring Boot通过Junit实现单元测试过程解析

    Spring Boot通过Junit实现单元测试过程解析

    这篇文章主要介绍了Spring Boot通过Junit实现单元测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 编程语言榜单Java与Python并列第二!Julia下滑

    编程语言榜单Java与Python并列第二!Julia下滑

    日新月异的技术圈,随着云、大数据、人工智能等主流技术的广泛应用,作为开发利器的编程语言的最新发展趋势也在无形中发生了变化,本文主要介绍了java、Python、Julia等语言在Resmonk榜单的排名
    2021-08-08
  • spring-boot List转Page的方法步骤

    spring-boot List转Page的方法步骤

    这篇文章主要介绍了spring-boot List转Page的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Spring @EventListener 异步中使用condition的问题及处理

    Spring @EventListener 异步中使用condition的问题及处理

    这篇文章主要介绍了Spring @EventListener 异步中使用condition的问题及处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 使用BitSet位集合,一个重复校验工具

    使用BitSet位集合,一个重复校验工具

    这篇文章主要介绍了使用BitSet位集合,一个重复校验工具,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • maven scope provided和runtime的例子说明

    maven scope provided和runtime的例子说明

    这篇文章主要介绍了maven scope provided和runtime的例子说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • java模拟多线程http请求代码分享

    java模拟多线程http请求代码分享

    本篇文章给大家分享了java模拟多线程http请求的相关实例代码,对此有需要的可以跟着测试下。
    2018-05-05
  • @RequestBody的使用案例代码

    @RequestBody的使用案例代码

    @RequestBody主要用来接收前端传递给后端的json字符串中的数据的,这篇文章主要介绍了@RequestBody的使用,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • 解决idea check out 切换分支时找不到需要的分支问题

    解决idea check out 切换分支时找不到需要的分支问题

    这篇文章主要介绍了解决idea check out 切换分支时找不到需要的分支问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论