构架

看完《架构探险——从零开始写Java Web框架》的一点总结。

一、Bean的管理(注解)

1、指定基础包。

2、将指定包下的class加载到内存,形成ClassSet。并可以搜集被@Component,@Service等注解的类的class。(通过反射判断该类是否被@Component等注解)


找到包下的所有class文件,调用loadClass()将其加载入内存,并获取class文件的class对象。

3、遍历ClassSet,通过反射为每个class创建一个实例保存在BeanMap,<class,instance>


二、依赖注入

实质是为bean中的成员变量赋值。(被@Resource等依赖注入的成员变量)

遍历beanMap,通过反射获取每个bean的被注入成员变量(例如被@Resource注解的字段),通过反射为该成员变量赋值上一个该class对应的实例,该实例同样来自BeanMap。

三、DispatcherServlet,请求转发器

继承自HttpServlet。可实现仅通过一个Servlet处理所有的请求,url="/*"。实质是接收所有请求后,调用与url对应的Controller处理请求(通过注解建立url与controller、method的对应关系),并将controller返回的结果返回给页面,注意将controller的处理结果返回页面的操作是由servlet实现,并非Controller。底层实质还是用的servlet那一套。

init():将所有的bean准备好。并通过反射获取被@Controller注解的类,建立ActionMap<request,handler>,request类封装有请求方法与请求路径信息,handler封装controller、method信息。实际就是建立了url与controller、method的映射关系。


service(req,res)

1、从res中获取请求方法、请求路径,根据方法与路径封装成自定义的request作为,从ActionMap<request,handler>的map中获取对应handler。(handler中有与url对应的controller、method信息)。

2、从request中获取请求参数param,反射调用controller中的method(param)方法:methord.invoke(controller,param),得到处理结果。

3、返回值。

返回视图View实质:将model数据放到request中。获取视图view中存储的路径path,调用request.getRequestDispatcher(path).forward(re1,res):(此处的view与model可理解为springmvc中的两者)


返回数据实质:将数据写到通过response写回。


编程式


猜想做法:

判断advice类型,代理类的invoke方法中,在目标方法前调用advice.before(),在目标方法后调用advice.after();

声明式:




代理类继承了被代理对象,且实现了增强的接口。所以被代理对象既可以调用自身方法,又可以通过强转为第三方接口,从而调用第三方接口的方法。

猜你喜欢

转载自blog.csdn.net/xybz1993/article/details/80567048