복붙노트

[SPRING] Spring의 속성 파일에서 데이터베이스 설정 업데이트

SPRING

Spring의 속성 파일에서 데이터베이스 설정 업데이트

나는 봄이 처음이다. 사용자가 제출할 때 페이지로드 및 데이터베이스 설정을 업데이트 데이터베이스 정보를 보여주는 데이터베이스 관리자 페이지를 만들려고합니다.

이 튜토리얼을 따라 속성 파일에서 데이터베이스 설정을 지정했다.

나는 프로그래밍 방식으로 특성 파일의 데이터베이스 설정을 갱신했다. 다음 코드를 사용하여 데이터베이스 설정을 검색했을 때

DriverManagerDataSource databaseSource = (DriverManagerDataSource)context.getBean("dataSource");
databaseSource.getUsername();

나는 구식 가치를 얻고 새로운 가치를 얻을 수 없었다.

이것은 applicationContext.xml 파일의 매핑입니다.

<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

    <property name="location">
        <value>classpath:/bundle/database.properties</value>
    </property>
</bean>

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

속성 파일을 검사하여 최신 입력으로 업데이트되도록했습니다.

내가 뭘 놓치고 있니?

미리 감사드립니다.

P.S Spring 3에서 JSF1.2를 사용하고 있습니다.

최신 정보

그냥 내 요구 사항을 간단하게. 내가 setparate dbsettings 페이지를 만들 때, 사용자가 다른 데이터베이스에 연결할 때 그 / 그녀는 단지 dbsettings 페이지의 세부 정보를 입력하고 연결할 수 있습니다.

최신 정보

이 코드를 사용하여 응용 프로그램 컨텍스트를 검색했습니다.

private ApplicationContext context;

....

ServletContext servletContext = FacesUtil.getServletContext();
    this.context = WebApplicationContextUtils
            .getRequiredWebApplicationContext(servletContext);

AbstractApplicationContext로 변경하면 위의 코드에서 어떤 변경이 필요합니까?

최신 정보

this.context = (AbstractApplicationContext)WebApplicationContextUtils
            .getRequiredWebApplicationContext(servletContext);
    String valueForTheProperty = "";


    context.refresh();

위 라인을 추가하면

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is java.lang.NullPointerException
org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:599)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377)
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
$Proxy1.getDatabasePasswordFromSettings(Unknown Source)
com.smartcall.delegate.DbSettingsDelegate.getDatabasePassswordFromSettings(DbSettingsDelegate.java:38)
com.smartcall.bean.DbSettingsBean.loadDatabaseSettings(DbSettingsBean.java:49)
com.smartcall.bean.DbSettingsBean.<init>(DbSettingsBean.java:41)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
java.lang.Class.newInstance0(Class.java:355)
java.lang.Class.newInstance(Class.java:308)
com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:185)
com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:105)
com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:368)
com.sun.faces.mgbean.BeanManager.create(BeanManager.java:230)
com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:86)
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:68)
org.apache.el.parser.AstValue.getValue(AstValue.java:112)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:246)
com.sun.facelets.tag.jsf.ComponentHandler.createComponent(ComponentHandler.java:224)
com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:139)
com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
com.sun.facelets.tag.jsf.ComponentHandler.applyNextHandler(ComponentHandler.java:314)
com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:169)
com.sun.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:109)
com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25)
com.sun.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:95)
com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:524)
com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:567)
org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)

root cause

