2014-11-03 54 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這樣的真實連接池。