徒手撸框架系列-准备篇

@@徒手撸框架

事前一发唠叨

  • 欢迎大家来到我的博客,这里是徒手撸框架系列
    怎么说呢,其实我对文本的东西都不敢兴趣,不过,现实所迫,为了生存,各种尝试嘛。因为人总是在压力中才能感觉到动力。就像我的框架架构开发史一样,其实,我刚开始不写注释的,到了后面需要用maven上传到Sonatype,等我把各种环境准备好以后,诶,发现没有注释或则注释不规范,就不能生成javadoc。现在又回头苦逼的改注释。
    不过呢,改注释也不是完全的坏事,因为之前的代码因为经验原因,留了很多坑,很多代码也不规范,现在正好回头改改

为什么写框架

  • 写框架,其实我是认真的,从2016年开始,我就有了写框架的想法。写框架可以压迫你去学习很多东西,也可以让你能把学到的东西应用到具体的地方,同时,框架开发和项目开发完全不同,需要考虑的东西往往会比普通开发考虑得多的多,因为框架是通用架构和工具以及流程的抽象。
    举个几个例子🌰😁
  1. 反射的使用:正常开发中,往往别人会告诉你,最好不要在项目中使用反射?为甚么呢,因为反射可以越过java的访问权限机制,有了反射,你可以在java里为所欲为,但是如果没有控制好权限和逻辑,那么将是可怕的事情。比如说:
package utils;

import java.lang.reflect.Field;

/**
* 反射案例
* @author yanan
*/
public class ReflectTest {
   private String operateStr;
   private ReflectTest() {
   	
   }
   @Override
   public String toString() {
   	return "ReflectTest [operateStr=" + operateStr + "]";
   }
   public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException {
   	//获取反射类
   	Class<?> clazz = ReflectTest.class;
   	//获取实例
   	Object instance = clazz.newInstance();
   	//获取要操作的属性
   	Field operateField = clazz.getDeclaredField("operateStr");
   	//如果是public修饰,可以不用这个步骤
   	//这个代码的作用是却表属性可以访问
   	operateField.setAccessible(true);
   	//设置属性的值
   	operateField.set(instance, "反射注入");
   	System.out.println(instance);
   }
}

我们来看看打印的内容

ReflectTest [operateStr=反射注入]

为什么要这么复杂的操作来实现一个简单属性赋值,这个在后面说,而且,这不过是反射工具的冰山一jio😄
2. 路径工具:在框架的开发中,需要掌握比较熟练的路径,比如说:类路径:[classpath:/mvc.jdb],这是一个简单的类路径,一般指主类路径,就是你的项目所在类路径。然鹅你以为这是系统提供给我们的吗,想都别想,这是我们自己扩展的(参考了spring取名),你可以扩展各种各样的文件路径,比如说[nacos:group_id/data_id],在nacos配置中心时表示nacos配置资源的路径,[http://baidu.com/index.html]标示未http资源的路径,等等,不全部列出来了
3. 工具封装:不只是框架开发才会用到,正常开发也会经常封装工具,然鹅,框架开发中的封装和正常开发也是完全不同的,比如资源,我们平常大多数开发读取一个文件就像这样

public static String readFileAsText(File file) throws IOException {
		StringBuffer readBuffer = new StringBuffer();
		FileInputStream inputStream = null;
		Reader reader = null;
		try {
			inputStream = new FileInputStream(file);
			reader = new InputStreamReader(inputStream);
			char[] charTemp = new char[1024];
			int len;
			while ((len = reader.read(charTemp)) != -1) {
				readBuffer.append(charTemp,0,len);
			}
			return readBuffer.toString();
		} finally {
			if(inputStream != null)
				inputStream.close();
			if(reader != null)
				reader.close();
		}
	}

嗯,这段代码近乎完美🤩,然鹅,框架中,你会发现,File这个东西很少用到,这次我读了文件用这个玩意,下次我读的是jar包中的资源呢,网络资源呢
4. 对性能的掌控:框架和普通开发有一个最大的区别,因为普通框架基本建立在框架之上,所以如果框架层处对资源造成了大量浪费,比如本来只需要o1的时间,或则只需要o1的空间,以及内存,io的掌控
4. 不一一例句了,因为太多了

好了,接下我要掏出个大宝贝

plugin架构

在本系列文章中,我将会列出以下目录

  • 基础篇-工具封装
    • 反射篇
      1. 反射工具ReflectUtil
      2. 资源缓存ClassHelper
      3. 参数工具ParameterUtil
    • 加载器
      1. 自定义加载器AppClassLoader
    • 字符篇
      1. 一个简单的字符操作工具StringUtil
      2. 一个提供提供Ant资源匹配的工具PathMatcher
    • 资源篇
      1. 抽象资源Resource和两个基本实现(FileResource、ClassPathResource)
      2. 资源扫描工具PackageScanner和ResourceScanner
      3. 抽象资源加载器ResourceLoader和两个简单的资源加载器
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页