美文网首页
spring为静态变量注入配置信息的解决方案

spring为静态变量注入配置信息的解决方案

作者: 不省油的匹诺曹 | 来源:发表于2018-11-20 10:06 被阅读0次

    问题描述:
    DatabaseConfig:

    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ConfigurationProperties(prefix = "database")
    public class DatabaseConfig {
        private static String url;
        private static String user;
        private static String password;
        private static String driver;
        //getter
        //setter
    }
    
    

    DatabaseConfig是为了读入配置信息的一个基础类,目的是在DB类在初始化时,能够获取配置信息。

    正确的DB类初始化方法,是将初始化代码放在一个函数里,并用注解@PostConstruct标记,PostConstruct是指在类型创建之后,才会执行,这样能够保证所有的依赖均已添加。

    @Configuration
    @ConfigurationProperties(prefix = "database")
    public class DB {
        private static String url ;
        private static String user ;
        private static String password ;
        private static String driver ;
        protected static SqlConnector conn;
    
        @PostConstruct
        private static void initialize(){
            System.out.println("db");
            ApplicationContext context = new AnnotationConfigApplicationContext(DatabaseConfig.class);
            DatabaseConfig config = context.getBean(DatabaseConfig.class);
            conn = new SqlConnector(config.getUrl(), config.getUser(), config.getPassword(), config.getDriver());
        }
    }
    
    

    错误的初始化方式。如代码所示,DB类中的变量均为静态变量,之前代码将这些静态变量的初始化放在一个static block中,但会发现,静态变量的初始化,将先于spring注册bean。也就是说,当静态块执行时,spring尚未注入已生命的bean,即DatabaseConfig,这样就使得Database中的变量还尚未被初始化,所以获取的是null。

    @Configuration
    @ConfigurationProperties(prefix = "database")
    public class DB {
        private static String url ;
        private static String user ;
        private static String password ;
        private static String driver ;
        protected static SqlConnector conn;
        static{
            ApplicationContext context = new AnnotationConfigApplicationContext(DatabaseConfig.class);
            DatabaseConfig config = context.getBean(DatabaseConfig.class);
             //这种方式获取的url等均为null
            conn = new SqlConnector(config.getUrl(), config.getUser(), config.getPassword(), config.getDriver());
        }
    }
    

    还有一点需要注意的是,配置信息变量需要声明为静态变量。我推敲的结果,认为用@Configuraiton注解后的类,是会被spring当做一个bean添加到容器中,因为是Configuration,会出发自动执行类的域的setter方法,这样使得static的配置信息能够得到初始化。

    相关文章

      网友评论

          本文标题:spring为静态变量注入配置信息的解决方案

          本文链接:https://www.haomeiwen.com/subject/gkltqqtx.html