BeanDefinitionReader.java 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. // 这里的 name 是接口的包.类
  61. result.add(doCreateBeanDefinition(i.getName(),beanClass.getName()));
  62. }
  63. }
  64. }catch (Exception e){e.printStackTrace();}
  65. return result;
  66. }
  67. public BeanDefinition doCreateBeanDefinition(String factoryBeanName,String beanClassName){
  68. BeanDefinition beanDefinition=new BeanDefinition();
  69. beanDefinition.setBeanClassName(beanClassName);
  70. beanDefinition.setFactoryBeanName(factoryBeanName);
  71. return beanDefinition;
  72. }
  73. public String toLowerFirstCase(String simpleName){
  74. char[] chars=simpleName.toCharArray();
  75. chars[0]+=32;
  76. return String.valueOf(chars);
  77. }
  78. public List<String> getRegistryBeanClasses() {
  79. return registryBeanClasses;
  80. }
  81. public void setRegistryBeanClasses(List<String> registryBeanClasses) {
  82. this.registryBeanClasses = registryBeanClasses;
  83. }
  84. public Properties getConfig() {
  85. return config;
  86. }
  87. public void setConfig(Properties config) {
  88. this.config = config;
  89. }
  90. }