代码之家  ›  专栏  ›  技术社区  ›  Jay

使用Spring的运行时价值注入?

  •  4
  • Jay  · 技术社区  · 15 年前

    作为一名spring新手,我确实理解必须在applicationContext文件中声明dependecies。但是,在典型的企业场景中,您需要管理员来配置ldap设置。因此,您需要将ldap服务器相关信息从数据库加载到应用程序中,然后连接到配置的服务器。如果是这样的话,我在春天该如何处理呢?

    1 回复  |  直到 15 年前
        1
  •  7
  •   Bozho    15 年前

    您可以在外部属性文件中使用以下形式的属性:

    ldapUsername=value1
    ldapPassword=value2
    

    在你开始的时候 applicationContext.xml

    <context:property-placeholder location="classpath:application.properties" />
    

    然后您可以按以下方式使用它们:

    <bean id="someId" class="...">
       <property name="ldapUsername" value="${ldapUsername}" />
       <property name="ldapPassword" value="${ldapPassword}" /> 
    </bean>
    

    因此,管理员将在简单文件中配置属性 application.properties 不需要看复杂的东西 applicationContext.xml

    如果希望从不同于属性文件的源获取它们,可以扩展spring的 PropertyPlaceholderConfigurer 并提供从数据库获取属性的功能。

    This answer 对于一个类似于您的问题,我们展示了一个如何实现此类功能的示例。

    为了在运行时注入值,必须将bean定义为作用域 prototype

    1. 创建一个(受密码保护的)用户界面,管理员可以在其中填写其设置(或至少按下“我更改了设置”按钮)

    2. 按下按钮后,更新设置/从数据库中重新加载设置,并在数据库中进行设置 singleton 豆子。

    因为您使用的是SpringMVC,所以只需将bean注入spring控制器并更新设置即可。比如:

    public class MyController {
        @Autowired
        private LDAPAuthenticationProvider ldapProvider;
    
        public void saveSettings(..) {
             // get the new username and password first
             ldapProvider.setUsername(newUsername);
             ldapProvider.setPassword(newPassword);
        }
    }
    

    <property name="ldapProvider" ref="ldapProvider" /> 在控制器定义中)

    LDAPAuthenticationProvider 似乎没有 setUsername setPassword ,因此,请查找凭据设置的准确程度。