Java 带bean的Spring核心JNDI配置

Java 带bean的Spring核心JNDI配置,java,spring,spring-mvc,Java,Spring,Spring Mvc,让我们假设我有一个类,如下所示: public interface UserDAO { public List<User> list(); } public class UserDAOImpl implements UserDAO { private DataSource dataSource; public UserDAOImpl(DataSource dataSource) { this.dataSource = dataSource;

让我们假设我有一个类,如下所示:

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

public class UserDAOImpl implements UserDAO {
    private DataSource dataSource;

    public UserDAOImpl(DataSource dataSource) {
        this.dataSource = dataSource;
 }
公共接口UserDAO{
公共列表();
}
公共类UserDAOImpl实现UserDAO{
私有数据源;
public UserDAOImpl(数据源数据源){
this.dataSource=数据源;
}
让我们假设JNDI配置在tomcat中正确完成

现在,对于许多站点中的SpringBean映射,我发现了以下配置:

<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类正在寻找DataSource对象,但我们正在注入JNDObjectFactoryBean对象[它不是DataSource的子类],因为我们甚至没有提到工厂方法转换是如何进行的或在何处进行的?

我不知道转换是如何进行的,但是Spring框架知道bean是
数据源
bean的工厂,那么它可以将发现的数据源注入到其他bean中


我想知道它是如何完成的,然后您可以查看
JndiObjectFactoryBean
中的源代码,它是
org.springframework.beans.factory.FactoryBean
类型的bean。这些bean被用作对象公开的工厂。下面是
FactoryBean
的javadoc摘录

接口将由BeanFactory中使用的对象实现,这些对象本身是单个对象的工厂。如果bean实现此接口,则它将用作要公开的对象的工厂,而不是直接用作将公开自身的bean实例

注意:实现此接口的bean不能用作普通bean。FactoryBean是以bean样式定义的,但为bean引用公开的对象(getObject())始终是它创建的对象

FactoryBean可以支持单例和原型,可以根据需要延迟创建对象,也可以在启动时快速创建对象。SmartFactoryBean接口允许公开更细粒度的行为元数据


因此,当spring框架将数据源自动连接到useDaoImpl时,它会检查数据源是否是一个类型为
FactoryBean
的bean,在本例中就是这样,因此它将从
getObject()分配对象
jndObjectFactoryBean的方法到数据源。如果您想了解更多,请查看
ClassPathXmlApplicationContext.finishBeanfactoryInitialization(…)
DefaultListableBeanFactory.PreInstanceSingleton()
在这种情况下执行自动连接的方法。

谢谢,收到了。