Spring依赖注入static静态变量相关问题

简介: Spring依赖注入static静态变量相关问题

问题:springmvc给静态变量注入报:@Autowired annotation is not supported on static fields

原因:spring annotation不支持静态变量注入


解决:

方法一:把get,set方法的static修饰符去掉,然后在set方法上面加@Autowired即可

public class EnDecryptionServiceImpl implements IEnDecryptionService{
    /** 阿里云OSS配置查询 */
    private static OSSConfMapper ossConfMapper;
    /** 阿里云OSS图片上传 */
    private static UploadImgOSS uploadImgOSS;
    public  OSSConfMapper getOssConfMapper() {
        return ossConfMapper;
    }
    @Autowired
    public void setOssConfMapper(OSSConfMapper ossConfMapper) {
        UploadUtil.ossConfMapper = ossConfMapper;
    }
    public  UploadImgOSS getUploadImgOSS() {
        return uploadImgOSS;
    }
    @Autowired
    public void setUploadImgOSS(UploadImgOSS uploadImgOSS) {
        UploadUtil.uploadImgOSS = uploadImgOSS;
    }
}

方法二:在构造函数上加上@Autowired

  /**
   * 第二种解决 Autowired annotation is not supported on static fields的方式
   */
    @Autowired
    public void EnDecryptionServiceTwoImpl(OSSConfMapper ossConfMapper,UploadImgOSS uploadImgOSS) {
        ossConfMapper=ossConfMapper;
        uploadImgOSS=uploadImgOSS;
        log.info(xxx);
        init();
    }


Spring静态注入的三种方式


  1. xml方式
    适合基于XML配置的WEB项目
<bean id="mongoFileOperationUtil" class="com.*.*.MongoFileOperationUtil" init-method="init">  
    <property name="dsForRW" ref="dsForRW"/>  
</bean> 

@PostConstruct方式

import org.mongodb.morphia.AdvancedDatastore;  
import org.springframework.beans.factory.annotation.Autowired;  
@Component  
public class MongoFileOperationUtil {  
    @Autowired  
    private static AdvancedDatastore dsForRW;  
    private static MongoFileOperationUtil mongoFileOperationUtil;  
    @PostConstruct  
    public void init() {  
        mongoFileOperationUtil = this;  
        mongoFileOperationUtil.dsForRW = this.dsForRW;  
    }  
}


@PostConstruct 注解的方法在加载类的构造函数之后执行,也就是在加载了构造函数之后,执行init方法;(@PreDestroy 注解定义容器销毁之前的所做的操作)

这种方式和在xml中配置 init-method和 destory-method方法差不多,定义spring 容器在初始化bean 和容器销毁之前的所做的操作


set方法上添加@Autowired注解,类定义上添加@Component注解

import org.mongodb.morphia.AdvancedDatastore;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Component;  
@Component  
public class MongoFileOperationUtil {    
    private static AdvancedDatastore dsForRW;  
    @Autowired  
    public void setDatastore(AdvancedDatastore dsForRW) {  
        MongoFileOperationUtil.dsForRW = dsForRW;  
    }  
}  

首先Spring要能扫描到AdvancedDatastore的bean,然后通过setter方法注入;

然后注意:成员变量上不需要再添加@Autowired注解;

相关文章
|
5月前
|
XML Java 测试技术
Spring Boot中的依赖注入和控制反转
Spring Boot中的依赖注入和控制反转
|
7月前
|
XML Java 程序员
Spring6框架中依赖注入的多种方式(推荐构造器注入)
依赖注入(DI)是一种过程,对象通过构造函数参数、工厂方法的参数或在对象实例构建后设置的属性来定义它们的依赖关系(即与其一起工作的其他对象)。
94 3
|
7月前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
64 0
|
4月前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
53 0
|
4月前
|
设计模式 自然语言处理 Java
简单了解下Spring中的各种Aware接口实现依赖注入
在Spring框架中,Aware接口是一组用于提供特定资源或环境信息的回调接口。这些接口被设计用来允许Bean获取对Spring容器或其他相关资源的引用,并在需要时进行适当的处理。
38 2
|
4月前
|
自然语言处理 Java 开发者
简单了解下Spring中的各种Aware接口实现依赖注入
【8月更文挑战第21天】在Spring框架中,Aware接口系列是一种特殊的机制,它允许Bean在初始化过程中获取到Spring容器或容器中的特定资源,从而实现了更加灵活和强大的依赖注入方式。本文将围绕Spring中的各种Aware接口,详细探讨它们如何帮助开发者在工作和学习中更好地实现依赖注入。
111 0
|
5月前
|
缓存 Java Spring
Spring循环依赖问题之Spring不支持构造器内的强依赖注入如何解决
Spring循环依赖问题之Spring不支持构造器内的强依赖注入如何解决
|
6月前
|
设计模式 Java 测试技术
Spring Boot中的依赖注入详解
Spring Boot中的依赖注入详解
|
6月前
|
缓存 Java 测试技术
Spring 框架,不只是依赖注入和面向切面那么简单!
【6月更文挑战第25天】Spring框架超越DI和AOP,涵盖事务管理、数据访问抽象如`JdbcTemplate`、消息驱动支持如`@JmsListener`、缓存管理和测试工具。示例代码展示了其简化复杂性的能力,如自动事务处理、数据库操作及消息队列监听。Spring是构建高效企业级应用的全面解决方案。
40 4
|
6月前
|
Java Spring 容器
spring如何进行依赖注入,通过set方法把Dao注入到serves
spring如何进行依赖注入,通过set方法把Dao注入到serves
下一篇
无影云桌面