从servlet到mvc框架的演变
1 提出问题
在我学习servlet以后直接上手springmvc等框架会感觉这更本就是两个系统,不清楚其中的区别。下面我们一一解决这些疑惑。
2 IOC
2.1 注解
在目前的spring框架中,大量的注解,下面是一个@Service注解的声明定义的实现方式:
2.2 获取注解类
然后们就可以通过反射的方式获取到@Service注解的类。
其他的列如:@Bean,@Action,@Controller等等注解的实现方式类似。
2.3 依赖注入
下面就是IOC不同bean之间实现依赖注入:上面已经获取到所有的bean,放入到了一个map中
2.4 项目初始化
项目初始化的时候会将所有的工具类加载进来
2.5 mvc中的核心DispatcherSevlet
下面演示mvc框架中,如何由将框架代码转化为servlet的全过程。
3 AOP
下面我们将用AOP解决一个问题:统计所有@Controller注解的类的运行时间。
AOP实质上就是需要操作的类用代理的带式拦截下来,统一一套代码来处理这些方法,生成增强的目标类。
3.1 CGlib代理
动态代理有一个好处就是如果代理的类原来的接口改变,动态代理类无需改变。但是这样就产生了一个问题,如果我们需要代理的对象没有接口如何代理呢?使用CGlib可以完美解决这个问题。
CGlib的代理时只需要对方法进行修改即可,无需传入代理的接口:
动态带来:
CGlib实现代理:
3.2 AOP
编写一个proxy代理接口:
proxyChain用于链式代理,按顺序一个一个执行代理对象,这样我们会先执行before方法,然后代理方法,最后after方法。
实现一个切面编程的抽象类作为模板:
拦截所有的controller
现在有一个proxyManager类,可以将代理的实现poxyList和需要代理的类对应起来生成一组新的代理实现。
最后初始化AOP(放入Bean map中使其可以被其他的bean IOC注入)
AOP的初始化:需要注意的是,AOPHelper在IOCHelper的前面,因为AOP可能代理了一些bean,后面这些bean的依赖注入还需要使用IOC。
参考文献:《架构探险-从零开始写java web框架》