ソース斜め読み #0 自動登録関連
自動登録関連のクラス階層は次の通り。
IAutoRegister + AbstractAutoRegister + ComponentAutoRegister + FileSystemAutoRegister + JarAutoRegister
で、ファクトリークラスがAutoRegisterFactory
(略) public class AutoRegisterFactory { private static HashMap autoRegisters = new HashMap(); static { autoRegisters.put( "org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister", new FileSystemAutoRegister()); autoRegisters.put( "org.seasar.framework.container.autoregister.JarComponentAutoRegister", new JarAutoRegister()); autoRegisters.put( "org.seasar.framework.container.autoregister.ComponentAutoRegister", new ComponentAutoRegister()); } (略) public static boolean isAutoRegister(String className){ return autoRegisters.containsKey(className); } (略) public static IAutoRegister getAutoRegister(String className, FuzzyXMLElement element){ IAutoRegister register = (IAutoRegister)autoRegisters.get(className); register.init(element); return register; } }
diconファイルをパースしているDiconParserのparseメソッドで、自動登録関連のタグがきた場合にファクトリーを使う。
public void parse(IFile file) throws Exception { (略) for(int i=0;i<nodes.length;i++){ if(nodes[i] instanceof FuzzyXMLElement){ FuzzyXMLElement element = (FuzzyXMLElement)nodes[i]; // include要素 if(element.getName().equals("include")){ (略) // component要素 } else if(element.getName().equals("component")){ String className = Util.getXPathValue(element,"@class"); if(AutoRegisterFactory.isAutoRegister(className)){ handleAutoRegister(className, element); } else if(namespace!=null && namespace.equals("jsf")){ if(className.equals("org.seasar.jsf.runtime.JsfConfigImpl")){ handleJsfConfigImpl(element); } else if(className.equals("org.seasar.jsf.runtime.TagProcessorTreeFactoryImpl")){ handleTagProcessorTreeFactoryImpl(element); } } else { handleComponent(element); } } } } }
handleAutoRegisterメソッドで、classNameに対応するAutoRegisterをつくって、コンポーネントを登録している。
コンポーネントはregisterAll→register→processClass経由でAbstractAutoRegisterクラスのmanagedBeansフィールドにaddしている。
private void handleAutoRegister(String className, FuzzyXMLElement element){ IAutoRegister register = AutoRegisterFactory.getAutoRegister(className, element); register.setProject(project); register.registerAll(); ManagedBean[] beans = register.getRegisteredBeans(); for(int i=0;i<beans.length;i++){ managedBeans.add(beans[i]); } }