写代码应该是一个由繁到简,然后由简到繁的一个螺旋上升的过程。
都说谈对象是两个人的事情,面向对象编程那也不会是一个对象的事情,而是需要处理一堆对象的依赖关系。
如果一个实例A依赖另一个实例B,最简单的做法就是在定义类Ca的时候给它定义一个类Cb的成员,初始化的时候直接new出来,这样定义Ca的时候就知道A要和B永远在一起了,这就是命中注定;如果在构造函数里面传进来,当创建A的时候就知道A要和B要在一起了,这叫指腹为婚;如果通过set方法来设置的话,这就是在合适的时候遇见合适的你~
那是不是可以在创建对象的时候不去关注如何创建对象以及对象与对象之间的关系?在定义类的时候只关注成员是什么类型就好?
如果不关注创建对象的话,那需要一个工具来负责创建对象,如果不负责成员的实例化,那只能通过工具实现对象的注入了,这个工具可以成为对象的容器,过程大致如下:
1、扫描:知道工程下都有哪些类需要负责,知道哪些属性需要注入(可以通过注解的方式标记);
2、实例化:将类实例化,通过HashMap来管理类与对象的映射关系;
3、依赖注入:根据成员属性,注入对应的实例对象。
实例化对象大概可以是这样:
public static Object newInstance(Class clazz){ Object object = clazz.newInstance(); //try catch }
依赖注入大概可以是这样:
public static void setField(Object object, field field, Object value){ field.setAccessible(true); //try catch field.set(object,value); }
在依赖注入前需要遍历属性,判断属性是否需要注入(主要是逻辑):
if(field.isAnnotationPresent(Inject.class)){ //判断是否标记,Injection是自定义注解 fieldType = field.getType(); //属性类型,据此在对象容器里寻找需要的实例注入 fieldInstance = getFieldInstance(); setField(beanInstance, field, fieldInstance); }
********************************************************************************************************************
附:依赖注入是通过Java的反射机制实现,在Web应用中MVC也是通过Java的反射机制实现的,依赖注入针对的属性,MVC针对的是方法。在传统的Servlet编程里,需要针对每个Get/Post写Servlet,量大、重复,所以可以将Servlet的实现放进框架,应用只需要实现Controller就行,Servlet根据Controller上的路径注解来实现请求转发。步骤大致如下:
1、扫描:知道有哪些Controller类
2、遍历:针对每个Controller类遍历其方法,分析注解
3、映射关系管理:管理请求方法与路径与类和方法的关系
映射关系建立的过程可以是这个样子:
Method[] methods = controllerClass.getDeclaredMethods(); for(method:methods){ method.isAnnotationPresent(Action.class){ Action action = method.getAnnotation(Action.class); String url = action.value(); ...... //分析url,封装成请求方法和路径,将类和方法封装成Handler,使用HashMap管理 } }
框架里的Servlet需要实现请求转发,所有的请求都会进入Servlet,Servlet根据请求的方法和url就可以在映射关系管理容器中找到对应的类和方法,根据在对象管理容器中可以根据类找到对应的实例化对象,然后就交给Controller了,实现了请求转发。
Servlet可以是这个样子:
Handler handler = getHandler(requestMethod, requestPath);//根据映射关系 controllerBean = getBean(handler.getControllerClass());//在对象容器中获得 Method method = handler.getActionMethod(); invokeMethod(controllderBean, method, parms)
invokeMethod可以是这个样子:
public static Object invokeMethod(Object object, Method method, Object... params){ method.setAccessible(true); //try catch Object result = method.invoke(object, params); return result; }
然后就可以在Controller里写好多东西了~
相关推荐
资源名称:架构探险 轻量级微服务架构(下册)内容简介:《架构探险:轻量级微服务架构(下册)》将重点关注微服务基础设施方面,其中大部分内容涉及微服务运维相关技术。《架构探险:轻量级微服务架构(下册)》以...
架构探险javaweb 架构探险javaweb 架构探险javaweb 架构探险javaweb
架构探险 轻量级微服务架构(上册)高清PDF,上传大小所限,分成两部分,将两部分全部下载,解压出完成PDF
架构探险:从零开始写分布式服务架构架构探险:从零开始写分布式服务架构
架构探险 从零开始写javaweb框架书上源码,是真的。不是假的。迅雷下载后是一个404HTML页面。
架构探险 轻量级微服务架构-上册-高清-完整目录-2016年9月
架构探险:轻量级微服务架构(上册).黄勇(详细书签)架构探险:轻量级微服务架构(上册).黄勇(详细书签)架构探险:轻量级微服务架构(上册).黄勇(详细书签)架构探险:轻量级微服务架构(上册).黄勇(详细书签)
黄勇架构探险上册,主要从开发和运维角度从微服务的架构实践过程描述
架构探险 从零开始写javaweb框架源码,自己一行一行码的,目前包括chapter1、chapter2、chapter3、smart-framework,其中chapter3中包含第四章的代码
架构探险-轻量级微服务架构(上册) 黄勇写的是探索微服务架构
《架构探险——从零开始写Java Web框架》首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA、Maven、Git 等开发工具搭建 Java Web 应用;接着通过一个简单的应用场景,为该 Web 应用添加若干业务功能,从需求...
架构探险,从零开始写javaweb框架 huangyong-smart-framework-master.zip
《架构探险 轻量级微服务架构(上册)》
请支持作者,支持纸质正版!这本书内容还行,找了很久要么不全,要不不清楚,要不没有目录,这版很清晰,目录全,非常适合学习。
跟着敲完的一本书,看完之后对框架必有另一番见解,是一本框架启蒙书
本系列从开发与运维两方面分别对微服务架构的实践过程进行描述,全套分为上下两册,上册偏重于开发,下册偏重于运维。在上册中读者会学习到微服务架构所需的开发技能,包括使用SpringBoot搭建微服务开发框架,使用...
架构探险 从零开始写javaweb框架.pdf供大家下载学习参考
黄勇的架构探险从零开始写Java Web框架2.3.1截止的代码
架构探险:从零开始写分布式服务架构+源码,架构探险:从零开始写分布式服务架构+源码,架构探险:从零开始写分布式服务架构+源码,架构探险:从零开始写分布式服务架构+源码,架构探险:从零开始写分布式服务架构+...