手写代码提炼Spring核心原理

基本实现思路

一.配置阶段:配置web.xml (DispatcherServlet) —>设定init-param(contextConfigLocation=classpath:application.xml)—>设定url-pattern(/*)—>配置Annotation(@Controller @Service @Autowired @RequestMapping)

二.初始化阶段:调用init()方法(加载配置文件)—>IOC容器初始化(Map<String,Object>)—>扫描相关的类(scan-package=“com.spring”)—>创建实例化并保存至容器(通过反射机制将类实例化放入IOC容器)—>进行DI操作(扫描IOC容器中的实例),给没有赋值的属性自动赋值—>初始化HandleMapping(将一个URL和一个Method进行一对一的关联映射Map<String,Method>)

三.运行阶段:调用doPost()/doGet() (Web容器调用doPost/doGet方法,获取request/response对象)—>匹配HandlerMapping (从request对象中获得用户输入的url,找到其对应的Method)—>反射调用method.invoker()(利用反射调用方法并返回结果)—>response.getWrite().write()(将返回结果输出到浏览器)

自定义配置

配置application.properties文件:

scanPackage=com.spring

配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:javaee="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">
    <display-name>Web Application</display-name>
    <servlet>
        <servlet-name>zjhmvc</servlet-name>
        <servlet-class>com.spring.mvcframework.v1.servlet.ZJHDispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>application.properties</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>zjhmvc</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

自定义Annotation

@ZJHService 注解:

package annotation;

import java.lang.annotation.*;

/**
 * Created by Lenovo on 2019-8-10.
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ZJHService {
    String value() default "";
}

@ZJHAutowired

package annotation;

import java.lang.annotation.*;

/**
 * Created by Lenovo on 2019-8-10.
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ZJHAutowired {
    String value() default "";
}

@ZJHController

package annotation;

import java.lang.annotation.*;

/**
 * Created by Lenovo on 2019-8-10.
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ZJHController {
    String value() default "";
}

@ZJHRequestMapping

package annotation;

import java.lang.annotation.*;

/**
 * Created by Lenovo on 2019-8-10.
 */
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ZJHRequestMapping {
    String value() default "";
}

@ZJHRequestParam

package annotation;

import java.lang.annotation.*;

/**
 * Created by Lenovo on 2019-8-10.
 */
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ZJHRequestParam {
    String value() default "";
}

配置Annotation

service 接口

package service;

/**
 * Created by Lenovo on 2019-8-10.
 */
public interface IDemoService {
   public String get(String name);
}

service实现类

package service;

import annotation.ZJHService;

/**
 * Created by Lenovo on 2019-8-10.
 */
@ZJHService
public class DemoService implements IDemoService {
    public String get(String name) {
        return "My name is"+name;
    }
}

配置入口类DemoAction:

package action;

import annotation.ZJHAutowired;
import annotation.ZJHRequestMapping;
import annotation.ZJHRequestParam;
import service.IDemoService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by Lenovo on 2019-8-10.
 */
public class DemoAction {
    @ZJHAutowired
    private IDemoService demoService;
    @ZJHRequestMapping("/query")
    public void query(HttpServletRequest req,HttpServletResponse resp,@ZJHRequestParam("name") String name){
        String result =demoService.get(name);
        try{
            resp.getWriter().write(result);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @ZJHRequestMapping("/add")
    public void add(HttpServletRequest req,HttpServletResponse resp,@ZJHRequestParam("a") Integer a,@ZJHRequestParam("b") Integer b){
        try{
            resp.getWriter().write(a+"+"+b+"="+(a+b));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @ZJHRequestMapping("/remove")
    public void remove(HttpServletRequest req,HttpServletResponse resp,@ZJHRequestParam("id") Integer id){

    }
}

容器初始化

package action;

import annotation.ZJHAutowired;
import annotation.ZJHRequestMapping;
import annotation.ZJHRequestParam;
import service.IDemoService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by Lenovo on 2019-8-10.
 */
public class DemoAction {
    @ZJHAutowired
    private IDemoService demoService;
    @ZJHRequestMapping("/query")
    public void query(HttpServletRequest req,HttpServletResponse resp,@ZJHRequestParam("name") String name){
        String result =demoService.get(name);
        try{
            resp.getWriter().write(result);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @ZJHRequestMapping("/add")
    public void add(HttpServletRequest req,HttpServletResponse resp,@ZJHRequestParam("a") Integer a,@ZJHRequestParam("b") Integer b){
        try{
            resp.getWriter().write(a+"+"+b+"="+(a+b));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @ZJHRequestMapping("/remove")
    public void remove(HttpServletRequest req,HttpServletResponse resp,@ZJHRequestParam("id") Integer id){

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值