我試圖創建一個實用程序類來管理跨連接到同一個LDAP實例的多個Spring @Service
的某些LDAP連接。 LDAP部分對於這個例子並不重要,但應該有助於背景。因爲這是一個實用程序類,所以我希望該類能夠被Spring自動實例化,並且該類可以立即使用應用程序的配置屬性進行自我配置。然後,只要我需要使用該課程,我就可以簡單地調用getConnection()
方法並接收完全配置的,隨時可用的連接。如何在@Component構造函數中使用@Inject ed Spring Environment
我必須配置爲能夠使用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();
}
}
運行時,春節初始化失敗B/C env
保持在類的構造函數爲空,而env.getProperty()
電話隨後拋出NullPointerException
秒。我怎樣才能編寫這個類,以便我可以確定應用程序的屬性在實例化時(或之後立即被正確注入),以便我可以確定在嘗試使用該類時,變量connectionPool
已被創建和配置)?
這可能工作...在應用程序的其他地方,我們在現場注入而不是構造函數。爲了一致性,您是否知道在構造函數中使用該字段時(或者說我們不能)維護字段注入風格的方法? – shawmanz32na
因爲在Spring向field注入值之前,必須創建該對象。所以Spring首先使用構造函數創建對象,然後向該字段注入值。 –