我尝试创建一个实用程序类来管理连接到同一LDAP实例的多个Spring @Service
之间的某些LDAP连接。 LDAP部分对于此示例并不重要,但应该有助于后台。因为这是一个实用程序类,所以我希望Spring能够自动实例化该类,并让类立即使用应用程序配置的属性进行自我配置。然后,只要我需要使用该类,我就可以简单地调用getConnection()
方法并接收完全配置的,随时可用的连接。
我已将应用程序配置为能够使用org.springframework.core.env.Environment
的注入实例来检索应用程序的属性,该属性在其他@Service
类中成功运行,但它们从未被引用在@Service
的构造函数中。
util类目前看起来像:
@Component
public class LdapConnectionFactory {
@Inject
private Environment env;
private LdapConnectionPool connectionPool;
public LdapConnectionFactory() {
// TODO Support empty/bad configurations
LdapConnectionConfig ldapConnectionConfig = new LdapConnectionConfig();
ldapConnectionConfig.setLdapHost(env.getProperty("ldap.hostname"));
ldapConnectionConfig.setLdapPort(env.getProperty("ldap.port", int.class));
ldapConnectionConfig.setUseTls(true);
ldapConnectionConfig.setName(env.getProperty("ldap.managerDn"));
ldapConnectionConfig.setCredentials(env.getProperty("ldap.managerPassword"));
DefaultPoolableLdapConnectionFactory poolableConnectionFactory = new DefaultPoolableLdapConnectionFactory(ldapConnectionConfig);
connectionPool = new LdapConnectionPool(poolableConnectionFactory);
}
/**
* Gives a LdapConnection fetched from the pool.
*
* @return an LdapConnection object from pool
* @throws Exception if an error occurs while obtaining a connection from the factory
*/
public LdapConnection getConnection() throws LdapException {
return connectionPool.getConnection();
}
}
运行时,Spring初始化失败b / c env
在类的构造函数中保持为null,env.getProperty()
调用随后抛出NullPointerException
。我如何编写这个类,以便我可以确保应用程序的属性在实例化时(或之后立即)正确注入,这样我可以确定当我尝试使用该类时,已创建并配置了connectionPool
变量)?
答案 0 :(得分:2)
在Spring中,您可以使用以下方法注入依赖项:
因此,您应该使用构造函数注入此值,而不是向字段注入值。简单的代码可能如下所示:
@Inject
public LdapConnectionFactory(Environment env) {
//rest your code
}
但如果您不想使用构造函数注入值,则可以使用@PostConstruct
方法。
@PostConstruct
public void init() {
//rest your code from constructor
}