• spring @value 注入static 注入静态变量方法


    对于spring static变量

    下面给大家介绍spring不能注入static变量的原因,具体详情如下所示:

    Spring 依赖注入 是依赖 set方法

    set方法是 是普通的对象方法

    static变量是类的属性

    只能在setAppId方法上加注解,另外class需要加 @Component等注解,这样spring才能扫描到

    对于

    mport org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    @Component
    public class GlobalValue {
    
        @Value("${mysqk.db}")
        public static String DATABASE;
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    DATABASE的值是null

    但是静态的XXX如何注入呢?

    上网查了很多的说法,其实很简单:

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    import lombok.Getter;
    
    @Component
    public class GlobalValue {
    
        @Getter
        public static String DATABASE;
    
        @Value("${mysql.db:test}")
        public void setDatabase(String db) {
            DATABASE = db;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    DATABASE可以获取到值

    这里要特别注意,自动生成的getter和setter方法,会带有static的限定符,需要去掉,才可以。

    ===========================================

    方式二 通过InitializingBean

    import lombok.Getter;
    import lombok.Setter;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Configuration;
    /**
     * 通用配置
     *
     */
    @Configuration
    public class TestConfig implements InitializingBean {
        /**
         * 数据拼接时,数据分隔符,默认:;
         */
        @Value("${data.separator.flag:&}")
        private String separatorCon;
    	
    	/**
         * 数据拼接时,数据分隔符,默认:;
         */
        @Getter
        @Setter
        private static String separator;
    	
    	@Override
        public void afterPropertiesSet() throws Exception {
            separator = separatorCon;      
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    ===========================================

    方式三 定义后通过注入bean

    @Autowired
    private TestConfig config;
    
    • 1
    • 2

    然后通过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;
        }
     
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    @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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

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

  • 相关阅读:
    【LeetCode与《代码随想录》】链表篇:做题笔记与总结-JavaScript版
    Acwing 3306.装珠饰(十一届蓝桥java/py组J题)
    wordpress添加评论过滤器
    Java JDK path环境变量配置
    Flutter之旅:探索安卓与跨平台开发的无限可能
    三、java基础语法
    CSS和JS基础学习
    ConsensusClusterPlus包进行聚类分析
    NAND价格第4季度回暖,现在是SSD入手时机吗?
    非零基础自学Golang 2 开发环境 2.4 Git 安装
  • 原文地址:https://blog.csdn.net/m0_67402970/article/details/126496587