高仿真的类-BeanDefinitionReader
生活随笔
收集整理的這篇文章主要介紹了
高仿真的类-BeanDefinitionReader
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
public class V1BeanDefinitionReader {private List<String> registyBeanClasses = new ArrayList<String>();private Properties config = new Properties();//固定配置文件中的key,相對于xml的規范private final String SCAN_PACKAGE = "scanPackage";public V1BeanDefinitionReader(String... locations){//通過URL定位找到其所對應的文件,然后轉換為文件流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(SCAN_PACKAGE));}private void doScanner(String scanPackage) {//轉換為文件路徑,實際上就是把.替換為/就OK了URL url = this.getClass().getClassLoader().getResource("/" + scanPackage.replaceAll("\\.","/"));File classPath = new File(url.getFile());for (File file : classPath.listFiles()) {if(file.isDirectory()){doScanner(scanPackage + "." + file.getName());}else{if(!file.getName().endsWith(".class")){ continue;}String className = (scanPackage + "." + file.getName().replace(".class",""));registyBeanClasses.add(className);}}}public Properties getConfig(){return this.config;}//把配置文件中掃描到的所有的配置信息轉換為V1BeanDefinition對象,以便于之后IOC操作方便public List<V1BeanDefinition> loadBeanDefinitions(){List<V1BeanDefinition> result = new ArrayList<V1BeanDefinition>();try {for (String className : registyBeanClasses) {Class<?> beanClass = Class.forName(className);//如果是一個接口,是不能實例化的//用它實現類來實例化if(beanClass.isInterface()) { continue; }//beanName有三種情況://1、默認是類名首字母小寫//2、自定義名字//3、接口注入result.add(doCreateBeanDefinition(toLowerFirstCase(beanClass.getSimpleName()),beanClass.getName()));Class<?> [] interfaces = beanClass.getInterfaces();for (Class<?> i : interfaces) {//如果是多個實現類,只能覆蓋//為什么?因為Spring沒那么智能,就是這么傻//這個時候,可以自定義名字result.add(doCreateBeanDefinition(i.getName(),beanClass.getName()));}}}catch (Exception e){e.printStackTrace();}return result;}//把每一個配信息解析成一個BeanDefinitionprivate V1BeanDefinition doCreateBeanDefinition(String factoryBeanName,String beanClassName){V1BeanDefinition beanDefinition = new V1BeanDefinition();beanDefinition.setBeanClassName(beanClassName);beanDefinition.setFactoryBeanName(factoryBeanName);return beanDefinition;}//如果類名本身是小寫字母,確實會出問題//但是我要說明的是:這個方法是我自己用,private的//傳值也是自己傳,類也都遵循了駝峰命名法//默認傳入的值,存在首字母小寫的情況,也不可能出現非字母的情況//為了簡化程序邏輯,就不做其他判斷了,大家了解就OK//其實用寫注釋的時間都能夠把邏輯寫完了private String toLowerFirstCase(String simpleName) {char [] chars = simpleName.toCharArray();//之所以加,是因為大小寫字母的ASCII碼相差32,// 而且大寫字母的ASCII碼要小于小寫字母的ASCII碼//在Java中,對char做算學運算,實際上就是對ASCII碼做算學運算chars[0] += 32;return String.valueOf(chars);}
}
?
總結
以上是生活随笔為你收集整理的高仿真的类-BeanDefinitionReader的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高仿真的类-ApplicationCon
- 下一篇: 高仿真的类-ApplicationCon