【问题标题】:How change property values at runtime in SpringSpring 如何在运行时更改属性值
【发布时间】:2016-08-04 08:05:28
【问题描述】:

我需要在运行时更改应用程序中的属性。 例如,我有一项服务可以发送一封带有重置密码的电子邮件。请求有效期为 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>

我可以在运行时以某种方式更改此值吗?

【问题讨论】:

    标签: java spring


    【解决方案1】:

    几乎是 2017 年,远离 xml 配置。

    @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 并设置新值并将该功能公开给您的管理员。

    这对于一次性操作很方便。如果您希望您的管理员永久更改密码到期时间,我将改为在 mysql 或您使用的任何数据库中保留 hours.expired 值。

    编辑:回答完全有效的@matt 评论。如果是这种情况,那么迁移到 Java confing 不是一种选择。对于自定义行为,您可以在服务中自动装配 XML 定义的 bean 并执行您想要的任何逻辑。

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

    编辑:2020

    在 2020 年执行此操作的事实上的标准方法是设置由 git 存储库支持的 Cloud Config 服务器。示例:

    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 配置服务器。通过这样做,我们可以对生产设置进行版本控制,并避免更改某些内容然后忘记之前的值等风险。

    【讨论】:

    • 好答案,对非 XML 配置完全有效。想想有些项目是完全建立在 XML 之上的,可能他的也是。
    • 这没有回答问题
    • 我知道它是 Holywar - xml 或 java config 或 groovy,但如果 xml 运行良好,为什么 xml 不好?
    • +1 表示 XML 咆哮。 XML 不好,因为它没有类型或签名检查或代码完成,更新依赖项时很脆弱,功能不透明,比代码更难测试,并且没有内置的 IDE 文档支持。
    • 运行脚本后能否更新配置文件中的配置参数? (以供下次运行时参考)
    【解决方案2】:

    我必须使用 XML 配置。我们的项目就是以此为基础的。 最后我需要从 db 获取所有配置值。最简单的解决方案是使用服务进行配置,并始终从数据库调用配置状态。

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

    这个返回值存储在 db 中。

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

    【讨论】:

    • 我通常创建专门的服务来从数据库中检索配置。 @Component public class MyProperties{ private int hoursExpiredPassword; @PostConstruct public void init() throws Exception { List&lt;String&gt; configurations = configurationService.findAllConfigurations(); // set all your configurations }
    • 这也不能回答问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2015-01-23
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    相关资源
    最近更新 更多