java.lang.NullPointerException
org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge.nextTimestamp(RegionFactoryCacheProviderBridge.java:85)
org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:526)
org.hibernate.impl.SessionFactoryImpl.openSession(SessionFactoryImpl.java:535)
org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:493)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377)
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
$Proxy1.getDatabasePasswordFromSettings(Unknown Source)
com.smartcall.delegate.DbSettingsDelegate.getDatabasePassswordFromSettings(DbSettingsDelegate.java:38)
com.smartcall.bean.DbSettingsBean.loadDatabaseSettings(DbSettingsBean.java:49)
com.smartcall.bean.DbSettingsBean.<init>(DbSettingsBean.java:41)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
java.lang.Class.newInstance0(Class.java:355)
java.lang.Class.newInstance(Class.java:308)
com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:185)
com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:105)
com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:368)
com.sun.faces.mgbean.BeanManager.create(BeanManager.java:230)
com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:86)
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:68)
org.apache.el.parser.AstValue.getValue(AstValue.java:112)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:246)
com.sun.facelets.tag.jsf.ComponentHandler.createComponent(ComponentHandler.java:224)
com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:139)
com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
com.sun.facelets.tag.jsf.ComponentHandler.applyNextHandler(ComponentHandler.java:314)
com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:169)
com.sun.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:109)
com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25)
com.sun.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:95)
com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:524)
com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:567)
org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)

내가 줄을 주석 처리 할 때

context.refresh()

응용 프로그램이 잘 작동합니다. Plz 도움말

최신 정보

DBSettingBean

public DbSettingsBean()
{
    dbSettingsDelegate = new DbSettingsDelegate();

    loadDatabaseSettings();
    submitButton.setRendered(false);
    testButton.setRendered(true);
}

public void loadDatabaseSettings()
{
    this.setUserName(dbSettingsDelegate.getDatabaseUserNameFromSettings());
    this.setPassword(dbSettingsDelegate.getDatabasePassswordFromSettings());
    this.setServerName(dbSettingsDelegate.getDatabaseServerNameFromSettings());
    this.setDataSourceName(dbSettingsDelegate.getDatabaseNameFromSettings());
}

public HtmlOutputText getText()
{
    return text;
}



public void setText(HtmlOutputText text)
{
    this.text = text;
}



public HtmlAjaxCommandButton getSubmitButton()
{
    return submitButton;
}



public void setSubmitButton(HtmlAjaxCommandButton submitButton)
{
    this.submitButton = submitButton;
}



public HtmlCommandButton getTestButton()
{
    return testButton;
}



public void setTestButton(HtmlCommandButton testButton)
{
    this.testButton = testButton;
}



public HtmlOutputText getStatusMessageComponent()
{
    return statusMessageComponent;
}

public void setStatusMessageComponent(HtmlOutputText statusMessageComponent)
{
    this.statusMessageComponent = statusMessageComponent;
}

public UIInput getPassworder()
{
    return passworder;
}

public void setPassworder(UIInput passworder)
{
    this.passworder = passworder;
}

public String getServerName()
{
    return serverName;
}

public void setServerName(String serverName)
{
    this.serverName = serverName;
}

public String getDataSourceName()
{
    return dataSourceName;
}

public void setDataSourceName(String dataSourceName)
{
    this.dataSourceName = dataSourceName;
}

public String getUserName()
{
    return userName;
}

public void setUserName(String userName)
{
    this.userName = userName;
}

public String getPassword()
{
    return password;
}

public void setPassword(String password)
{
    this.password = password;
}

public String testWhetherTheConnectionExists()
{       
    return dbSettingsDelegate.checkWhetherDatabaseConnectionExists(getUserName(), getPassword(), getDataSourceName(),getServerName());
}

과..

DbSettingsDelegate

public DbSettingsDelegate()
{
    try 
    {
        System.out.println("Dbsettings delegate: "+FacesContext.getCurrentInstance());
        dbSettingsService = (DbSettingsService) ServiceLocator
                        .getInstance().getService(
                        ServiceLocator.Services.DBSETTINGS);
    } 
    catch (Exception e) 
    {
        logger.debug("error in AddressBookDelegate constructor", e);
    }
}

public String getDatabaseUserNameFromSettings()
{
    return dbSettingsService.getDatabaseUserNameFromSettings();
}

