2014-11-03 55 views
0

我大多在我的项目中使用@Autowired@Component注释。但是,我将使用DataSource类来执行数据库操作。Spring声明xml组件

于是,我用这是我调度-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

如果我不使用“上下文:组件扫描...”并使用古典弹簧豆代替而不使用@Autowired注释,则所有工作都很好。

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

+0

当您使用'@ Autowired'上的字段Spring就会查找依赖关系并注入他们的权利有没有,如果这里setter方法是没有意义的。 – 2014-11-03 10:10:42

+0

春将尽,你并不需要一个二传手。你可以在xml中使用jdbctemplate并自动装载它。 – 2014-11-03 10:12:53

+0

非常感谢。我不知道我不需要二传手。如何在没有二传手的情况下设置它? – 2014-11-03 10:17:38

回答

1

当你在字段上使用@AutowiredSpring会寻找dependencies并在那里注入它们,如果setter方法在这里没有意义。

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

欲了解更多Spring's依赖注射访问this链接。

0

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

@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这样的真实连接池。