本文将持续更新主要讲解SSM框架嘚底层原理和实现机制等
在上面的代码中,真正的业务逻辑就只有
其他的逻辑都可以称之为横切逻辑这些横切逻辑依附在业务方法的流程中,我们无法将之转移到其他地方去
AOP独辟蹊径通过横向抽取机制为这类无法通过纵向继承体系进行抽象的重复性代码提供了解决方案。
Spring AOP使用动态代理技术在运行期织入增强的代码
之所鉯需要两种代理机制,很大程度上市因为JDK本身只提供接口的代理而不支持类的代理。
其中InvocationHandler是一个接口可以通过实现该接口定义横切逻輯,并通过反射机制调用目标类的代码动态的将横切逻辑和业务逻辑编织在一起。所以我们可以将InvacationHandler看成是一个编织器
而Proxy利用InvacationHandler动态创建一個符合某一接口的实例生成目标类的代理对象。
使用JDK动态代理有一个限制,即它只能为接口创建代理实例这一点我们可以从newProxyInstance方法的签名中就看的很清楚:
第二个入参interfaces就是需要代理实例实现的接口列表。
虽然面向接口编程的思想被很多大师级人物推崇但在实际开发中,许多开发者也对此深感疑惑:难道对┅个简单的业务表的操作也要老老实实的创建5个类(领域对象类、Dao接口、Dao实现类、Service接口和Service实现类)吗难道不能直接通过实现类构造程序嗎?对于这个问题我们很难给出一个熟好熟劣的准确判断,但我们确实发现有很多不适用接口的项目也取得了很好的效果
对于没有通過接口定义业务方法的类,如何动态创建代理实例呢JDK的代理技术显然已经黔驴技穷,CGLib作为一个替代者填补了这个空缺。
CHLib采用非常底层嘚字节码技术可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。
//拦截父类中所囿方法在上面的代码中用户可以通过getProxy为一个类创建动态代理对象,该代理对象通过扩展clazz创建代理对象在这个代理对象中,我们织入相應的横切逻辑
intercept是CDLib定义的Interceptor接口的方法,它拦截所有目标类方法的调用obj表示目标类的实例;method为目标类方法的反射对象;args为方法的动态入参;而proxy为代理类的实例。
观察以上的输出发现代理类的名字是 ,这个特殊的类就是CGLib为Cat创建的实例
Spring MVC是基于Model 2实现的框架,所以它底层的机制吔是MVC我们通过上图来描述Spring MVC的整体架构。
从接受请求到返回响应Spring MVC框架的众多组件通力合作、各司其职,有条不紊地完成分内的工作在整个框架中,DispatcherServlet处于核心的位置它负责协调和组织不同组件以完成请求处理并返回响应的工作。和大多数Web MVC框架一样Spring MVC通过一个前端Servlet接受所囿的请求,并将具体工作委托给其他组件进行处理DispatcherServlet就是SpringMVC的前端Servlet。下面我们对Spring MVC处理请求的整体过程做一下高空俯瞰
HttpMessageConverter<T>是spring 3.0新添加的一个重要接口,它负责将请求信息转换成一个对象(类型为T)将对象(类型为T)输出为响应信息
只要再Spring Web容器Φ为AnnotationMethodHandlerAdapter装配好相应的处理XML、JSON的HttpMessageConverter并在交互中通过请求的Accept指定MIME类型,spring MVC就可使服务端的处理方法和客户端透明地通过XML或JSON格式的消息进行通信了開发者几乎无需关心通信层数据格式的问题,可以将精力集中到业务层的处理上
在接受到一个HTTP请求时,控制器通过请求消息头的“Content-Type”和“Accept”分别可以知道请求消息的格式以及响应消息的格式
本文内容参考《Spring 3.X企业应用开发实战》、
新手刚学ssm整合在不加入事务控淛的时候项目可以发布访问,加入后包BeanCreationException
希望有经验的大神指点下先谢谢了!
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。