看完《架构探险——从零开始写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中的两者)
编程式
猜想做法:
判断advice类型,代理类的invoke方法中,在目标方法前调用advice.before(),在目标方法后调用advice.after();
声明式:
代理类继承了被代理对象,且实现了增强的接口。所以被代理对象既可以调用自身方法,又可以通过强转为第三方接口,从而调用第三方接口的方法。