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()
在这种情况下执行自动连接的方法。谢谢,收到了。