BeanDefinitionReader.java 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package cn.nosum.framework.beans.support;
  2. import cn.nosum.framework.beans.BeanDefinition;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.net.URL;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import java.util.Properties;
  10. public class BeanDefinitionReader {
  11. private List<String> registryBeanClasses=new ArrayList<String>();
  12. private Properties config=new Properties();
  13. public BeanDefinitionReader(String... locations){
  14. InputStream is=this.getClass().getClassLoader().getResourceAsStream(locations[0].replace("classpath:",""));
  15. try {
  16. config.load(is);
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }finally {
  20. if (null!=is){
  21. try { is.close(); } catch (IOException e) { e.printStackTrace(); }
  22. }
  23. }
  24. doScanner(config.getProperty("scanPackage"));
  25. }
  26. /**
  27. * 扫描
  28. */
  29. private void doScanner(String scanPackage){
  30. URL url=this.getClass().getClassLoader().getResource("/"+scanPackage.replaceAll("\\.","/"));
  31. if (url == null){ return; }
  32. File classPath=new File(url.getFile());
  33. File[] files = classPath.listFiles();
  34. if (files == null){return;}
  35. for (File file : files) {
  36. if (file.isDirectory()){
  37. doScanner(scanPackage+"."+file.getName());
  38. }else{
  39. if (file.getName().endsWith(".class")){
  40. String className=scanPackage+"."+file.getName().replace(".class","");
  41. registryBeanClasses.add(className);
  42. }
  43. }
  44. }
  45. }
  46. /**
  47. * 将扫描到的所有配置信息转换为 BeanDefinition 对象,以便于 IOC 操作
  48. */
  49. public List<BeanDefinition> loadBeanDefinitions(){
  50. List<BeanDefinition> result=new ArrayList<BeanDefinition>();
  51. try {
  52. for (String className : registryBeanClasses) {
  53. Class<?> beanClass=Class.forName(className);
  54. // 如果是一个接口,则使用实现类
  55. if (beanClass.isInterface()){continue;}
  56. result.add(doCreateBeanDefinition(toLowerFirstCase(beanClass.getSimpleName()),beanClass.getName()));
  57. // 如果有多个实现类
  58. Class<?>[] interfaces=beanClass.getInterfaces();
  59. for (Class<?> i : interfaces) {
  60. result.add(doCreateBeanDefinition(toLowerFirstCase(i.getName()),beanClass.getName()));
  61. }
  62. }
  63. }catch (Exception e){e.printStackTrace();}
  64. return result;
  65. }
  66. public BeanDefinition doCreateBeanDefinition(String factoryBeanName,String beanClassName){
  67. BeanDefinition beanDefinition=new BeanDefinition();
  68. beanDefinition.setBeanClassName(beanClassName);
  69. beanDefinition.setFactoryBeanName(factoryBeanName);
  70. return beanDefinition;
  71. }
  72. public String toLowerFirstCase(String simpleName){
  73. char[] chars=simpleName.toCharArray();
  74. chars[0]+=32;
  75. return String.valueOf(chars);
  76. }
  77. public List<String> getRegistryBeanClasses() {
  78. return registryBeanClasses;
  79. }
  80. public void setRegistryBeanClasses(List<String> registryBeanClasses) {
  81. this.registryBeanClasses = registryBeanClasses;
  82. }
  83. public Properties getConfig() {
  84. return config;
  85. }
  86. public void setConfig(Properties config) {
  87. this.config = config;
  88. }
  89. }