菜鸟对SSM框架的理解(三)

Spring框架:Spring框架是一个轻量级的Java开发框架,它是为了解决企业应用开发的复杂性而创建的,Spring的核心是控制反转(IoC)和面向切面编程(AOP)。简单来说,Spring是一个分层的JavaSE/EE轻量级开源的框架。Spring 的主要作用就是为代码“解耦”,降低代码间的耦合度。就是让对象和对象(模块和模块)之间关系不是使用代码关联,而是通过配置来说明。即在 Spring 中说明对象(模块)的关系。

Spring 根据代码的功能特点,使用 IoC 降低业务对象之间耦合度。IoC 使得主业务在相互调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了。而是由 Spring 容器统一管理,自动“注入”,注入即赋值。而 AOP 使得系统级服务得到了最大复用,且不用再由程序员手工将系统级服务“混杂”到主业务逻辑中了,而是由 Spring 容器统一完成“织入”。

Spring是一个框架,是一个半成品的软件。有20个模块组成。它是一个容器管理对象,容器是装东西的,Spring容器不装文本,数字。装的是对象。Spring是存储对象的容器

Spring 官网:http://spring.io
控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代 码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的装配和管理。IoC 是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式是依赖 注入。这里讲一下依赖,依赖:classA 类中含有 classB 的实例,在 classA 中调用 classB 的方法完成功能,即 classA 对 classB 有依赖。
IoC的实现:依赖查找:DL ( Dependency Lookup ), 容器提供回调接口和上下文环境给组件。
                       依赖注入:DI (Dependency Injection),程序代码不做定位查询,这些工作由容器自 行完成。
依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。Spring的依赖注入对调用者与被调用者几乎没有任何要求,完全支持 POJO 之间依赖关系的管理。
依赖注入是目前最优秀的解耦方式。依赖注入让 Spring 的 Bean 之间以配置文件的方式 组织在一起,而不是以硬编码的方式耦合在一起的。Spring容器是一个超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。Spring容器管理着容器中Bean之间的依赖关系,Spring使用“依赖注入”的方式来管理Bean之间的依赖关系。使用IoC实现对象之间的解耦和。
**Spring的动态代理:**动态代理是指,程序在整个运行过程中根本就不存在目标类的代理类,目标对象的代理对象只是由代理生成工具(不是真实定义的类)在程序运行时由 JVM 根据反射等机制动态生成的。代理对象与目标对象的代理关系在程序运行时才确立。动态代理作用:功能增强和控制访问。
spring动态代理分为两种:1.JDK动态代理,Jdk 的动态要求目标对象必须实现接口,这是 java 设计上的要求。
2.CGLIB动态代理,使用 JDK 的 Proxy 实现代理,要求目标类与代理类实现相同的接口。若目标类不存在接口,则无法使用该方式实现。但对于无接口的类,要为其创建动态代理,就要使用 CGLIB来实现。
CGLIB 代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。所以,使用 CGLIB 生成动态代理,要求目标类必须能够被继承,即不能是 final 的类。
AOP(Aspect Orient Programming):面向切面编程,是面向对象编程 OOP 的一种补充。面向对象编程是从静态角度考虑程序的结构,而面向切面编程是从动态角度考虑程序运行过程。AOP 底层,就是采用动态代理模式实现的。采用了两种代理:JDK 的动态代理,与 CGLIB 的动态代理。
利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。面向切面编程,就是将交叉业务逻辑封装成切面,利用 AOP 容器的功能将切面织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的、与主业务逻辑无关的代码,如安全检查、事务、日志、缓存等。
AOP编程术语:切面(Aspect),织入(Weaving),连接点(JoinPoint),切入点(Pointcut),目标对象(Target),通知(Advice)。
注意:面向切面编程只是面向对象编程的一种补充
在 Spring 中使用 AOP 开发时,一般使用 AspectJ 的实现方式。对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一,可以完成面向切面编程。然而,AspectJ 也实现了 AOP 的功能,且其实现方式更为简捷,使用更为方便,而且还支持注解式开发。所以,Spring 又将 AspectJ 的对于 AOP 的实现也引入到了自己的框架中。
AspectJ 中常用的通知有五种类型:前置通知,后置通知,环绕通知,异常通知,最终通知
AspectJ 定义了专门的表达式用于指定切入点。切入点表达式要匹配的对象就是目标方法的方法名。所以,execution 表达式中明显就是方法的签名。注意,表达式中加[ ]的部分表示可省略部分,各部分间用空格分开。
举个例子: execution(public * *(..))     指定切入点为:任意公共方法。
                 execution(* *.service.*.*(..))    指定只有一级包下的 serivce 子包下所有类(接口)中所有方法为切入点
这次我们先讲到这,下次我们讲一讲Spring集成Mybatis,还有Spring事务.

暂无评论