controller定时任务注入service 为null

转载至:https://my.oschina.net/ytliyang/blog/644533

最近在做一个Spring+MyBatis的一个项目,其中用到了Redis的存储,然后遇到问题是这样的:


RedisTask是通过定时器来每分钟像数据库里推送的,于是就有了

public class RedisTask  extends Task {

    public void execute(TaskExecutionContext executor) throws RuntimeException {
    ……
    ……
    }
 }

     然后在定时器的任务中通过对Redis的调用,推送到本地数据库

OrderService orderService = new OrderService();
Order order = new Order();
int num = orderService.add(order);
System.out.println("插入条数为:" + num);

那么问题来了,tomcat开始没次调用定时器的RedisTask就开始报错,debug发现orderService为null,也就是说service根本就没有注入。

然后我就在Spring的配置文件里查看标注问题,发现根本没问题,再然后发现此方法继承了Task,于是乎恍然大悟

:定时器继承了Task之后,在定时器调用此方法后会直接执行execute方法,来不急执行标注进行注入。

 @Resource
    private OrderService orderService;

 然后解决方案:

1、引入ApplicationContextUtil的工具类


  
  
  1. package com.wyy.snail.core.util;  
  2.   
  3. import org.springframework.beans.BeansException;  
  4. import org.springframework.beans.factory.NoSuchBeanDefinitionException;  
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.ApplicationContextAware;  
  7. import org.springframework.stereotype.Component;  
  8.   
  9. /** 
  10.  * Spring的工具类,用来获得配置文件中的bean 
  11.  *  
  12.  * @author penghy 
  13.  * @date 2014-04-08 
  14.  *  
  15.  */  
  16. @Component  
  17. public class SpringContextUtils implements ApplicationContextAware {  
  18.   
  19.     private static ApplicationContext applicationContext = null;  
  20.   
  21.     /*** 
  22.      * 当继承了ApplicationContextAware类之后,那么程序在调用 getBean(String)的时候会自动调用该方法, 
  23.      * 不用自己操作 
  24.      */  
  25.     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  
  26.         SpringContextUtils.applicationContext = applicationContext;  
  27.     }  
  28.   
  29.     public static ApplicationContext getApplicationContext() {  
  30.         return applicationContext;  
  31.     }  
  32.   
  33.     /*** 
  34.      * 根据一个bean的id获取配置文件中相应的bean 
  35.      *  
  36.      * @param name 
  37.      * @return 
  38.      * @throws BeansException 
  39.      */  
  40.     public static Object getBean(String name) throws BeansException {  
  41.         return applicationContext.getBean(name);  
  42.     }  
  43.   
  44.     /*** 
  45.      * 类似于getBean(String name)只是在参数中提供了需要返回到的类型。 
  46.      *  
  47.      * @param name 
  48.      * @param requiredType 
  49.      * @return 
  50.      * @throws BeansException 
  51.      */  
  52.     public static <T> T getBean(String name, Class<T> requiredType) throws BeansException {  
  53.         return applicationContext.getBean(name, requiredType);  
  54.     }  
  55.   
  56.     /** 
  57.      * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true 
  58.      *  
  59.      * @param name 
  60.      * @return boolean 
  61.      */  
  62.     public static boolean containsBean(String name) {  
  63.         return applicationContext.containsBean(name);  
  64.     }  
  65.   
  66.     /** 
  67.      * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 
  68.      * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) 
  69.      *  
  70.      * @param name 
  71.      * @return boolean 
  72.      * @throws NoSuchBeanDefinitionException 
  73.      */  
  74.     public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {  
  75.         return applicationContext.isSingleton(name);  
  76.     }  
  77.   
  78.     /** 
  79.      * @param name 
  80.      * @return Class 注册对象的类型 
  81.      * @throws NoSuchBeanDefinitionException 
  82.      */  
  83.     public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {  
  84.         return applicationContext.getType(name);  
  85.     }  
  86.   
  87.     /** 
  88.      * 如果给定的bean名字在bean定义中有别名,则返回这些别名 
  89.      *  
  90.      * @param name 
  91.      * @return 
  92.      * @throws NoSuchBeanDefinitionException 
  93.      */  
  94.     public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {  
  95.         return applicationContext.getAliases(name);  
  96.     }  
  97. }  

 2、在execute方法中以这种方式进行对service进行注入

