您的位置:首页 > 移动开发 > Objective-C

JndiObjectFactoryBean渊源

2010-08-18 16:36 417 查看
接下来看看JNDI版的DataSource - org.springframework.jndi.JndiObjectFactoryBean public class JndiObjectFactoryBean extends JndiObjectLocato r implements FactoryBean 追溯JndiObjectFactoryBean的父类和实现的接口以及父类的父类,都和javax.sql.DataSource接口八竿子打不着,没有一点点渊源,oh,my God! 这怎么可能!?完全不相干的对象怎么能够被注入?这完全有悖java的精神!但事实摆在眼前,测试是完全通过的!静下心来,我注意到了JndiObjectFactoryBean实现了FactoryBean接口,一直以来脑子里对FactoryBean模式感到有点模糊,不能完全领会其本质,难道真的是这里面有文章??好,借此机会,好好研究下FactoryBean接口,下面是org.springframework.beans.factory.FactoryBean源代码里一段注释: /** * Interface to be implemented by objects used within a BeanFactory * that are themselves factories. If a bean implements this interface, * it is used as a factory, not directly as a bean. * *

NB: A bean that implements this interface cannot be used * as a normal bean. A FactoryBean is defined in a bean style, * but the object exposed for bean references is always the object * that it creates. */ 翻译过来是说:所有实现FactoryBean接口的类都被当作工厂来使用,而不是简单的直接当作bean来使用,FactoryBean实现类里定义了要生产的对象, 点击进入第5段   sp; 分析的相当精彩。 回帖地址 0 0 请登录后投票 看了我不困 回帖地址 0 0 请登录后投票 看来咱层次还没上来 回帖地址 0 0 请登录后投票 有点意思,学习了,lz再接再厉啊。 看来什么都要追根问底啊。 回帖地址 0 0 请登录后投票 提出问题->分析问题->解决问题 lz步步深入,分析的很透彻。向lz学习,不浮于问题表面。 最近对spring的注入一头雾水,还需深入,继续学习ing~~~~ 点击进入第1段   ame="transactionManager"> Oracle9 下面是通过JNDI获得的DataSource的配置,只要将上面的id为"dataSource"的bean换成下面的配置就行了 配置很简单,使用也非常方便,spring毫不挑食,不管是jdbc版的DataSource也好,是JNDI版的也好,它都能接受,那这个兼容性是怎么做到的呢??现在从源代码入手来一探究竟: 1. 先看看jdbc版的DataSource - org.springframework.jdbc.datasource.DriverManagerDataSource public class DriverManagerDataSource extends AbstractDataSource 再看看这个AbstractDataSource: public abstract class AbstractDataSource implements javax.sql.DataSource 哈哈,原来DriverManagerDataSource是javax.sql.DataSource的实现类,那做为bean注入给sessionFactory真是无可厚非 我们再看看它内部的实现细节 return DriverManager.getConnection(url, props); 哈哈,这代码是不是再熟悉也不过啦?原来DriverManagerDataSource实现了javax.sql.DataSource接口,本质是对jdbc连接数据库的简单封装 2. 点击进入第4段   [" + this.defaultObject.getClass().getName() +"] is not of expected type [" + getExpectedType().getName() + "]");}// Locate specified JNDI object.this.jndiObject = lookupWithFallback();}}/** * Return the singleton JNDI object. * 返回JNDI对象(DataSource对象) */public Object getObject() {return this.jndiObject;}public Class getObjectType() {if (this.proxyInterface != null) {return this.proxyInterface;}else if (this.jndiObject != null) {return this.jndiObject.getClass();}else {return getExpectedType();}} 现在揭晓谜底:很简单,对于JndiObjectFactoryBean对象,spring IOC容器启动时确实造了它的对象,只不过这时是工厂本身,spring会自动调用工厂里的afterPropertiesSet()方法去造真正需要的bean,然后调用getObject()和getObjectType()方法返回已造好的对象和类型,再将其准确的注入依赖它的其他bean里面,所以并没有违背java的精神! 有兴趣也可以看看org.springframework.orm.hibernate3.LocalSessionFactoryBean,它也实现了FactoryBean接口,内部实现如出一辙,只不过它担负的重任不是造JNDI object,而是要造SessionFactory对象 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。 推荐链接 &nb 点击进入第7段   并且由FactoryBean实现类来造该对象的实例,看到这里聪明的你大概已经能猜出个八九不离十了吧 我们回过头来看看JndiObjectFactoryBean的实现细节 private Object jndiObject;/** * Look up the JNDI object and store it. * 广义上说是造对象的过程,就本例而言,是通过JNDI获得DataSource对象 */public void afterPropertiesSet() throws IllegalArgumentException, NamingException {super.afterPropertiesSet();if (this.proxyInterface != null) {if (this.defaultObject != null) {throw new IllegalArgumentException("'defaultObject' is not supported in combination with 'proxyInterface'");}// We need a proxy and a JndiObjectTargetSource.this.jndiObject = JndiObjectProxyFactory.createJndiObjectProxy(this);}else {if (!this.lookupOnStartup || !this.cache) {throw new IllegalArgumentException( "Cannot deactivate 'lookupOnStartup' or 'cache' without specifying a 'proxyInterface'");}if (this.defaultObject != null && getExpectedType() != null &&!getExpectedType().isInstance(this.defaultObject)) {throw new IllegalArgumentException("Default object [" + this.defaultObject +"] of type 点击进入第6段   t; com/cuishen/testDao/pojo/Test.hbm.xml org.hibernate.dialect.Oracle9Dialect true <:property id=dataSource class=org.springframework.jdbc.datasource.DriverManagerDataSource oracle.jdbc.OracleDriver jdbc:oracle:thin:@caij-b815c8aab6:1521:cui cuishen cuishen
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: