[关闭]
@HUST-SuWB 2015-05-03T12:38:53.000000Z 字数 2184 阅读 428

Spring实战总结

项目实战


Spring简介

Spring是于2003年兴起的一个轻量级的开源Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。
Spring的内容很多,事务、邮件、MVC、jdbcTemplate、security等,我自认没有办法把这些东西讲清楚,所以这里主要还是着眼于Spring最基础的两个特性:IOC、AOP。

IOC

IOC,即控制反转,它还有另一种说法叫依赖注入(DI)。通常,如果我们依赖于某个类或服务,最简单有效的方式就是直接在类的构造方法中新建相应的依赖类。而控制反转的反转就在于:让我们从原来的事必躬亲,转变为现在的享受服务。从被注入对象的角度,与之前直接寻求以来对象相比,依赖对象的获取方式发生了反转,控制也从被注入对象转到了IOC容器,所以通俗来说,其实IOC就是原来需要什么都要自己去拿,而现在是让别人拿过来。
IOC使得软件组件松散连接成为可能。创建系统组件之间协作关系的动作是IOC的关键,通常称之为装配。BeanFactory采用了工厂设计模式,但是它不仅负责简单的实例化和分发应用对象,同时Bean工厂分发出来的Bean都已经是被配置好了的,都已经得到了它们的关联对象,已经可以被使用了。
在Spring配置文件中[bean]元素是xml文件的根元素,其属性id表示Bean的名字,class属性表示Bean的全路径类名,还可以配置[property]元素设置部分属性值(配合set方法)。
BeanFactory在一个Bean可以使用之前已经完成了很多步的工作:实例化--设置属性--设置Bean名--预处理--初始化--后处理--Bean准备完成。此时,Bean会一直保留在Bean工厂中直到不再需要它。
Spring除了装配基本类型(value)和其他类(ref)之外,还能支持集合类型,包括[list](可重复)[set](不可重复)[map](任意键值对)[props](String类型的键值对)这四种。
通常我们使用的依赖注入为构造器注入或设置器注入(即setter方法),但是实际上还可以使用方法注入,可以向Bean注入完整的方法定义。
在大多数情况下,对于Spring装配的Bean来说,它们不知道也不必知道自己的名称以及自己运行在一个Spring容器里,这是完整的解耦。但是通过实现BeanNameAware、BeanFactoryAware以及ApplicationContextAware,Bean可以了解到它们的名字,BeanFactory以及ApplicantionContext。

AOP

AOP,即面向切面编程。在软件开发中,有些行为对于大多数程序是通用的,如登陆、安全、事务管理等。这类散步于程序中多个地方的函数被称为"交叉事务"。它们一般与程序的业务逻辑是分开的,把这些交叉事务与业务分开就是面向切面编程。使用AOP,可以让我们能够捕捉应用中经常使用的功能,把它转化成可重用组件。可以这么说,IOC实现了程序之间的解耦,而AOP实现了交叉事务与它们所影响的对象之间的解耦。
AOP有很多术语,可以先行了解(点这里/点这里)。
Java平台上可以使用多种方式实现AOP,比如如下几种:
- 动态代理:JDK1.3之后引入的动态代理机制,可以让我们将横切关注点逻辑封装到动态代理的InvocationHandler中,然后在系统在运行期间,根据横切关注点需要织入的模块未知,将横切逻辑织入到相应的代理类中。Spring AOP默认情况下就是采用的这种机制。
- 动态字节码增强:我们可以为需要织入横切逻辑的模块类在运行期间,通过动态字节码增强技术,在这些系统模块类生成相应的子类,而将横切逻辑加到这些子类中,让应用程序在执行期间使用的是这些动态生成的子类。
- 自定义类加载器:我们可以通过自定义类加载器的方式完成横切逻辑到系统的织入,自定义类加载器通过读取外部文件规定的织入规则和必要信息,在加载class文件期间就可以将横切逻辑添加到系统模块类的现有逻辑中,然后将改动后的class交给JVM运行。
- AOL(Aspect-Oriented Language)扩展:在这种方式中,AOP的概念在AOL中大都有一一对应的实体。这样,AOP概念表述就更有实力,而且所有横切关注点逻辑在进行织入之前,可以自由的存货在自己的"国度"中。但是,这种方式强大的代价就是你需要重新学习一门扩展了就有语言的AOL或者全新的AOL。
Spring切面是以代理方式实现的,代理包裹目标对象,处理方法调用,执行额外的切面逻辑,然后调用目标方法。Spring切点最常用的是正则表达式切点和AspectJ切点。Spring AOP属于第二代的AOP,采用动态代理机制和字节码生成技术实现,这两种技术都是在运行期间为目标对象生成一个代理对象,而将横切逻辑织入到这个代理对象中,系统最终使用的是织入了横切逻辑的代理对象,而不是真正的目标对象。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注