我在项目中主要使用@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);
}
然而,这不是诀窍。我的jdbcTemplateObject
是null
。
如果我不使用“context:component scan ...”并使用经典的spring bean而不使用@Autowired
注释,那么一切都很好。
我可以使用我的数据库。但是,我不想在我的xml文件中逐个声明所有bean。随着项目的发展,它并不实用。我怎么解决这个问题 ?是否可以在我的dataSource
中声明dispatcher-servlet.xml
作为组件,因此@Autowired
适用于dataSource?
答案 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
非常适合测试,但不适合生产使用,因为它使用真实的连接池,如HikariCP或Tomcat JDBC。