通过注释而不是XML配置Spring LdapTemplate的最佳实践?

对于Spring Boot应用程序,我使用注释成功配置了Spring LdapTemplate ,包括来自application.properties的@ValueLdapContextSource依赖@Value 。 (Woot!我找不到一个例子,所以也许这会帮助别人。)

片段(下面)设置上下文源,将其注入LdapTemplate ,然后将其自动装入我的DirectoryService。

有没有更好/更清晰的方法在Spring Boot应用程序中设置ContextSource

application.properties(在类路径上):

 ldap.url=ldap://server.domain.com:389 ldap.base:OU=Employees,OU=Users,DC=domain,DC=com ldap.username:CN=myuserid,OU=employees,OU=Users,DC=domain,DC=com ldap.password:secretthingy 

MyLdapContextSource.java:

 @Component public class MyLdapContextSource extends LdapContextSource implements ContextSource { @Value("${ldap.url}") @Override public void setUrl(String url) { super.setUrl(url); } @Value("${ldap.base}") @Override public void setBase(String base) {super.setBase(base); } @Value("${ldap.username}") @Override public void setUserDn(String userDn) {super.setUserDn(userDn); } @Value("${ldap.password}") @Override public void setPassword(String password) { super.setPassword(password); } } 

MyLdapTemplate.java:

 @Component public class MyLdapTemplate extends LdapTemplate { @Autowired public MyLdapTemplate(ContextSource contextSource) { super(contextSource); } } 

DirectoryService.java:

 @Service public class DirectoryService { private final LdapTemplate ldapTemplate; @Value("${ldap.base}") private String BASE_DN; @Autowired public DirectoryService(LdapTemplate ldapTemplate) { this.ldapTemplate = ldapTemplate; } public Person lookupPerson(String username) { return (Person) ldapTemplate.lookup("cn=" + username, new PersonAttributesMapper()); } public List searchDirectory(String searchterm) { SearchControls searchControls = new SearchControls(); searchControls.setCountLimit(25); searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); List people = (List) ldapTemplate.search( BASE_DN, "cn=" + searchterm, searchControls, new PersonAttributesMapper()); return people; } } 

为什么所有的子类? 只需使用配置来配置bean。 XML或Java Config。

 @Configuration public class LdapConfiguration { @Autowired Environment env; @Bean public LdapContextSource contextSource () { LdapContextSource contextSource= new LdapContextSource(); contextSource.setUrl(env.getRequiredProperty("ldap.url")); contextSource.setBase(env.getRequiredProperty("ldap.base")); contextSource.setUserDn(env.getRequiredProperty("ldap.user")); contextSource.setPassword(env.getRequiredProperty("ldap.password")); return contextSource; } @Bean public LdapTemplate ldapTemplate() { return new LdapTemplate(contextSource()); } } 

您的DirectoryService可以保持与自动assemblyLdapTemplate相同。

一般的经验法则是,您不希望扩展基础结构bean(如DataSourceLdapTemplate ),而是显式配置它们。 这与您的应用程序bean(服务,存储库等)相反。