package cn.nosum.framework.beans.support; import cn.nosum.framework.beans.BeanDefinition; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Properties; public class BeanDefinitionReader { private List registryBeanClasses=new ArrayList(); private Properties config=new Properties(); public BeanDefinitionReader(String... locations){ InputStream is=this.getClass().getClassLoader().getResourceAsStream(locations[0].replace("classpath:","")); try { config.load(is); } catch (IOException e) { e.printStackTrace(); }finally { if (null!=is){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } doScanner(config.getProperty("scanPackage")); } /** * 扫描 */ private void doScanner(String scanPackage){ URL url=this.getClass().getClassLoader().getResource("/"+scanPackage.replaceAll("\\.","/")); if (url == null){ return; } File classPath=new File(url.getFile()); File[] files = classPath.listFiles(); if (files == null){return;} for (File file : files) { if (file.isDirectory()){ doScanner(scanPackage+"."+file.getName()); }else{ if (file.getName().endsWith(".class")){ String className=scanPackage+"."+file.getName().replace(".class",""); registryBeanClasses.add(className); } } } } /** * 将扫描到的所有配置信息转换为 BeanDefinition 对象,以便于 IOC 操作 */ public List loadBeanDefinitions(){ List result=new ArrayList(); try { for (String className : registryBeanClasses) { Class beanClass=Class.forName(className); // 如果是一个接口,则使用实现类 if (beanClass.isInterface()){continue;} result.add(doCreateBeanDefinition(toLowerFirstCase(beanClass.getSimpleName()),beanClass.getName())); // 如果有多个实现类 Class[] interfaces=beanClass.getInterfaces(); for (Class i : interfaces) { result.add(doCreateBeanDefinition(toLowerFirstCase(i.getName()),beanClass.getName())); } } }catch (Exception e){e.printStackTrace();} return result; } public BeanDefinition doCreateBeanDefinition(String factoryBeanName,String beanClassName){ BeanDefinition beanDefinition=new BeanDefinition(); beanDefinition.setBeanClassName(beanClassName); beanDefinition.setFactoryBeanName(factoryBeanName); return beanDefinition; } public String toLowerFirstCase(String simpleName){ char[] chars=simpleName.toCharArray(); chars[0]+=32; return String.valueOf(chars); } public List getRegistryBeanClasses() { return registryBeanClasses; } public void setRegistryBeanClasses(List registryBeanClasses) { this.registryBeanClasses = registryBeanClasses; } public Properties getConfig() { return config; } public void setConfig(Properties config) { this.config = config; } }