如何在运行时更改Spring中的属性值

15

我需要在运行时更改我的应用程序中的属性。例如,我有一个服务,可以发送包含重置密码的电子邮件。请求有效期为12小时。但是我想在运行时将此时间更改为24个小时或更长时间。我需要为管理员提供此操作的机会。

我的属性文件是:

hours.expired=12

我的服务

private int hoursExpiredPassword;

public void setHoursExpiredPassword(int hoursExpiredPassword) {
    this.hoursExpiredPassword = hoursExpiredPassword;
}

@Override
public ERequests checkRequest(String number, Date date) {
    PasswordResetRequest findedObject = passwordResetRequestDao.getObjectByElement(PasswordResetRequest.class, "requestId", number);
    if (findedObject == null){
        return ERequests.BAD_REQUEST;
    }else{
        long result = getDateDiff(findedObject.getRequestDate(),date,TimeUnit.HOURS);
        if(result >= hoursExpiredPassword){
            return ERequests.EXPIRED_REQUEST;
        }
    }
    return ERequests.CORRECT_REQUEST;
}

我的Spring XML配置

<bean id="passwordResetRequestService" class="pl.lublin.example.services.servicesDAO.PasswordResetRequestService">
    <property name="passwordResetRequestDao" ref="passwordResetRequestDao"></property>
    <property name="hoursExpiredPassword" value="${hours.expired}"></property>
</bean>

在运行时,我能以某种方式更改这个值吗?

2个回答

13

放弃XML配置吧,现在已经是2017年了。

@Service
public class PasswordResetRequestService {

@Value("${hours.expired:12}") 
private int hoursExpiredPassword;

@Autowired
private PasswordResetRequestDao passwordResetRequestDao;

public void setHoursExpiredPassword(int hoursExpiredPassword) {
    this.hoursExpiredPassword = hoursExpiredPassword;
}


@Override
public ERequests checkRequest(String number, Date date) {
    PasswordResetRequest findedObject = passwordResetRequestDao.getObjectByElement(PasswordResetRequest.class, "requestId", number);
    if (findedObject == null){
        return ERequests.BAD_REQUEST;
    }else{
        long result = getDateDiff(findedObject.getRequestDate(),date,TimeUnit.HOURS);
        if(result >= hoursExpiredPassword){
            return ERequests.EXPIRED_REQUEST;
        }
    }
    return ERequests.CORRECT_REQUEST;
   }

}

使用@Value从属性文件中获取hours.expired的值,如果没有值,则默认为12。您还可以在运行时调用setHoursExpired并设置新值,并将该功能公开给管理员。

这对于一次性操作非常方便。如果您希望管理员永久更改密码过期时间,我建议将hours.expired的值持久化到MySQL或其他数据库中。

编辑:回答完全有效的@matt评论。如果情况是这样,且转换为Java配置不是选项。对于自定义行为,您只需在服务中自动装配您在XML定义的bean,并执行所需的逻辑。

@Autowired
private pl.lublin.zeto.zetoRA.services.servicesDAO.PasswordResetRequestService passwordResetRequestService;

编辑:2020

2020年最常用的方法是设置由git仓库支持的云配置服务器。例如:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo

如此解释:https://cloud.spring.io/spring-cloud-config/reference/html/

您需要一个独立的Spring配置应用程序,所有客户端应用程序都将使用它。最强大的解决方案是使用git存储库支持Spring配置服务器。这样做可以对生产设置进行版本控制,并避免更改某些内容然后忘记以前的值等风险。


2
很好的回答,对于非XML配置来说完全有效。只要考虑到有些项目完全基于XML构建,可能包括他的项目。 - Jan B.
29
这不回答这个问题。 - jucardi
6
对于XML rant点赞。XML的问题在于它缺乏类型或签名检查,代码完成度低,更新依赖时不够稳定,它功能不透明,比代码难以测试,且不具备内置IDE文档支持。 - Max Mumford
配置文件中的配置参数在运行脚本后可以更新吗?(目的是在下一次运行时使用) - hirosht
当它没有提供答案时,这怎么是“正确答案”呢?如果您有一个小项目并且更改这些配置是可行的,它提供了一种解决方法。 - P. Waksman
显示剩余2条评论

-1

我必须使用XML配置。我们的项目基于它。 最后,我需要从数据库中获取所有配置值。最简单的解决方案是使用配置服务,并始终从数据库调用配置状态。

configurationService.findAllConfigurations().get("hours.expired")

这个返回值是存储在数据库中的。

但我认为有更好的解决方案。


我通常会创建专门的服务来从数据库中检索配置。@Component public class MyProperties{ private int hoursExpiredPassword; @PostConstruct public void init() throws Exception { List configurations = configurationService.findAllConfigurations(); // set all your configurations } - SeaBiscuit
这也没有回答问题。 - ssimm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接