使用Spring注入运行时值?

Jay*_*Jay 4 java spring

我正在为示例Web应用程序尝试spring-security.在声明LDAPAuthenticationProvider时,我注意到您必须在applicationContext.xml文件中声明所有设置!

作为一个春天新手,我明白必须在applicationContext文件中声明dependecies.但是,在典型的企业方案中,您可以让管理员配置您的ldap设置.因此,您需要将数据库中的ldap服务器相关信息加载到应用程序中,然后连接到配置的服务器.如果是这种情况,我如何在Spring中处理这个问题?

Boz*_*zho 7

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

ldapUsername=value1
ldapPassword=value2
Run Code Online (Sandbox Code Playgroud)

并在一开始你applicationContext.xml提出以下内容:

<context:property-placeholder location="classpath:application.properties" />
Run Code Online (Sandbox Code Playgroud)

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

<bean id="someId" class="...">
   <property name="ldapUsername" value="${ldapUsername}" />
   <property name="ldapPassword" value="${ldapPassword}" /> 
</bean>
Run Code Online (Sandbox Code Playgroud)

因此,您的管理员将在简单文件中配置属性,application.properties而无需查看复杂applicationContext.xml

如果您希望从属性文件的不同来源获取它们,则可以扩展spring PropertyPlaceholderConfigurer并提供从DB获取属性的功能.

对类似于您的问题的答案显示了如何实现这样的问题的示例.

更新以便在运行时注入您的值,您必须将bean定义为范围prototype.否则,一旦实例化(与初始设置),您的bean将永远不会更改.然而,对于这种简单的效果来说这是一个很大的变化.这就是为什么我建议如下:

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

  2. 按下按钮更新设置/从数据库重新加载设置并在singletonbean中设置它们.

由于您使用的是spring-mvc,因此您只需将bean注入弹簧控制器并更新设置即可.喜欢:

public class MyController {
    @Autowired
    private LDAPAuthenticationProvider ldapProvider;

    public void saveSettings(..) {
         // get the new username and password first
         ldapProvider.setUsername(newUsername);
         ldapProvider.setPassword(newPassword);
    }
}
Run Code Online (Sandbox Code Playgroud)

(如果您不想使用注释,只需<property name="ldapProvider" ref="ldapProvider" />在控制器定义中使用)

LDAPAuthenticationProvider似乎并不具备setUsernamesetPassword,于是找到究竟是设置凭据.