一、Spring开发框架
1.简介
Spring是一个轻量级控制反转IoC和面向切面AOP的容器框架,使用基本的JavaBean代替EJB,易于测试,可用于任何Java应用,解决企业应用开发的复杂性。
* 依赖注入DI有效降低耦合度,AOP提供通用任务的集中管理,ORM和DAO简化了对数据库的访问。高度开放性,并不强制。
→ 有效组织中间层对象,消除对单例模式的过多使用;使用统一的配置文件;促进良好变成习惯,减少编程代价;易于单元测试;使EJB成为一种备选;为数据存取提供了一致的框架;方便集成各种优秀框架。
2.Spring核心模块
Spring Core,Spring Context,Spring AOP,JDBC和DAO模块,Spring ORM对象实体映射,Web模块,MVC模块。
3.Spring IoC控制反转
由Spring来负责控制对象的生命周期(创建和销毁等)和对象间的依赖关系。IoC也叫依赖注入DI,就是在运行期间,由IoC容器动态地将某种依赖关系注入到对象之中,其中IoC在xml文件控制,侧重于原理,而DI侧重于实现。引入IoC容器作为对象制造工厂,利用依赖关系注入的方式,实现对象之间的解耦。
4.Spring AOP
动态角度面向切面编程,是静态角度面向对象编程OOP的有利补充,用于处理一些具有横切性质的系统级服务,如事务管理、日志管理、安全检查、异常管理、缓存及对象池的管理等。AOP代理其实时AOP框架动态生成的一个对象,可作为目标对象使用,需要程序员定义普通业务组件,定义切入点,定义增强处理。
*代理对象的方法=增强处理+被代理对象的方法。
切面:一个关注点的模块化,可能横切多个对象。
连接点:程序中方法执行点。
通知:切面特定连接点上执行的动作,around,after,before等不同类型,以拦截器为模型。
切入点:匹配连接点的断言。
引入:给一个类生命额外的属性和方法。
目标对象:被一个或多个切面通知的对象。
AOP代理:AOP框架创建的对象,实现切面契约。
织入:把切面连接到其他应用程序类型或对象之上,并创建一个被通知的对象,在运行时完成织入。
二、Spring IoC程序示例
1.Spring开发环境搭建
JDK+Eclipse+Spring Framework相关软件包(reference→Distribution Zip Files→spring开发包下载地址→选择合适版本下载后解压缩→下载Apache Commens login的jar文件)2.Spring开发包介绍
建立Spring工程时,需要引入相关的开发包,否则无法建立Spring的开发和运行环境。核心开发包:Spring Core(基本核心工具类),Spring Beans(所有应用都要用到的配置文件,创建管理Bean),Spring AOP(声明性的事务管理和日志系统的引入),Spring Context。
辅助开发包,业务组件包:SpringAspects,Spring Context Support,Spring Expression,Spring Framework Bom,Spring Instrument,Spring Instrument Tomcat,Spring JDBC,Spring JMS,Spring orm,Spring oxm,Spring Struts,Spring test,Spring tx,Spring web,Spring webmvc,Spring webmvc portlet。
3.创建基于Spring IOC的小程序的步骤
(1)建立Spring工程,导入工程所需的jar包;(2)编写Java文件,创建接口以及接口的两个实现类,创建实体类并将接口设为其属性,在执行类中引入spring相关开发类(在main方法中:通过FileSystemResource得到配置文件的Resource,然后构建BeanFactory对象,通过该对象的getBean方法得到实体类对象,调用接口中的方法);
(3)编写Spring配置文件,beans标签中bean子标签设置接口实现类和实体类的id和class文件,其中实体类还需要设置property属性子标签,其中ref属性设置实体类该属性调用哪个接口实现;
(4)编译代码运行程序,实现通过配置文件控制输出信息。
三、Spring IoC容器
1.IoC概述
IoC即控制反转,是Spring容器的内核,AOP、声明式事务等功能都依赖于此功能,涉及代码解耦、设计模式、代码优化等问题的考量。比喻:引入导演,使得剧本和饰演者解耦。
IoC即DI概念,让调用类对某一接口类的依赖关系由第三方注入,以移除调用类对某一接口实现类的依赖。
2.IoC注入类型:
(1)构造函数注入:通过调用类的构造函数,将接口实现类通过构造函数变量传入;(2)属性注入:通过setter方法完成调用类所需依赖的注入,更加灵活方便;
(3)接口注入:将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法,增多了类的数目并不提倡。
Spring作为一个容器,通过配置文件或者注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入的工作。
3.Java反射机制:
Java语言允许通过程序化的方式间接对Class的对象实例操作,Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息,如构造函数、属性和方法等。类装载器:寻找类的字节码文件并构造出类在JVM内部表示的对象组件,主要工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件,负责在运行时查找和装入Class字节码文件。
主要的三个反射类:Constructor,Method,Field。
类装载器工作机制:装载(查找和导入class文件),链接(执行校验,准备和解析步骤),初始化(对类的静态变量、静态代码块执行初始化工作)。
ClassLoader重要方法:loadClass(全限定名),defineClass将类文件的字节数组转化成JVM内部的.class对象,findSystemClass从本地文件系统载入class文件,findLoadedClass查看是否已经装载类,getParent获得父装载器。
*Spring的IoC原理利用的就是Java的反射机制,Spring的工厂类会帮我们完成配置文件的读取、利用反射机制注入对象等工作,我们可以通过bean的名称获取对应的对象。
4.Resource接口
JDK所提供的访问资源的类并不能很好地满足各种底层资源的访问需求,因此Spring设计了一个Resource接口,为应用提供了更强大的访问底层资源的能力,使用时要通过具体实现类ByteArrayResource/ClassPathResource/FileSystemResource/InputStreamResource/ServletContextResource/UrlResource。但是Spring提供了一个强大的家在资源的机制,能够自动识别不同的资源类型:classpath、File、http、ftp、无前缀等。
Resource接口方法:exists/isOpen/getURL/getFile/getInputStream。
Ant风格匹配符:?(匹配文件名中的一个字符),*(匹配文件名中的任意字符),**(匹配多层路径)。
Spring定义一套资源加载的接口,并提供了实现类,Resource接口ResourceLoader类、ResourcePatternResolver类。
5.BeanFactory和ApplicationContext介绍
BeanFactory时Spring框架最核心的接口,提供了高级IoC配置机制,ApplicationContext建立在BeanFactory基础之上,提供了更多面向应用的功能,提供了国际化支持和框架事件体系,更易于创建实际应用。一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文。BeanFactory是一个类工厂,可以创建并管理各种类的对象,Spring称这些创建和管理的Java对象为Bean。
BeanFactory类体系结构:XmlBeanFactory、ListableBeanFactory、HiberhicalBeanFactory、ConfigurableBeanFactory、AutowireCapableBeanFactory、SingletonBeanFactory、BeanDefinitionRegistry。
BeanFactory装载初始化顺序:创建配置文件、装载配置文件、启动IoC容器、获取Bean实例(之后可以从缓存中直接获得实例)。
ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能,在ApplicationContext中则可以通过配置的方式实现,替代BeanFactory中需要编程实现的功能。
ApplicationContext的具体实现类:ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、ConfigurableApplicationContext,扩展接口ApplicationEventPublisher、MessageSource、ResourcePatterResolver、LifeCycle。
ApplicationContext的初始化同BeanFactory相似,但前者在初始化容器时实例化所有单实例的Bean,而后者在第一次使用Bean时才会实例化。
6.Bean的生命周期
Spring容器中Bean拥有明确的生命周期,由多个特定的生命阶段组成,每个生命阶段都允许外界对Bean施加控制。在Spring中,我们从Bean的作用范围和实例化Bean时所经历的一系列阶段来描述Bean的生命周期。BeanFactory与ApplicationContext中Bean生命周期相似但有所不同,最大不同在于后者会利用Java反射机制自动识别并注册到应用上下文中,而前者需要手动注入,所以后者更为常用。
四、Spring配置文件
1.概述
Spring配置文件用于指导spring工厂进行Bean的生产、依赖关系注入及Bean实例分发的图纸,是一个或多个标准的XML文档。beans标签中通过import子标签加载配置文件,通过bean子标签定义Bean,alias定义别名。
Spring容器启动基本条件:Spring的框架类包,Bean的配置信息,Bean的实现类。其中Bean的配置信息包括Bean的实现类、属性信息、依赖关系、行为配置、创建方式。
2.SpringBean的命名
配置文件中bean可以有一个id或多个name,其中第一个为“标识符”,其余叫做别名,id在IoC容器中必须唯一。bean的命名方式:仅通过class属性配置全限定名,唯一;指定id,唯一;指定name,唯一;同时指定id和name,唯一;指定多个name,唯一;指定id和多个name,唯一;指定别名,唯一
命名约定:遵循XML命名规范,由字母、数字、下划线组成,驼峰式。
3.Spring Bean的实例化
Spring IoC容器根据Bean定义里的配置元数据使用反射机制来创建Bean。创建Bean实例的方式:
使用构造器实例化Bean(最简单方式),使用静态工厂方法实例化Bean,使用实例工厂方法实例化Bean。
(1)静态工厂方法:除了制定必须的class属性,还要指定factory-method属性来指定实例化Bean方法,而且使用静态工厂方法也允许指定方法参数,Spring IoC容器将调用此属性指定的方法来获取Bean。
(2)实例工厂化:不能指定class属性,此时必须使用factory-ben属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样。
4.SpringBean的作用域
即配置文件中的scope,在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围。Bean的5种作用域:singleton,prototype,request,session,globalSession。此外,还可以定义自己的作用域,但不提倡。
(1)singleton作用域是指在Spring IoC容器中仅存在一个Bean的示例,Bean以单实例的方式存在,单实例模式是重要的设计模式之一,在Spring中可以对那些非线程安全的对象采用单实例模式。
(2)prototype作用域是指每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new Bean()的操作。在默认情况下,Spring容器在启动时不实例化prototype的Bean。
(3)当用户使用Spring的WebApplicationContext时,还可以使用另外3中Bean的作用域,即request,session和globalSession。在使用Web应用环境相关的Bean作用域时,必须在Web容器中进行一些额外的配置。