相信任何一个开发者都使用过Spring这个框架,或许你刚开始使用Spring、或许你有看过源码解析系列文章、或许你曾调试过源码、或许你。。。总之不管你的情况如何,你有想过自己实现一个Spring框架么?本篇文章就就来简单描述一下Spring中的IOC、MVC、AOP都是如何实现的
IOC
1. 加载配置
早期的Spring框架关于bean的定义都是配置在xml文件中的,就算是现在有了Service、Controller等注解、有了SpringBoot号称减少大部分配置,但是关于数据库的等相关信息也是存在于配置文件的。所以作为框架来说加载配置文件是必不可少的功能。
2. 类加载器
首先通过上一步我们获取到了xml中定义的bean,以及包扫描的路径,根据获取的这两种配置我们就需要把这些bean实例化出来。怎么去实例化呢,分为两个步骤:
首先根据配置的包扫描路径获取这个包下面的所有类,然后判断类上是否存在Spring的相关注解,如果有的话就把这些类先保存到一个set集合中
将配置文件中定义的bean也添加的步骤一获取的set集合中,这样就得到了所有需要被Spring管理的类了。
3. Bean容器
通过第二步我们已经知道了哪些类需要被Spring来管理,那么现在我们就可以通过反射来把set集合中的类实例化出来,实例化出来的这些类我们统一把它们放到一个全局的静态Map中。
4. 依赖注入
我们知道使用IOC最直观的一个表现就是我们使用的对象不用自己new了,那么这个功能是如何实现的呢?
想想我们现在使用的自动注入,是不是自动注入的变量都会使用@Resource和@Autowired来标示呢。简单来说,在第三步所有的Bean都实例化以后,我们需要遍历所有Map中的实例,通过反射获取实例的所有属性,当有属性上方有刚才提到的两个注解时就去Map中寻找对应的实例来进行赋值。这样当把Map遍历完毕以后依赖注入的功能也就完成了。
AOP
写一个AOP框架需要一个前提,那就是你需要懂代理模式。
MVC
1. MVCBean容器
我们知道@Controller注解是标志着一个类是用于处理MVC请求的,这样的话我们就可以在实现IOC功能实例化类的时候把所有带有@Controller注解的类复制一份放在一个MVCBean容器当中。
2. 建立请求映射关系
仅仅只有一个MVCBean容器是不够的,还有一个@RequestMapping注解也是必须用到的,我们应该把所有带有@RequestMapping注解的方法的请求路径、请求方式、请求参数、实例名、方法名都记录下来。这样当一个请求过来以后根据请求路径、方式和参数定义到实例的方法,然后通过反射来调用这个方法。
3. 返回值处理
我们知道有的方法返回的是一个view而有的方法返回的是json数据,这种情况就得根据方法是是否含有@ResponseBody注解来判断,如果没有此注解就在反射调用方法完毕后通知浏览器跳转到结果路径、如果包含此注解的话就需要序列化json数据写入HttpServletResponse从而输出到浏览器。
收藏转发好看再走呗!