如何在@Component构造函数

时间:2015-10-19 19:06:49

标签: java spring dependency-injection

我尝试创建一个实用程序类来管理连接到同一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变量)?

1 个答案:

答案 0 :(得分:2)

在Spring中,您可以使用以下方法注入依赖项:

  1. 构造
  2. 字段
  3. setter方法
  4. 因此,您应该使用构造函数注入此值,而不是向字段注入值。简单的代码可能如下所示:

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

    但如果您不想使用构造函数注入值,则可以使用@PostConstruct方法。

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