Java 为什么在springboot中使用PostConstruct方法时无法保持bean init顺序?
我在数据库中有一些配置信息,当springboot启动时,它只会加载一次这些信息。所以我写代码如下: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;
@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。@我不知道你的意思。我没有更改你发布的构造函数。