public String getDatabasePassswordFromSettings()
{
    return dbSettingsService.getDatabasePasswordFromSettings();
}

public String getDatabaseServerNameFromSettings()
{
    return dbSettingsService.getDatabaseServerNameFromSettings();
}

public String getDatabaseNameFromSettings()
{
    return dbSettingsService.getDatabaseNameFromSettings();
}

public String checkWhetherDatabaseConnectionExists(String theUserName,String thePassword,String theDatabaseName,String theServerName)
{
    return dbSettingsService.checkWhetherTheDatabaseConnectionExists(theUserName, thePassword, theDatabaseName, theServerName);
}

이 코드는 데이터베이스 세부 정보를 검색하여 사용자에게 표시하는 코드입니다.

ServletContext servletContext = FacesUtil.getServletContext();
    this.context = (AbstractApplicationContext)WebApplicationContextUtils
            .getRequiredWebApplicationContext(servletContext);
    String valueForTheProperty = "";
    DriverManagerDataSource databaseSource =  null;

    context.refresh();
    databaseSource = (DriverManagerDataSource)context.getBean("dataSource");



    if(theProperty.equalsIgnoreCase("username"))
    {
        valueForTheProperty = databaseSource.getUsername();
    }       
    else if(theProperty.equalsIgnoreCase("password"))
    {
        valueForTheProperty = databaseSource.getPassword();
    }
    else if(theProperty.equalsIgnoreCase("server"))
    {           
        valueForTheProperty = this.splitUrlAndGetValueForKey(databaseSource.getUrl(), "server");
        System.out.println("Server:  "+valueForTheProperty);
    }
    else
    {
        valueForTheProperty = this.splitUrlAndGetValueForKey(databaseSource.getUrl(), "databasename");
    }

최신 정보 코드를 디버깅 할 때 콘솔에서이 줄을 발견했습니다. context.refresh ()가 호출 될 때

Dec 28, 2010 3:22:44 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: Running hbm2ddl schema update
Dec 28, 2010 3:22:44 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: fetching database metadata
Dec 28, 2010 3:22:44 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: updating schema
Dec 28, 2010 3:22:44 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: schema update complete

그래서 나는 약간의 갱신이 계속되었다고 추측 할 수있다. 왜 내가 이전 값을 계속 지는지 확인할 수 없다.

최신 정보 완전한 applicationCOntext.xml 파일

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" scope="prototype">

    <property name="location">
        <value>classpath:/bundle/database.properties</value>
    </property>
</bean>

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>


<!-- Hibernate SessionFactory Definition -->
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">


    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">
                org.hibernate.dialect.MySQLDialect
            </prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.cglib.use_reflection_optimizer">
                true
            </prop>
            <prop key="hibernate.cache.provider_class">
                org.hibernate.cache.HashtableCacheProvider
            </prop>
            <prop key="hibernate.connection.useUnicode">true</prop>
            <prop key="hibernate.connection.characterEncoding">UTF-8</prop>
        </props>
    </property>

    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
</bean>

<!-- Spring Data Access Exception Translator Definition -->
<bean id="jdbcExceptionTranslator"
    class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
</bean>

<!-- Hibernate Template Definition -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory">
        <ref bean="sessionFactory" />
    </property>
    <property name="jdbcExceptionTranslator">
        <ref bean="jdbcExceptionTranslator" />
    </property>
</bean>

<!--
    ========================= Start of SERVICE DEFINITIONS
    =========================
-->

<!-- Hibernate Transaction Manager Definition -->
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref local="sessionFactory" />
    </property>
</bean>

<!-- AddressBook Service Definition -->
<bean id="loginServiceTarget" class="com.smartcall.service.impl.LoginServiceImpl">
    <property name="loginDAO">
        <ref local="loginDAO" />
    </property>
</bean>

