写代码应该是一个由繁到简,然后由简到繁的一个螺旋上升的过程。
都说谈对象是两个人的事情,面向对象编程那也不会是一个对象的事情,而是需要处理一堆对象的依赖关系。
如果一个实例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开发技术的书籍,其核心内容是通过源码分析来帮助读者理解并构建自己的Web框架。书中的源码提供了实际的编程实践,使读者能够亲身体验到JavaWeb框架的实现...
《架构探险:从零开始写JavaWeb框架》这本书是一本深度探索JavaWeb开发技术的著作,旨在引导读者从零开始构建自己的Web框架,从而深入理解框架背后的设计原理和实现机制。书中涵盖了从基础到高级的各种JavaWeb开发...
在本课程中,“架构探险 从零开始写javaweb框架 源码”旨在带领开发者逐步构建一个完整的Java Web框架。这个过程不仅涵盖了基础的Web开发知识,还深入到框架设计的核心理念和技术细节。我们将从以下几个方面进行探讨...
本教程将引领你踏上一段架构探险之旅,从零开始创建一个名为“Smart”的JavaWeb框架。通过对huangyong-smart-framework-master.zip压缩包的源码分析,我们将深入理解Web框架的核心概念和技术。 1. **MVC模式**:...
6. **依赖注入**:Spring框架的依赖注入(DI)和控制反转(IoC)概念是现代Java Web开发的关键。这种设计模式使得组件之间的依赖关系可以外部化,增强了代码的灵活性和测试性。 7. **数据库集成**:多数Java Web...
6. **Spring框架**:Spring是Java企业级应用的事实标准,提供了依赖注入、AOP(面向切面编程)、事务管理、数据访问和Web MVC框架。深入理解Spring Boot和Spring Cloud还能帮助开发者快速构建微服务架构。 7. **...
《架构探险:从零开始写JavaWeb框架》是由黄勇撰写的一本技术书籍,它旨在帮助读者深入理解JavaWeb开发的内在原理,并通过实践动手编写自己的框架,从而提升架构设计和编程技能。这本书涵盖的内容广泛,包括了Spring...
7. **依赖注入**:可能涉及Spring框架的IoC(Inversion of Control)容器,讲解如何管理对象的生命周期和依赖关系。 8. **模板引擎**:如FreeMarker或Thymeleaf,用于生成HTML页面。 9. **数据库连接和操作**:讲解...
通过IOC容器,可以实现依赖注入,简化对象之间的依赖关系;AOP则用于分离关注点,如日志记录、权限控制等。书中会详细讲解这两个概念及其在Spring框架中的应用。 7. **Spring MVC**:Spring框架提供了Spring MVC...
《架构探险丛书:从零开始写JavaWeb框架》是一本深度探索JavaWeb开发技术的专著,旨在引导读者从无到有地构建...这是一次深入的架构探险之旅,对于想要提升JavaWeb开发水平的程序员来说,无疑是一份宝贵的参考资料。
在本系列中,我们将一起踏上一次架构探险之旅,目标是从零构建一个完整的Java Web框架。这个过程将涵盖多个关键知识点,让我们逐步深入了解Java Web开发的核心技术,并了解如何将它们整合成一个高效、灵活的框架。 ...
在本资源中,“架构探险 从零开始写javaweb框架 源代码”是一个教程性质的项目,旨在引导开发者逐步构建一个Java Web框架。这个框架的开发过程将涵盖从基础概念到高级技术的多个方面,使学习者能深入理解Web应用的...
《架构探险:从零开始学Spring》是一本深入浅出的Spring框架学习指南,作者通过细致入微的讲解,带领读者逐步掌握Spring的核心概念和技术。Spring作为Java领域最流行的轻量级框架,其广泛应用于企业级应用开发,是...
1. Spring框架:除了Spring MVC,Spring还提供了依赖注入、AOP(面向切面编程)、数据访问/集成、任务调度等多种功能,是构建企业级应用的基石。 2. Hibernate和MyBatis:持久层框架如Hibernate和MyBatis简化了...
6. **Spring框架基础**:虽然标题强调从零开始,但了解Spring框架的基本概念和工作原理,如依赖注入(DI)和面向切面编程(AOP),将有助于理解JavaWeb框架的设计思想。 7. **数据库连接与JDBC**:JavaWeb框架通常...