2017-03-14 50 views
3

讓我們如下圖所示拿我有一個類:Spring的核心JNDI配置豆

public interface UserDAO { 
    public List<User> list(); 
} 

public class UserDAOImpl implements UserDAO { 
    private DataSource dataSource; 

    public UserDAOImpl(DataSource dataSource) { 
     this.dataSource = dataSource; 
} 

假設JNDI配置在tomcat的正確。

現在在很多網站的Spring bean映射,我發現了以下配置:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/jdbc/UsersDB"/> 
</bean> 

    <bean id="userDao" class="net.codejava.spring.dao.UserDAOImpl"> 
    <constructor-arg> 
     <ref bean="dataSource" /> 
    </constructor-arg> 
</bean> 

這裏是我的問題,在UserDAOImpl類是尋找數據源對象,但我們注入的JndiObjectFactoryBean對象[這不是一個子類別DataSource],因爲我們甚至沒有提及工廠方法如何或在哪裏進行轉換?

回答

0

我不知道它是如何完成的,但Spring Frameworks知道beans是DataSource beans的工廠,那麼它可以將發現的數據源注入到其他bean中。

我想知道它是怎麼做的,那麼你可以看看源代碼Spring Framework Github

1

JndiObjectFactoryBeanorg.springframework.beans.factory.FactoryBean類型的豆。這個bean被用作一個對象公開的工廠。以下是javadoc對FactoryBean的摘錄;

接口由一個BeanFactory中使用的對象實現,它們本身就是單個對象的工廠。如果一個bean實現了這個接口,它就被用作一個對象公開的工廠,而不是直接作爲一個將被暴露的bean實例。

注意:實現此接口的bean不能用作普通bean。 FactoryBean以bean風格定義,但爲bean引用(getObject())公開的對象始終是它創建的對象

FactoryBeans可以支持單例和原型,並且可以根據需要或在啓動時急切地創建對象。 SmartFactoryBean接口允許公開更多細粒度的行爲元數據。

因此,當彈簧框架自動裝配的數據源到useDaoImpl它檢查數據源是否是FactoryBean類型的豆,它是在這種情況下,所以它會從JndiObjectFactoryBeangetObject()方法則dataSource分配的對象。如果您想了解更多信息,請查看ClassPathXmlApplicationContext.finishBeanfactoryInitialization(..)DefaultListableBeanFactory.preInstantiateSingletons()這種情況下執行自動裝配的方法。

+0

謝謝,明白了。 – vicky