OrderService orderService = (OrderService)ApplicationContextUtil.getBean("orderService");

注:在service的接口的@Service标注中必须写明注入的名字。 

@Service("orderService")
public class OrderServiceImpl implements OrderService {

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可能是以下原因导致Spring Boot注入Servicenull: 1. 没有在Service类上添加@Service注解,导致Spring无法识别该类为Service类。 2. 没有在Controller添加@Autowired或@Resource注解,导致Service类无法被注入。 3. Service类的构造函数没有被正确实现,导致Spring无法正确实例化该类。 4. Service类的命名不符合Spring的命名规范,导致Spring无法正确识别该类。 5. Service类所在的包没有被正确扫描,导致Spring无法找到该类。 如果以上原因都不是导致注入Servicenull的原因,可以尝试重启应用程序或检查依赖项是否正确引入。 ### 回答2: Spring Boot是一个轻量级的开发框架,具有自动配置和快速启动等特点,适用于快速开发小型应用程序。在使用Spring Boot的过程,我们可以使用依赖注入(DI)来管理对象之间的依赖关系。但有时候,我们在注入service的时候会发现它为null。 1. 检查@Service注解 @Service注解用于标识该类是一个服务类,如果没有添加该注解或者注解名称有误,则Spring会无法识别服务类,导致注入servicenull。因此,需要检查@Service注解是否正确地添加到服务类上。 2. 检查@ComponentScan配置 @ComponentScan用于指定Spring框架需要扫描的包路径,如果没有配置或者指定的路径有误,则Spring会无法扫描到服务类,导致注入servicenull。因此,需要检查@ComponentScan配置是否正确地添加在程序的入口处。 3. 检查@Autowired注解 @Autowired注解用于标识需要自动装配依赖关系的类、属性或构造函数。如果没有使用该注解或者注解名称有误,则Spring会无法自动注入service,导致注入servicenull。因此,需要检查@Autowired注解是否正确地添加到需要注入service上。 4. 检查@Service类是否实现了接口 在服务类,如果没有实现任何接口,则无法使用接口注入service。如果必须使用接口注入,则需要先定义接口,再在服务类实现该接口。否则,在注入service时会发生空指针异常。 5. 检查@Autowired注解的位置是否正确 @Autowired注解有两种用法,一种是使用在字段上,如:@Autowired private UserService userService;另一种是使用在构造函数,如: @Autowired public UserController(UserService userService) { this.userService = userService; } 如果在使用构造函数注入时,需要确保@Autowired注解在构造函数上,而非字段上。 总之,springboot注入servicenull的原因可能有很多,需要仔细检查以上几个方面。只要找到原因,解决问题也就不难了。 ### 回答3: 在使用Spring Boot注入Service时,遇到Servicenull的问题,常见的原因有以下几种: 1.未使用@ServiceService类注释为一个Spring组件 在Service,需要使用注解@Service来将其注释为一个Spring组件,才能被Spring Boot扫描并实例化。如果Service类未被注释为Spring组件,则在注入时会出现null指针异常。 2.未使用@Autowired注入Service 在使用Service时,需要在需要使用该Service的类使用@Autowired注入Service,以便Spring Boot将其注入。如果未使用@Autowired来注入Service,则在使用该Service时会出现null指针异常。 3.未在配置文件配置Service的实例化 在配置文件,需要将Service类的实例化配置到Spring Boot的上下文,以便Spring Boot能够创建关于该类的Bean定义,并将其实例化。如果未在配置文件配置Service的实例化,则在注入时会出现null指针异常。 4.未正确书写Service类名 在注入时,需要正确书写Service类的名称。如果未正确书写Service类的名称,或者类名与文件名不一致,则在注入时会出现null指针异常。 5.循环依赖 在使用Spring Boot时,如果Service类存在循环依赖,则在注入时会出现null指针异常。此时需要使用@Lazy注解来解决循环依赖问题,同时需要注意循环依赖可能存在的性能问题。 综上所述,当出现Spring Boot注入Servicenull的情况时,应该检查是否正确使用了@Service和@Autowired注解,是否在配置文件配置了Service的实例化,是否正确书写了类名,并且是否存在循环依赖等情况。找到问题所在后,进行相应的修正即可解决该问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值