복붙노트

[SPRING] Spring에서 런타임에 속성 값을 변경하는 방법

SPRING

Spring에서 런타임에 속성 값을 변경하는 방법

런타임시 응용 프로그램에서 속성을 변경해야합니다. 예를 들어, 나는 resset 패스워드를 가진 이메일을 보내는 서비스를 가지고있다. 요청은 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;
}

내 봄 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>

런타임에이 값을 어쩌면 변경할 수 있습니까?

해결법

  1. ==============================

    1.그냥 XML 구성에서 거의 2017 이동 멀리.

    그냥 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를 사용하면 속성 파일에서 시간 값을 가져옵니다. 값이없는 경우 기본 값은 12가됩니다. 런타임에 setHoursExpired를 호출하고 새 값을 설정하여 해당 기능을 관리자에게 표시 할 수도 있습니다.

    이것은 한 번 동작 할 때 편리합니다. 귀하의 관리자가 영구적으로 암호 만료 시간을 변경하려면 대신 mysql 또는 whatver db 사용중인 hours.expired 값을 유지할 것입니다.

    편집 : 완벽하게 유효한 @matt 발언에 응답. 그렇다면 Java confing으로 이동하는 것이 옵션이 아닙니다. 사용자 정의 비헤이비어의 경우 서비스에서 XML 정의 Bean을 자동으로 호출하고 원하는 모든 논리를 수행 할 수 있습니다.

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

    2.XML 구성을 사용해야합니다. 우리의 프로젝트는 그것을 기반으로합니다. 마지막으로 db에서 모든 구성 값을 가져와야합니다. 가장 간단한 솔루션은 구성에 사용되는 서비스이며 항상 db에서 구성 상태를 호출합니다.

    XML 구성을 사용해야합니다. 우리의 프로젝트는 그것을 기반으로합니다. 마지막으로 db에서 모든 구성 값을 가져와야합니다. 가장 간단한 솔루션은 구성에 사용되는 서비스이며 항상 db에서 구성 상태를 호출합니다.

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

    이 반환 값은 db에 저장됩니다.

    하지만 더 나은 해결책이 있다고 생각합니다.

  3. ==============================

    3.@Value ( "$ {hours.expired}")를 사용하여 속성 파일에서 값을 변경하는 것은 좋지 않습니다. 특성 파일에서 값을 변경하면 서버를 다시 시작하거나 응용 프로그램을 다시 실행해야합니다. 그래서 그것의 더 나은 시간을 저장하는 데이터베이스. 언제든지 쉽게 업데이트 할 수 있습니다.

    @Value ( "$ {hours.expired}")를 사용하여 속성 파일에서 값을 변경하는 것은 좋지 않습니다. 특성 파일에서 값을 변경하면 서버를 다시 시작하거나 응용 프로그램을 다시 실행해야합니다. 그래서 그것의 더 나은 시간을 저장하는 데이터베이스. 언제든지 쉽게 업데이트 할 수 있습니다.

  4. from https://stackoverflow.com/questions/38761781/how-change-property-values-at-runtime-in-spring by cc-by-sa and MIT license