首页 > 其他分享 >[转]SpringBoot项目@Configuration类中使用@Autowired自动注入为null

[转]SpringBoot项目@Configuration类中使用@Autowired自动注入为null

时间:2022-10-17 09:13:23浏览次数:77  
标签:Configuration SpringBoot Autowired shiroService shiroFilter null ShiroFilterFact

原文地址:SpringBoot项目@Configuration类中使用@Autowired自动注入为null _ 潘子夜个人博客 (panziye.com)

最近潘老师在搭建SpringBoot项目整合Shiro框架时,在@Configuration注解的类中使用@Autowired@Resource等注解自动注入service对象时,在启动后无法获取注入的对象值,始终为null,经过一番查找终于找到了解决方案。

一、先看问题代码

1)service层代码

复制代码
  1. @Service
  2. public class ShiroServiceImpl implements ShiroService {
  3. @Override
  4. public Map<String, String> loadFilterChainDefinitions() {
  5. // 省略....
  6. }
  7. }

2)@Configuration类部分代码

复制代码
  1. @Configuration
  2. public class ShiroConfig {
  3. @Autowired
  4. private ShiroService shiroService;
  5.  
  6. @Bean("shiroFilter")
  7. public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
  8. ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
  9. // 省略部分代码....
  10. // shiroService调用会报空指针异常
  11. Map<String, String> filterChainDefinitionMap = shiroService.loadFilterChainDefinitions();
  12. shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
  13. return shiroFilter;
  14. }
  15. }

潘老师测试发现@Autowired进来的shiroService始终为null,导致调用方法报空指针异常,说明@Autowired注入失败了。

二、注入失败的原因

首先我们分析下注入失败的原因,在经过测试,潘老师发现,主要原因就在于@Configuration注解的类会优先于其他@Component@Service注解的类创建,也就是说,当@Configuration类创建时需要自动注入shiroService时,其实此时被@Service修饰的ShiroService还没有被创建呢,所以自动注入的就是null,导致注入失败。

三、解决办法

解决方法很简单,就是不要使用自动注入,直接将你需要的依赖的对象以参数的方式放在@Bean修饰的方法中即可,因此@Configuration类部分代码修改如下:

复制代码
  1. @Configuration
  2. public class ShiroConfig {
  3. @Bean("shiroFilter")
  4. public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager, ShiroService shiroService) {
  5. ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
  6. // 省略部分代码....
  7. // debug调试发现shiroService正常调用
  8. Map<String, String> filterChainDefinitionMap = shiroService.loadFilterChainDefinitions();
  9. shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
  10. return shiroFilter;
  11. }
  12. }

以上是潘老师亲自测试的结果,此种方法确实能解决该问题,之前潘老师也试图使用@Order来降低@Configuration类创建的优先级提高shiroService的创建优先级,但是并没有效果,配置类始终优先于其他类,因此如果你也还有什么问题可以联系潘老师,若有更好的解决方案,也希望能留言评论,大家一起交流学习!

标签:Configuration,SpringBoot,Autowired,shiroService,shiroFilter,null,ShiroFilterFact
From: https://www.cnblogs.com/dirgo/p/16797919.html

相关文章

  • 第二季:8+.SpringBoot结合JVMGC【Java面试题】
    第二季:8+.SpringBoot结合JVMGC【Java面试题】​​前言​​​​推荐​​​​8+.SpringBoot结合JVMGC​​​​最后​​前言202210/1316:17路漫漫其修远兮,吾将上下而求索8+.......
  • Java: null object Pattern
    /***版权所有2022涂聚文有限公司*许可信息查看:*描述:*空对象模式nullobjectPattern*历史版本:JDK14.02*2022-09-12创建者geovindu*2022-09-1......
  • C++ Null 指针的使用
    原文链接:https://www.zhoubotong.site/post/85.html这里有必要说下关于空指针的使用注意事项,C++中,如果一个指针不指向任何数据,就称之为空指针,用NULL表示。注意,NULL......
  • springBoot 快速开发 即相关内容
    在Boot中我们要是不想使用tomcat服务器想使用jetty的服务器的话修改一下pom.xml就行了  修改服务器端口(在配置文件中我们直接输入port就可以修改但是注!我......
  • SpringBoot自动装配的使用
    1.模板组件企业开发中,往往将常见工具类封装抽取,以简洁便利的方式供其他工程模块使用。而SpringBoot的自动装配机制可以方便的实现组件抽取。SpringBoot执行流程如下扫描依赖......
  • SpringBoot 扩展性接口
    1.可扩展的接口启动调用顺序图​​org.springframework.beans.factory.xxx​​​​org.springframework.boot.xxx​​​​org.springframework.context.xxx​​ApplicationC......
  • Springboot 服务停止后执行方法
    importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.DisposableBean;importorg.springframework.context.annotatio......
  • SpringBoot整合ES查询
    springboot整个es有很多钟方法,比如TransportClient、RestClient、RestHighLevelClient、SpringData-Es、Elasticsearch-SQL等。ElasticSearch官方提供了3个Client,具体......
  • 83-springboot 多模块打包成jar
    主项目:<packaging>pom</packaging>打包配置: <!--指定使用maven打包--> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <arti......
  • 一篇文章带你掌握主流办公框架——SpringBoot
    一篇文章带你掌握主流办公框架——SpringBoot在之前的文章中我们已经学习了SSM的全部内容以及相关整合SSM是Spring的产品,主要用来简化开发,但我们现在所介绍的这款框架—......