• 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;
    
    
    }

    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;
        }
    
    }

    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;      
        }
    }

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

    方式三 定义后通过注入bean

    
    @Autowired
    private TestConfig config;

     然后通过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注解;

    正因为当初对未来做了太多的憧憬,所以对现在的自己尤其失望。生命中曾经有过的所有灿烂,终究都需要用寂寞来偿还。
  • 相关阅读:
    Java Character类
    JavaMath&Number类
    oracle中创建数据库实例
    Jenkins安装和配置
    crontab计划 -计划任务和日志管理
    centos修改默认字符编码为GBK(服务器端java GBK字符乱码)
    使用vsphere client 克隆虚拟机
    建索引让SQL飞起来
    oracle中对LONG列进行查询
    优化sql,返回行数少情况下,NL比hash快好多
  • 原文地址:https://www.cnblogs.com/candlia/p/11919951.html
Copyright © 2020-2023  润新知