900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 高仿真的类-BeanDefinitionReader

高仿真的类-BeanDefinitionReader

时间:2020-11-30 14:11:03

相关推荐

高仿真的类-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);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。