Spring在xml中声明组件

时间:2014-11-03 10:08:28

标签: java mysql xml spring-mvc datasource

我在项目中主要使用@Autowired@Component注释。但是,我将使用DataSource类进行数据库操作。

所以,我在 dispatcher-servlet.xml 中使用它:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/market"/>
    <property name="username" value="root"/>
    <property name="password" value=""/>
</bean>

在我的dao课程中,dataSource的我的二传手是:

@Autowired
private DataSource dataSource;

public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
    this.jdbcTemplateObject = new JdbcTemplate(dataSource);

}

然而,这不是诀窍。我的jdbcTemplateObjectnull

如果我不使用“context:component scan ...”并使用经典的spring bean而不使用@Autowired注释,那么一切都很好。

我可以使用我的数据库。但是,我不想在我的xml文件中逐个声明所有bean。随着项目的发展,它并不实用。我怎么解决这个问题 ?是否可以在我的dataSource中声明dispatcher-servlet.xml作为组件,因此@Autowired适用于dataSource?

2 个答案:

答案 0 :(得分:2)

当您在字段@Autowired上使用Spring时,会查找dependencies并将其注入其中,如果此处设置了setter方法则没有任何意义。

您无需担心spring会如何注入依赖项。它将照顾完整的生命周期。

有关Spring's Dependecy Injection的更多信息,请访问this链接。

答案 1 :(得分:0)

您已使用@Autowired注释该字段,该字段告诉spring将依赖项直接注入字段。如果你真的想使用setter用@Autowired而不是字段注释setter。

@Autowired
public void setDataSource(DataSource ds) { ... }

但是我强烈建议不要为每个需要一个的bean创建一个JdbcTemplate(创建起来非常繁重)。 JdbcTemplate一旦构造就是一个线程安全的对象。因此,不是为每个需要一个bean的bean创建一个新的(在setDataSource方法中),而只需创建一个JdbcTemplate并注入它。

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>

然后在你的道歉。

@Autowired
private JdbcTemplate jdbcTemplate;

或者我喜欢做什么..

private final JdbcTemplate jdbcTemplate;

@Autowired
public YourRepository(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate=jdbcTemplate;
}

这种方式你不能构造一个非法的对象,而你可以使用基于setter的注入。同时保留为测试目的注入一个的可能性。

另一方面,DriverManagerDataSource非常适合测试,但不适合生产使用,因为它使用真实的连接池,如HikariCPTomcat JDBC