设为首页 加入收藏

TOP

day06-SpringMVC底层机制简单实现-02(一)
2023-07-26 08:16:35 】 浏览:82
Tags:day06-SpringMVC 简单实 -02

SpringMVC底层机制简单实现-02

https://github.com/liyuelian/springmvc-demo.git

4.任务3-从web.xml动态获取容器配置文件

4.1分析

任务3:MyDispatcherServlet (自定义的前端分发器)在创建并初始化自定义的spring容器时,可以动态地从web.xml中获取到配置的容器文件。

我们之前实现的时候,是直接在 MyWebApplicationContext 中指定要读取的容器文件。

image-20230210220024611

改进:在web.xml中通过init-param指定容器文件,然后通过读取web.xml获取即可。这样可以动态地读取容器文件,不需要改变源代码。

image-20230210220808389

4.2代码实现

(1)修改 MyDispatcherServlet 的 init 方法。通过 ServletConfig 对象,获取 Servlet 的初始化参数 init-param,将该参数的值传入 spring 容器的初始化方法。

部分代码:

@Override
public void init(ServletConfig servletConfig) throws ServletException {
    /** web.xml文件,前端控制器的配置中:
     *  <init-param>
     *     <param-name>contextConfigLocation</param-name>
     *     <param-value>classpath:myspringmvc.xml</param-value>
     *  </init-param>
     */
    //configLocation ==> classpath:myspringmvc.xml
    String configLocation =
            servletConfig.getInitParameter("contextConfigLocation");
    //初始化ioc容器,传入指定的spring配置文件
    myWebApplicationContext = new MyWebApplicationContext(configLocation);
    myWebApplicationContext.init();
    //调用 initHandlerMapping(),完成url和控制器方法的映射
    initHandlerMapping();
    //测试输出 handlerList
    System.out.println("handlerList输出的结果=" + handlerList);
}

(2)修改 MyApplicationContext 自定义spring 容器,额外提供一个带参构造器,用于获取传入的 容器配置文件名,然后传给 MyApplicationContext 的 init() 方法去初始化。

部分代码:

//无参构造器
public MyWebApplicationContext() {
}

//表示spring容器配置文件名
private String configLocation;

//带参构造器
public MyWebApplicationContext(String configLocation) {
    this.configLocation = configLocation;
}

/**
 * 该方法完成对自己的 spring容器的初始化
 */
public void init() {
    //configLocation的值是 classpath:myspringmvc.xml
    // 按冒号分割,取索引为 1的子串:myspringmvc.xml
    String basePackage =
            XMLParse.getBasePackage(configLocation.split(":")[1]);
    String[] basePackages = basePackage.split(",");
    if (basePackages.length > 0) {
        //遍历这些包
        for (String pack : basePackages) {
            scanPackage(pack);
        }
    }
    System.out.println("扫描后的路径classFullPathList=" + classFullPathList);
    //将扫描到的类反射到ioc容器
    executeInstance();
    System.out.println("扫描后的ioc容器=" + ioc);
}

//scanPackage方法,略..该方法完成对包的扫描

//executeInstance方法,略..该方法将扫描到的类,在满足条件的情况下进行反射,并放入到ioc容器中

5.任务4-完成自定义@Service注解功能

5.1分析

目标:给某个类加上@Service注解,可以将对象注入到spring容器中,并且可以

(1)通过该类的类名,实现的多个接口名,在容器获取到该 Service Bean

(2)或者通过指定的 value 在容器中获取该 Service Bean

image-20230211181145463

5.2代码实现

(1)自定义Service注解

package com.li.myspringmvc.annotation;

import java.lang.annotation.*;

/**
 * @author 李
 * @version 1.0
 * @Service 注解用于标识一个Service对象,并注入到spring容器中
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Service {
    String value() default "";
}

(2)创建Service和ServiceImpl,用于测试

image-20230211180317273

Monster.java

package com.li.entity;

/**
 * @author 李
 * @version 1.0
 * 一个Javabean
 */
public class Monster {
    private Integer id;
    private String name;
    private String skill;
    private Integer age;

    public Monster(Integer id, String name, String skill, Integer age) {
        this.id = id;
        this.name = name;
        this.skill = skill;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSkill() {
        return skill;
    }

    pub
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Docker安装使用Kafka 下一篇学习笔记——尚好房项目(配置ssm..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目