Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在springboot中使用PostConstruct方法时无法保持bean init顺序?_Java_Spring_Spring Boot - Fatal编程技术网

Java 为什么在springboot中使用PostConstruct方法时无法保持bean init顺序?

Java 为什么在springboot中使用PostConstruct方法时无法保持bean init顺序?,java,spring,spring-boot,Java,Spring,Spring Boot,我在数据库中有一些配置信息,当springboot启动时,它只会加载一次这些信息。所以我写代码如下: @Configuration public class CommonConfig { private final DbConfigDao dbConfigDao; @Autowired public CommonConfig (DbConfigDao dbConfigDao) { this.dbConfigDao = dbConfigDao;

我在数据库中有一些配置信息,当springboot启动时,它只会加载一次这些信息。所以我写代码如下:

@Configuration 
public class CommonConfig {
    private final DbConfigDao dbConfigDao;

    @Autowired
    public CommonConfig (DbConfigDao dbConfigDao) {
        this.dbConfigDao = dbConfigDao;
    }

    private int redisStoreDays; //omit get,set method
    
    @PostConstruct
    public void init() { 
        redisStoreDays = dbConfigDao.getValueByKey("redisStoreDays");
        //... continue to load the other config from db 
    }
}
在另一个bean中,我尝试获取redistoredays值,它返回0,但实际值是1

如何保持bean init的顺序? 我尝试在我的Redisbean中添加PostConstruct,但它仍然不起作用

我调试并发现commonConfig不为null,但commonConfig.GetRedistoreDays返回0

在RedisClusterDaoImpl中执行init方法后,commonConfig.getRedisStoreDays将更改为1

我还尝试添加@AutoConfigureBeforeRedisClusterDao.class,但在RedisClusterDaoImpl类中storeDays仍然为0。

使用Spring的@DependsOn,即:

使用Spring的@DependsOn,即:

为什么不呢

@Configuration 
public class CommonConfig {
    private final DbConfigDao dbConfigDao;

    @Autowired
    public CommonConfig (DbConfigDao dbConfigDao) {
        this.dbConfigDao = dbConfigDao;
        // why in PostConstruct? You have the bean right here, it should be initialized
        redisStoreDays = dbConfigDao.getValueByKey("redisStoreDays");
    }

    private int redisStoreDays; //omit get,set method
    
}
或者只是

public class RedisClusterDaoImpl implements RedisDao {  
    @Autowired
    private DbConfigDao commonConfig; 
    private int storeDays = 7;  

    @Override
    public void init()  { 
        storeDays = 60 * 60 * 24 * dbConfigDao.getValueByKey("redisStoreDays");
    }  
}
毕竟,这是Redisbean,我不明白为什么它不应该知道它需要的配置设置的名称。

为什么不呢

@Configuration 
public class CommonConfig {
    private final DbConfigDao dbConfigDao;

    @Autowired
    public CommonConfig (DbConfigDao dbConfigDao) {
        this.dbConfigDao = dbConfigDao;
        // why in PostConstruct? You have the bean right here, it should be initialized
        redisStoreDays = dbConfigDao.getValueByKey("redisStoreDays");
    }

    private int redisStoreDays; //omit get,set method
    
}
或者只是

public class RedisClusterDaoImpl implements RedisDao {  
    @Autowired
    private DbConfigDao commonConfig; 
    private int storeDays = 7;  

    @Override
    public void init()  { 
        storeDays = 60 * 60 * 24 * dbConfigDao.getValueByKey("redisStoreDays");
    }  
}

毕竟,这是redis bean,我不明白为什么它不应该知道它需要的配置设置的名称。

您能在两个init方法中都记录一些东西,并查看执行顺序吗?为了排除顺序不是问题,我不会将配置与普通bean混合,即使从技术上讲,配置是一个组件。为什么不将config Dao作为bean提供呢?或者至少在Dao被注入时初始化days变量,而不是在post构造中。@Suman,如何排除?现在顺序不是我想要的。@daniu,初始化Dao被注入时的days变量,如何编写?config Dao已经是一个bean,并且被注入commonConfig。你能在两个init方法中都记录一些东西并查看执行顺序吗?为了排除顺序不是问题,我不会将配置与普通bean混合,即使从技术上讲,配置是一个组件。为什么不将config Dao作为bean提供呢?或者至少在Dao被注入时初始化days变量,而不是在post构造中。@Suman,如何排除?现在顺序不是我想要的。@daniu,初始化Dao被注入时的days变量,如何编写?config Dao已经是一个bean,并且被注入commonConfig。第一个方法不好,我的构造方法没有参数,比如new RedisSentryDaoImpl。@flower我不知道你的意思。我没有更改你发布的构造函数。第一个方法不正确,我的构造函数方法没有参数,比如new RedisSentryDaoImpl。@我不知道你的意思。我没有更改你发布的构造函数。