zoukankan      html  css  js  c++  java
  • 关于springboot项目中自动注入,但是用的时候值为空的BUG

    最近想做一些web项目来填充下业余时间,首先想到了使用springboot框架,毕竟方便 快捷

    首先:去这里 http://start.spring.io/ 直接构建了一个springboot初始化的项目框架  

    然后:在页面上选择相应的依赖包,然后点击构建按钮,然后下载并且导入IDE中,目前喜欢使用IDEA

    于是一个简答的springboot项目就搭建好了

    废话说完,然后想体验下spring中redis的使用;

    那就直接新建了一个类,然后 @Autowired 自动注入 RedisTemplate 类,当然在这个类上面是要加上 @Component 注解的。

    但是问题来了,在这个类下面创建了一个方法,然后方法里面调用redisTemplate的时候,提示为null,这是为什么呢?

    下面是尝试了各种网上分享的解决方案中认为比较有用的几种方式:

      1.注解没有扫描到,问题原因可能是springboot启动类没有放到最外层的包的根目录下面

    因为springboot启动的时候会自动扫描启动类所在包的所有子包里面包含的注解,如果启动类放错了位置,会导致注解扫描不到

    具体逻辑,请看 

    @SpringBootApplication 注解中包含的 @ComponentScan 这个注解的解析,就是扫描注解的一些逻辑

      2.调用的时候,使用的对象是被new出来的,而不是spring自动注入进来的,没有被spring来管理,所以当然为null

    比如:在类 A里面 注入了 redisTemplate  然后,springboot项目启动之后在A类里面又创建了一个 main方法,然后在main里面,new A(); 来创建一个A的实例,然后再A.redisTemplate 进行调用,获取到的就是一个NULL值

    故:解决方式就是 如果想要使用 @Autowired注入一些springboot自动管理的工具的话,比如 redisTemplate  /  jdbcTemplate  等等,要么就是直接在启动类里面进行注入,不过这样用的比较少,一般都会新建一个类,然后在里面进行注入,

    但是如果想要使用的话需要继承这个类,然后再子类中进行使用,比如使用redisTemplate  和  jdbcTemplate 的话,就可以创建一个 DataSourceConfig 类,然后自动注入  redisTemplate  和  jdbcTemplate 然后新建两个方法, getRedisTemplate()  和 getJdbcTemplate()  

    里面对应的返回相应的 template ,然后在 dao 中使用的时候就可以直接继承 DataSourceConfig  ,然后直接使用  getRedisTemplate()    和 getJdbcTemplate()  这两个方法,来获取到redis 和jdbcTemplate 进行数据的操作

    以上仅为本人最近遇到的一个比较无语的bug解决之后的备忘,以后勿犯

    但是如果刚接触springboot的话,可能会遇到此类问题,欢迎一起探讨

    如有帮助到后来人,则功德无量

  • 相关阅读:
    安装docker
    docker安装完成后测试feisky/nginx:latest 出现问题(Unable to find image 'feisky/nginx:latest' locally)
    负载均衡详细介绍
    docker(一)
    AppCrawer使用(2)
    AppCrawer使用入门(转自https://www.cnblogs.com/alwayswyy/p/7576964.html,感谢原作者)
    获取包名和活动名
    (十八)Collection集合
    (十七)面向对象之内部类
    (十五)final关键字
  • 原文地址:https://www.cnblogs.com/ning-blogs/p/7407081.html
Copyright © 2011-2022 走看看