文档章节

SSH中各个框架的作用以及Spring AOP,IOC,DI详解

包包大人
 包包大人
发布于 2014/02/18 11:25
字数 2533
阅读 5976
收藏 17

    在SSH框假中spring充当了管理容器的角色。我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句。Struts是用来做应用层的,他它负责调用业务逻辑serivce层。所以SSH框架的流程大致
是:Jsp页面----Struts------Service(业务逻辑处理类)---Hibernate(左到右)struts负责控制Service(业务逻辑处理类),从而控制了Service的生命周期,这样层与层之间的依赖和强,属于耦合。这时,使用spring框架就起到了控制Action对象(Strus中的)和Service类的作用,两者之间的关系就松散了,Spring的Ioc机制(控制反转和依赖注入)正是用在此处

    

首先想说说IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。


那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。


  IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。


AOP编程

这个概念有点复杂!首先还是打个比方吧!比如我们在要在网站上注册登录的案例,在注册时我们要完成校验,文件上传,获取用户信息只有将这些动作完成后才能做保存用户的操作,如果报所有的业务逻辑放到一起处理的话,那么就显得过于繁杂不利于后期的开发和维护,AOP的做法是把目标类(又称目标对象)保存用户单独提出来,把校验,文件上传,获取用户信息当做切面,这样就很好的做到了解耦把业务逻辑和切面分离,有利于开发和后期维护!

概念:

A. Aspect(切面)比如说事务、权限等,与业务逻辑没有关系的部分 

B. joinpoint(连接点)目标类的目标方法。(由客户端在调用的时候决定)

C. Pointcut(切入点)所谓切入点是指我们要对那些拦截的方法的定义.被纳入spring aop中的目标类的方法。

D. Advice(通知)所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)

E. Target(目标对象):代理的目标对象 

F. Weaving(织入)是指把切面应用到目标对象来创建新的代理对象的过程.切面在指定的连接点织入到目标对象 

 

JDKProxy代理

SpringAop

目标对象

目标对象

拦截器类

切面

拦截器类中的方法

通知

被拦截到的目标类中方法的集合

切入点

在客户端调用的方法(目标类目标方法)

连接点

代理类

AOP代理

代理类的代理方法生成的过程

织入

 通知根据拦截目标类中的目标方法的位置不一样可以分为:前置通知、后置通知、最终通知、环绕通知、异常通知

   2AOP实现的两种模式

        (1)、xml形式

 (2)、注解形式


AOP原理:

概念:代理模式的英文叫做ProxySurrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

    1、JDK动态代理

JDK的动态代理必须具备四个条件:

          目标接口

          目标类

          拦截器

          代理类

总结:

    1、因为利用JDKProxy生成的代理类实现了接口,所以目标类中所有的方法在代理类中都有。

    2、生成的代理类的所有的方法都拦截了目标类的所有的方法。而拦截器中invoke方法的内容正好就是代理类的各个方法的组成体。

    3、利用JDKProxy方式必须有接口的存在。

    4、invoke方法中的三个参数可以访问目标类的被调用方法的API、被调用方法的参数、被调用方法的返回类型。

2、CGLIB做代理

    1、 CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。

    2、 用CGlib生成代理类是目标类的子类。

    3、 用CGlib生成 代理类不需要接口

    4、 用CGLib生成的代理类重写了父类的各个方法。

    5、 拦截器中的intercept方法内容正好就是代理类中的方法体

 

spring有两种代理方式:

1. 若目标对象实现了若干接口,spring使用JDKjava.lang.reflect.Proxy类代理。

    优点:因为有接口,所以使系统更加松耦合

    缺点:为每一个目标类创建接口

2. 若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。

    优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。

    缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。

 

Spring的动态代理实现:

    1、  拦截器必须实现MethodInterceptor接口

    2、 spring中的配置

    总结:不管采用JDK动态代理生成代理类还是采用CGLIB生成动态代理类。目标类中的所有方法都被拦截下来。而在哪个方法里做比如权限的判断、安全性的检查等一系列工做必须在拦截器中作相应的判断。但是这样的编程形式给程序的编写带来了一定的麻烦。

 

1、 在拦截器中控制哪些方法将被做权限判断、安全性检查等是一件比较困难的事情。

    A. 采取这样的配置目标类只能是一个,所以如果用这种方法做权限控制,得写很多代理,这样给代码的书写造成了困难。

    B. 每一个类中的每一个方法如果都有不同的权限(实际的系统往往都是这样的),在拦截器中的判断代码书写会很困难。

2、 这样的代码也会导致硬编码,也就是说我们必须在拦截器中写一些权限判断等事情,会导致拦截器中代码量的增大,造成维护的麻烦。



© 著作权归作者所有

共有 人打赏支持
包包大人
粉丝 14
博文 9
码字总数 77484
作品 0
徐汇
程序员
私信 提问
加载中

评论(2)

赫兹
赫兹
不是有代码编辑么的。。。。 虽如此,复点赞
包包大人
包包大人
由于公司网速限制,编辑有点问题,见谅!!!
spring 入门及IOC容器

Spring 一.Spring,原意“春天”,是一种轻量级容器框架,所谓轻量级就是依赖比较少,侵入性较低,其核心就是1. IOC(Inversion of Control)/DI(Dependency Injection)IoC的核心思想是通过消...

天国使者125
2013/06/15
0
0
详解spring 每个jar的作用

spring.jar 是包含有完整发布模块的单个jar 包。但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2.jar。 spring-src.zip就是所有的源代码压缩包。 除了spring....

mosaic101
2015/03/06
0
0
Spring面试,IoC和AOP的理解

spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易...

Sandy_wu
2013/06/08
0
0
ssh

commons-logging-1.0.4.jar Struts2加入了就不需要导入 log4j-1.2.15.jar Hibernate加入了就不需要导入 Jar文件:红色的为一定没有问题的jar包 操作数据库的jar mysql-connector-java-5.0.8-...

狂龙治中
2015/12/29
0
0
spring 相关jar包详解

spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到spring-mock.jar来进行辅助测试,正式应...

满风
2011/10/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu16.04下安装docker

[TOC] 本文开发环境为Ubuntu 16.04 LTS 64位系统,通过apt的docker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是开发人员和小型团队的理想选择。 1. 开始安装 1.1 由于...

豫华商
47分钟前
5
0
使用XShell工具密钥认证登录Linux系统

如果你是一名Linux运维,那么Linux服务器的系统安全问题,可能是你要考虑的,而系统登录方式有两种,密码和密钥。哪一种更加安全呢? 无疑是后者! 这里我为大家分享用Xshell利器使用密钥的方...

dragon_tech
59分钟前
3
0
day178-2018-12-15-英语流利阅读-待学习

“真蛛奶茶”了解一下?蜘蛛也会产奶了 Lala 2018-12-15 1.今日导读 “蛋白质含量是牛奶的 4 倍,并有着更低的脂肪和含糖量”,听起来诱人又美味的并不是羊奶或豆奶,而是你可能打死都想不到...

飞鱼说编程
今天
10
0
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents

场景重现 npm install --verbose 安装依赖的时,出现如下警告 强迫症患者表示不能接受 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules\fsevents):npm WARN......

taadis
今天
2
0
OSChina 周六乱弹 —— 你一口我一口多咬一口是小狗

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文 :分享Roy Orbison的单曲《She's a Mystery to Me》 《She's a Mystery to Me》- Roy Orbison 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
408
6

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部