文档章节

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

包包大人
 包包大人
发布于 2014/02/18 11:25
字数 2533
阅读 1.2W
收藏 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
195
0
Java进阶知识16 Spring的基础配置详解

1、SSH各个的职责 Struts2:是web框架(管理jsp、action、actionform等)。 Hibernate:是ORM框架,处于持久层。 Spring:是一个容器框架,用于配置bean,并维护bean直接的关系。 Bean(组件...

osc_45dhoxd5
2019/10/15
3
0
SSM - SpringBoot - SpringCloud

#SSM框架:标准MVC模式继 SSH (Struts+Spring+Hibernate)之后,主流的 Java EE企业级 Web应用程序开源框架 spring:实现业务对象管理 spring MVC:负责请求的转发和视图管理 MyBatis:作为数...

osc_acwq3gr9
2019/08/05
2
0
[01] Why Spring

1、何为框架 简单来说,框架就是制定了一套规范或者规则(思想),让程序员在该规范或规则下进行工作。如上图修楼房,在有框架的情况下,修建工作才高效且有条不紊。楼层钢架规定了大楼的结构...

osc_sd6nmwhn
2018/04/14
1
0
Spring:Spring的各jar包依赖及作用详解

spring-core.jar(必须有的核心jar包) 这个jar 文件包含Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用...

osc_t1bxxmjp
03/05
2
0

没有更多内容

加载失败,请刷新页面

加载更多

可以让你用到老的IntelliJ idea 破解法子

看下效果图如下: 安装的时候选择试用,然后进入idea 下载插件 插件地址 然后将jetbrains-agent.jar文件拖入到idea中 然后重启 然后选择Activation code 然后就ojbk了...

布袋和尚_爱吃鱼
12分钟前
15
0
获取类对象的四种方式

/* * 获取类对象的三种方式 * */ public static void main(String[] args) throws Exception { //1、Class.forName 【建议】 Class<?> clazz1 = Class.forName("com.czxy.demo2.Person"); //......

费先森
28分钟前
21
0
2020中台建设-技术中台的搭建和运营

2020中台建设-技术中台的搭建和运营

Original123
35分钟前
22
0
CTO:不要在 Java 代码中写 set/get 方法了,逮一次罚款

前言 what?你的 Java 代码中还充斥着大量的 set/get 方法? 我们在刚开始学习 Java 语言的时候讲过,面向对象的三大特征就是封装,继承,和多态。在 Java 中,要保证封装性,需要将成员变量...

码农突围
45分钟前
21
0
为什么不推荐去做安全测试工程师?

对,你没看错。我不推荐大家去做安全测试工程师。 为什么不推荐大家去做安全测试? 今天,很多软件并没有经过专门的安全测试便运行在互联网上,它们携带着各类安全漏洞直接暴露在公众面前,其...

爱码小哥
今天
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部