关于工具类静态方法调用@Autowired注入的service类问题

 @Component //此处注解不能省却(0) 1      public class NtClient {
 2      /**
 3         * 日志
 4         */
 5         private static String clazzName = NtClient.class.getName();
 6          /**
 7             * 此处是要使用的service需要spring注入(1)
 8             */
 9          @Autowired
10           private NotifyTimeService notifyTimeService;
11           private static NtClient ntClient;
12           /**
13              * 注意此处注解(2) */
14           @PostConstruct
15           public void init() {       16                    ntClient = this;
17                    ntClient.notifyTimeService = this.notifyTimeService;
18            }
19             /**
20                * 主要使用场景(3)
21                */
22            public static void insertParam(int id){
23                    /**
24                       * 注意此处的调用方法(4)
25                       */
26                   if(ntClient.notifyTimeService.deleteNotifyTime(id)){
27                   }
28            }
29 }    
注释:(0)处作用是将(2)ntClient = this;this进行赋值(注:如果无注解ntClient 将null)     (1)处为spring自动注入,使用spring框架的很常用,但是如果在静态方法中调用此注入类的方法,发现注入为‘null‘;原因不是spring未注入,而是被static方法给‘清空‘了,在无法先于static方法初始化之前想了一个办法   (2)处为想到的办法:通过(注:@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行)的方法public void init()先给该类赋值,然后通过(1)出注入进来。这样不影响dao等service下面调用的注入!   (3)处要处理的特殊方法static(经典是 main()方法,自己想想基础,它里面可以使用的方法调用的模式)   (4)处是使用这样模式的调用方式notifyTimeService现在是作为ntClient的属性

需要在工具类中注入Service,由于工具类中方法一般都是静态的,所以要求该属性也要是静态的(Service)。但是由于Spring/SpringBoot正常情况下不能支持注入静态属性(会报空指针异常)。主要原因在于:Spring的依赖注入实际上是依赖于Set方法进行注入值的,Spring是基于对象层面的依赖注入,而静态属性/静态变量实际上是属于类的。

原文地址:https://www.cnblogs.com/moxiaotao/p/10222187.html

时间: 2024-10-12 18:31:50

关于工具类静态方法调用@Autowired注入的service类问题的相关文章

new出来的对象无法调用@Autowired注入的Spring Bean

@Autowired注入Spring Bean,则当前类必须也是Spring Bean才能调用它,不能用new xxx()来获得对象,这种方式获得的对象无法调用@Autowired注入的Bean. 1.类1,加入Spring Pool public class PersonServiceImpl implements PersonService{ public void save(){ System.out.println("This is save for test spring")

spring管理的类如何调用非spring管理的类

spring管理的类如何调用非spring管理的类. 就是使用一个spring提供的感知概念,在容器启动的时候,注入上下文即可. 下面是一个工具类. 1 import org.springframework.beans.BeansException; 2 import org.springframework.context.ApplicationContext; 3 import org.springframework.context.ApplicationContextAware; 4 imp

Springboot在Utils类中使用@Autowired注入

1. 使用@Component注解标记工具类MailUtil: 2. 使用@Autowired注入我们需要的bean: 3. 在工具类中编写init()函数,并使用@PostConstruct注解标记工具类,初始化Bean: @Component public class MailUtil { @Autowired private JavaMailSenderImpl javaMailSender; public static MailUtil mailUtil; @PostConstruct

解决静态方法调用注入的service

1 在使用jpa的复杂查询时,声明了specification时声明为静态方法,导致注入的service无法使用,故想到俩种方式,一种手动注入,一种注解注入,此文使用的时注解注入: 解决静态方法调用注入的service 1 // 先说一下解决方法 2 @Autowired 3 private AService aService; 4 5 // 声明静态变量,为了之后调用service 6 public static ClassA classA; 7 8 // 关键:通过注解实现注入 9 @Pos

Java 各级注解及@Autowired注入为null解决办法

1.@controller 控制器 用于标注控制层,相当于struts中的action层. 2.@service 服务层 用于标注服务层,主要用来进行业务的逻辑处理. 3.@repository DAO层(Repo层) 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件. 4.@Autowired 注入实例 表示被修饰的类需要注入对象,spring会扫描所有被@Autowired标注的类,然后根据 类型 在ioc容器中找到匹配的类注入. 5.@Component (把普通pojo实例

Python的类实例方法,类方法,类静态方法

以下面的类定义为例: # coding:utf-8 class A: count = 0 def __init__(self, inst_name): self.inst_name = inst_name self.__class__.count += 1 def inst_method(self): print '实例(%s):%s' % (self.__class__.count, self.inst_name) @classmethod def class_method(cls): pri

静态工具类中使用注解注入service

转载:http://blog.csdn.net/p793049488/article/details/37819121 一般需要在一个工具类中使用@Autowired 注解注入一个service.但是由于工具类方法一般都写成static,所以直接注入就存在问题. 注:Spring工厂要有这个bean. 使用如下方式可以解决: /** * */ package cn.ffcs.drive.common.util; import javax.annotation.PostConstruct; imp

Netty handler处理类无法使用@Autowired注入bean的解决方法

问题由来: 公司有个项目用到netty作为websocket的实现,最近打算部署双机,这使得原来保存在内存中的Channel信息不再可行,需要保存在redis中,改造过程中发现通过@Autowired注入进来的JedisClient类无法使用,外部表现为jedisClient对象为null 解决过程: 1.一开始以为是spring配置引入先后顺序的问题,导致netty启动的时候jedisClient还没实例化好,调整后发现问题依旧 2.之后百度发现有不少人遇到这个问题,有回答说netty中无法使

关于jpa的Specification自定义函数,实现oracle的decode;以及如何在静态方法中调用注入的service

如何在静态方法中调用注入的service Public class ClassA{ public static ClassA classA; @Resource private Service service; //原理时在工程启动时加载,在静态方法前加载,这样就可以在静态方法中调用注入的方法啦 @PostConstruct public void init() { classA = this; classA.service=service; }} 关于jpa的Specification自定义函