springtiny控制反转实现

一.读取配置

二.注解定义

定义了Controller,Service,RequestMapping,AutoWired,其中Controller,Service作用于class上:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)

RequestMapping用于匹配请求路径

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)

作用于方法

AutoWired用于bean的注入

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)

三.class管理

static {
    CLASS_SET = ClassUtils.getClassSet(ConfigHelper.getAppBasePackage());
}

在静态代码块里面,扫描基础包,获取所有的class

  

四.bean的管理

获取所有beanClass

CLASS_SET.stream().filter(clazz ->
        clazz.isAnnotationPresent(Service.class) || clazz.isAnnotationPresent(Controller.class)

将bean实例化

Object obj = bean.newInstance();

并且以map形式存储起来

BEAN_MAP.put(bean,obj);

五.controllerHelper的实现

因为http请求过来后,首先要找到对应的controller,所以controller需要一些特殊的处理。

REQUEST_MAP

是一个map结构,用来管理加了@RequestMapping的方法,其中requestmapping的key包含了method和path来匹配标示其对应的http请求,

private MethodEnum method;
private String path;

而value值是对该http请求的处理

Class<?> controllerClass;
Method method;

包含了改controller的class和对应的method。

五.ioc实现

在BeanMap中循环遍历,找到@AutoWired的Field,从BeanMap中找到对应的实例,将Field实例化,至此控制反转完成。

六.servlet的实现

继承自HttpServlet,urlPattern劫持所有的http请求。重写init方法,load以上的helper,让静态块内的代码执行(其实不提前load也完全可以,当该class被使用时,也会执行其静态块)。

在service的重载中,最重要的便是找到对应的controller的方法,当然,我们能拿到req的方法和path,从request_map中找到对应的method很容易。然后便是处理request中带来的参数,以及body,把它交由method去处理。(现在还是很菜鸡的,对于path上的参数还不能处理。)最后,根据method的返回结果(json或者页面资源)加载resp中,返回给前端。

 

 

转载于:https://my.oschina.net/vqishiyu/blog/1825589

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值