使用bean的Spring-Core JNDI配置

时间:2017-03-14 14:21:15

标签: 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;
 }

假设在tomcat中正确完成了JNDI配置。

现在,在许多站点中进行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类正在寻找DataSource对象但是我们正在注入JndiObjectFactoryBean对象[它不是DataSource的子类],因为我们甚至没有提到工厂方法转换发生的方式和位置? / p>

2 个答案:

答案 0 :(得分:1)

JndiObjectFactoryBeanorg.springframework.beans.factory.FactoryBean类型的bean。此bean用作要公开的对象的工厂。以下是FactoryBean;

的javadoc的摘录
  

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

     

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

     

FactoryBeans可以支持单例和原型,可以根据需要懒散地创建对象,也可以在启动时急切地创建对象。 SmartFactoryBean接口允许公开更细粒度的行为元数据。

因此,当spring框架将数据源自动装配到useDaoImpl时,它会检查dataSource是否是FactoryBean类型的bean,在这种情况下它是getObject()方法{{1}到dataSource。如果您想了解这一点,请查看在这种情况下执行自动装配的JndiObjectFactoryBeanClassPathXmlApplicationContext.finishBeanfactoryInitialization(..)方法。

答案 1 :(得分:0)

我不知道它是如何完成的,但Spring Frameworks知道bean是DataSource bean的工厂,然后它可以将已发现的数据源注入到其他bean中。

我想知道它是如何完成的,那么你可以查看Spring Framework Github中的源代码