zoukankan      html  css  js  c++  java
  • 手把手教你写一个spring IOC容器

    摘要:spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制。今天就带大家手写一个spring IOC容器。

    spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制。今天就带大家手写一个spring IOC容器。

    第0步(准备工作):

    (1)JDK1.8及java环境变量
    (2)maven包及maven环境变量
    (3)idea

    第1步(创建项目,引入tomcat包)

    PS:由于该项目的作用是模拟spring的部分功能,所以取名为spring

    (1)创建好的项目内容如下图:

    (2)pom文件的初始状态如下:

    第2步:搭建主体框架

    PS:一个正常的spring项目一般分为controller和service部分,此处暂时忽略数据库链接

    (1)其中,TestController实现功能,返回name+“Hello World!”,引用TestService

    (2)而TestService和TestServiceImpl则分别实现功能

    第3步:创建,并打上标签

    PS:我们需要很多标签,如service,controller,还有autowired等

    (1)创建各种标签(暂时创建这些标签,后面不够再加)

    (2)打上标签

    由于RequestMpping后面需要跟路径,所以此处需要重写其value()方法,如下:

    第4步:进入正题,创建一个DisPatcherServlet类,用于实现IOC容器功能

    (1)DisPatcherServlet继承HttpServlet(注意添加依赖),并重写doGet,doPost方法

    (2)创建一个doDispatcher方法,并被doPost引用

    第5步:初始化

    (1)暂停实现doDispatcher,去重写初始化方法init,初始化共分为五大步骤,如下

    注意:顶端要加上属性类(Properties),且要resource中加application.properties,并加上scanPackage属性,内容为需扫描的根目录

    (2)加载配置文件实现,需要先配置一个web.xml,路径和内容如下:

    路径:

    内容:

    剩下的内容,大家应该能看懂的吧

    (3)下一步,使用递归,将所有class的路径存入一个集合(classPaths)里面

    (4)下一步,将打上了controller和service标签的类放入ioc容器中

    (5)下一步,注入(通过Autowired标签从IOC容器中获取实例对象并赋值)

    (6)获取所有的RequestMapping内容,并写到一个对象集合中

    第6步:回头实现doDisPatcher的步骤

    (1)首先,设定404(class notfound)
    (2)后面一半,实现接口功能
    PS1:判断url方法
    PS2:根据url获取方法
    PS3:获取方法下的所有参数

    最后一步:执行tomcat

    so,

    (1)你以为以上的内容是对的嘛?
    (2)你以为你能得到想要的结果吗?

    太天真了!!!

    如果你按照我说的方法去运行,恭喜你,得到的结果是not found!!!真正的挑战才刚刚开始:

    第一,标签类的定义,如下,特别重要的是Target

    还需要补充一个mapping

    第二,TestController类中,RequestParam少了value属性,如果没有,则无法传值。

    第三,那么参数初始化,是不是也有一点问题呢?注意这段代码,传参的名字应该和什么相关?

    好了 现在真的可以成功了~~~

    看看结果吧。

    完结撒花~~~

     本文分享自华为云社区《手把手教你写一个spring IOC容器》,原文作者:技术火炬手。

     

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    Codeforces 1255B Fridge Lockers
    Codeforces 1255A Changing Volume
    Codeforces 1255A Changing Volume
    leetcode 112. 路径总和
    leetcode 129. 求根到叶子节点数字之和
    leetcode 404. 左叶子之和
    leetcode 104. 二叉树的最大深度
    leetcode 235. 二叉搜索树的最近公共祖先
    450. Delete Node in a BST
    树的c++实现--建立一棵树
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/14631100.html
Copyright © 2011-2022 走看看