让我看一下如下所示的课程:
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>
答案 0 :(得分:1)
JndiObjectFactoryBean
是org.springframework.beans.factory.FactoryBean
类型的bean。此bean用作要公开的对象的工厂。以下是FactoryBean
;
由BeanFactory中使用的对象实现的接口,这些对象本身就是单个对象的工厂。如果bean实现了这个接口,它将被用作公开的对象的工厂,而不是直接作为将自己公开的bean实例。
注意:实现此接口的bean不能用作普通bean。 FactoryBean是以bean样式定义的,但为bean引用公开的对象(getObject())始终是它创建的对象。
FactoryBeans可以支持单例和原型,可以根据需要懒散地创建对象,也可以在启动时急切地创建对象。 SmartFactoryBean接口允许公开更细粒度的行为元数据。
因此,当spring框架将数据源自动装配到useDaoImpl时,它会检查dataSource是否是FactoryBean
类型的bean,在这种情况下它是getObject()
方法{{1}到dataSource。如果您想了解这一点,请查看在这种情况下执行自动装配的JndiObjectFactoryBean
和ClassPathXmlApplicationContext.finishBeanfactoryInitialization(..)
方法。
答案 1 :(得分:0)
我不知道它是如何完成的,但Spring Frameworks知道bean是DataSource
bean的工厂,然后它可以将已发现的数据源注入到其他bean中。
我想知道它是如何完成的,那么你可以查看Spring Framework Github中的源代码