<!-- Login DAO Definition: Hibernate implementation -->
<bean id="loginDAO"
    class="com.smartcall.dao.hibernate.HibernateLoginDAO">
    <property name="hibernateTemplate">
        <ref bean="hibernateTemplate" />
    </property>
</bean>

<!-- Transactional proxy for the AddressBook Service -->
<bean id="loginService"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
        <ref local="transactionManager" />
    </property>
    <property name="target">
        <ref local="loginServiceTarget" />
    </property>
    <property name="transactionAttributes">
        <props>
            <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="save*">PROPAGATION_REQUIRED</prop>
            <prop key="update*">PROPAGATION_REQUIRED</prop>
            <prop key="delete*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>

context.refresh ()는 내가 생각한 전체 applicationContext 빈을 새로 고칩니다. 이제는 위임자와 서비스를 제거하고 애플리케이션에서 곧바로 호출합니다.

지금 DBSettingsDelegate를 사용하지 않습니다.

최신 정보

속성 파일 코드 업데이트

Properties properties = new Properties();
    String a = Thread.currentThread()
                .getContextClassLoader()
                .getResource("/com/smartcall/bundle/database.properties").getFile();

    a = a.replaceAll("%20", " ");
    String url = "";

        url = "jdbc:mysql://"+theServerName+":3306/"+theDatabaseName+"?characterEncoding=UTF-8";
        File file = new File(a);
        //file.setWritable(true);

        System.out.println(url);
        System.out.println(file.getAbsolutePath());

        FileInputStream stream = new FileInputStream(file);
        properties.load(stream);

        properties.put("jdbc.username", theUserName);
        properties.put("jdbc.password", thePassword);
        properties.put("jdbc.url", url);            

        properties.store(new FileOutputStream(file),null);  

해결법

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

    1.propertiesie 파일에 기록 된 변경 사항을 반영하려면 Application 컨텍스트를 새로 고치고 DriverManagerDataSource Bean을 다시 가져와야합니다.

    propertiesie 파일에 기록 된 변경 사항을 반영하려면 Application 컨텍스트를 새로 고치고 DriverManagerDataSource Bean을 다시 가져와야합니다.

    context.refresh();
    DriverManagerDataSource databaseSource = (DriverManagerDataSource)context.getBean("dataSource");
    databaseSource.getUsername();
    

    리소스의 File 객체를 가져 오기위한 팁 :

        URI a = getClass().getResource("/com/smartcall/bundle/database.properties").toURI();
        File file = new File(a);
    

    경로를 디코딩 할 필요는 없습니다. % 20을 ""로 바꿉니다. 참고

  2. ==============================

    2.값은 응용 프로그램이 시작될 때 읽히고 대상 오브젝트 (사용자의 경우 데이터 소스)로 설정되며 특성 파일은 더 이상 읽혀지지 않습니다. 따라서 값을 변경하더라도 아무 데나 반영되지 않습니다.

    값은 응용 프로그램이 시작될 때 읽히고 대상 오브젝트 (사용자의 경우 데이터 소스)로 설정되며 특성 파일은 더 이상 읽혀지지 않습니다. 따라서 값을 변경하더라도 아무 데나 반영되지 않습니다.

    값을 다시로드하려면 PropertyPlaceholderConfigurer가이를 확장해야하고 다시로드 기간을 지정해야합니다. 하지만 여전히 데이터 소스를 업데이트하지는 않습니다. 또한 지정된 간격 후에 데이터 소스 클래스를 확장하고 속성을 다시 읽어야합니다. 또는 DataSource를 범위 프로토 타입으로 선언 할 수 있으므로 새 인스턴스를 얻을 수 있으며 각 시간마다 속성을 다시로드 할 수 있습니다.

    이것은 전체 컨텍스트를 다시 시작하지 않으려는 경우입니다 (많은 시간이 소요될 수 있음)

  3. from https://stackoverflow.com/questions/4530193/update-database-settings-in-properties-file-in-spring by cc-by-sa and MIT license