Reference对象用于描述“如何创建一个对象”的信息,而不是对象本身。它包含了对象的类名、工厂类名(Factory Class Name)、以及一些额外的配置信息(如地址、参数等)。为什么要存在这个类呢?因为有些对象不适合直接序列化存储在JNDI目录中,比如数据库连接池、EJB等。这时可以用Reference来保存“如何创建这个对象”的信息,等到需要时再由JNDI根据Reference的信息去在本地实例化对象。
// Use builder if installed ObjectFactoryBuilderbuilder= getObjectFactoryBuilder(); if (builder != null) { // builder must return non-null factory factory = builder.createObjectFactory(refInfo, environment); return factory.getObjectInstance(refInfo, name, nameCtx, environment); }
// Use reference if possible Referenceref=null; if (refInfo instanceof Reference) { ref = (Reference) refInfo; } elseif (refInfo instanceof Referenceable) { ref = ((Referenceable)(refInfo)).getReference(); }
Object answer;
if (ref != null) { Stringf= ref.getFactoryClassName(); if (f != null) { // if reference identifies a factory, use exclusively
factory = getObjectFactoryFromReference(ref, f); if (factory != null) { return factory.getObjectInstance(ref, name, nameCtx, environment); } // No factory found, so return original refInfo. // Will reach this point if factory class is not in // class path and reference does not contain a URL for it return refInfo;
} else { // if reference has no factory, check for addresses // containing URLs
// Try to use current class loader try { clas = helper.loadClass(factoryName); } catch (ClassNotFoundException e) { // ignore and continue // e.printStackTrace(); } // All other exceptions are passed up.
// Not in class path; try to use codebase String codebase; if (clas == null && (codebase = ref.getFactoryClassLocation()) != null) { try { clas = helper.loadClass(factoryName, codebase); } catch (ClassNotFoundException e) { } }
// use reference if possible Referenceref=null; if (refInfo instanceof Reference) { ref = (Reference) refInfo; } elseif (refInfo instanceof Referenceable) { ref = ((Referenceable)(refInfo)).getReference(); }
Object answer;
if (ref != null) { Stringf= ref.getFactoryClassName(); if (f != null) { // if reference identifies a factory, use exclusively
factory = getObjectFactoryFromReference(ref, f); if (factory instanceof DirObjectFactory) { return ((DirObjectFactory)factory).getObjectInstance( ref, name, nameCtx, environment, attrs); } elseif (factory != null) { return factory.getObjectInstance(ref, name, nameCtx, environment); } // No factory found, so return original refInfo. // Will reach this point if factory class is not in // class path and reference does not contain a URL for it return refInfo;
} else { // if reference has no factory, check for addresses // containing URLs // ignore name & attrs params; not used in URL factory
// Try to use current class loader try { clas = helper.loadClass(factoryName); } catch (ClassNotFoundException e) { // ignore and continue // e.printStackTrace(); } // All other exceptions are passed up.
// Not in class path; try to use codebase String codebase; if (clas == null && (codebase = ref.getFactoryClassLocation()) != null) { try { clas = helper.loadClass(factoryName, codebase); } catch (ClassNotFoundException e) { } }
publicstatic Object getObjectInstance(Object refInfo, Name name, Context nameCtx, Hashtable<?,?> environment, Attributes attrs) throws Exception { ...... if (ref != null) { Stringf= ref.getFactoryClassName(); if (f != null) { // if reference identifies a factory, use exclusively
factory = getObjectFactoryFromReference(ref, f); if (factory instanceof DirObjectFactory) { return ((DirObjectFactory)factory).getObjectInstance( ref, name, nameCtx, environment, attrs); } elseif (factory != null) { return factory.getObjectInstance(ref, name, nameCtx, environment); } // No factory found, so return original refInfo. // Will reach this point if factory class is not in // class path and reference does not contain a URL for it return refInfo; ......
privatefinalLoglog= LogFactory.getLog(BeanFactory.class); // Not static
@Override public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?,?> environment) throws NamingException { ...... for (i = 0; i < pda.length; i++) {