2015-10-19 80 views
1

我試圖創建一個實用程序類來管理跨連接到同一個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已被創建和配置)?

回答

1

在Spring中,你可以使用注入依賴:

  1. 構造
  2. setter方法

因此,而不是注入價值的領域,你應該使用注入該值構造函數。簡單的代碼可能是這樣的:

@Inject 
public LdapConnectionFactory(Environment env) { 
    //rest your code 
} 

但是,如果你不想使用構造函數注入值,你可以使用@PostConstruct方法。

@PostConstruct 
public void init() { 
    //rest your code from constructor 
} 
+0

這可能工作...在應用程序的其他地方,我們在現場注入而不是構造函數。爲了一致性,您是否知道在構造函數中使用該字段時(或者說我們不能)維護字段注入風格的方法? – shawmanz32na

+1

因爲在Spring向field注入值之前,必須創建該對象。所以Spring首先使用構造函數創建對象,然後向該字段注入值。 –

相關問題