【问题标题】:Spring autowire by constructor not working without setter method没有setter方法,构造函数的Spring自动装配不起作用
【发布时间】:2014-03-18 10:50:46
【问题描述】:

这是我的 Spring xml 配置:

    <beans profile="test">
    <context:annotation-config />

    <!-- hsqldbDataSource bean for testing purposes -->
    <bean id="hsqldbDataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="shutdown">
        <constructor-arg>
            <bean class="com.zaxxer.hikari.HikariConfig">
                <constructor-arg>
                    <props>
                        <prop key="dataSource.url">${hsqldb.url}</prop>
                        <prop key="dataSource.user">${user}</prop>
                        <prop key="dataSource.password">${password}</prop>
                    </props>
                </constructor-arg>
                <property name="dataSourceClassName" value="org.hsqldb.jdbc.JDBCDataSource" />
                <property name="connectionTestQuery" value="SELECT 1" />
                <property name="maximumPoolSize" value="5" />
                <property name="minimumPoolSize" value="1" />
            </bean>
        </constructor-arg>
    </bean>

    <!-- execute a script to create tables after creation of bean for in-memory HSQLDB -->
    <jdbc:embedded-database id="hsqldbDataSource" type="HSQL">
        <jdbc:script location="classpath:schema.sql" />
        <jdbc:script location="classpath:test-data.sql"/>
    </jdbc:embedded-database>

    <bean id="daoManager" class="com.d.DAOManager" autowire="constructor">
       <property name="dataSource" ref="hsqldbDataSource"/>
    </bean>
</beans>

还有我的 DAOManager 类:

public class DAOManager {

private DataSource dataSource;
private Connection connection;

@Autowired
public DAOManager(DataSource dataSource) {
    this.dataSource = dataSource;
}

public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}

在这里我调用了获取我的 daoManager bean。

public static DAOManager createHSQLDBDAOManager() {
    LOG.info("Setting up datasource to in-memory HSQLDB");
    ConfigurableEnvironment env = (ConfigurableEnvironment)applicationContext.getEnvironment();
    env.setActiveProfiles("test");
    applicationContext.load("classpath:/applicationContext.xml");
    applicationContext.refresh();
    DAOManager daoManager = applicationContext.getBean("daoManager", DAOManager.class);
    return daoManager;
}

如果我删除了 setter 方法,为什么会抱怨?我不需要它。如果我在构造函数之前删除@Autowired(它也可以),它只是没用并且不使用 by 构造函数 autowire 函数。

【问题讨论】:

    标签: spring autowired constructor-injection


    【解决方案1】:

    需要去掉daoManager bean的属性值

    <bean id="daoManager" class="com.d.DAOManager" autowire="constructor"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 2016-09-04
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多