Spring3.2.0 (Spring版本)
目录简介:
spring-framework-3.0.2.RELEASE-dependencies.zip
名称:Spring3.0.2版本发布整合资源jar包
作用:可以在其中找到Spring开发过程中所使用的绝大多数jar包
介绍:各种各样的技术
spring-framework-3.2.0.RELEASE-dist.zip
名称:Spring3.2.0框架资源包
作用:开发Spring使用的基础资源信息
文件夹介绍:
docs API帮助文档和官方手册
libs jar包
包括
源码包 *-source.jar
文档包 *-javadoc.jar
schema
开发使用的XML约束文档源文件,dtd,schema
license.txt 说明文件
notice.txt 说明文件
readme.txt 说明文件
jar包整理:
核心jar包
spring-beans-3.2.0.RELEASE.jar
spring-context-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
日志相关jar包(从依赖资源中获取)
commons-logging-1.1.1.jar
日志整合,与slf4j类似,由Apache提供
位置:依赖资源包下的spring-framework-3.0.2.RELEASE-dependenciesorg.apache.commonscom.springsource.org.apache.commons.logging1.1.1
log4j-1.2.16.jar
schema:开发使用的XML约束文档源文件
dtd
schema
Spring 简单介绍(备注:有时间可以了解一下EJB)
Spring功能非常强大,能够服务于J2EE开发过程中的各个层面
表现层:SpringMVC
逻辑层:Bean管理、AOP、事务管理
数据层:Spring JDBCTemplate
Spring是一个基于JAVA的轻量级J2EE应用框架
基于Java
轻量级
JEE框架:Spring可以为J2EE开发过程中的三层每层都带来实现技术
Struts:表现层框架 Hibernate:数据层框架
简单的来说,Spring的本质就是
自动创建工厂类,依赖配置文件完成
Spring核心技术
IOC:控制反转
AOP:面向切面编程/面向方面编程
Spring中的内容
包含有核心容器,AOP,数据访问(主要做集成),WEB访问(主要做集成)
Spring的作用
Spring是一个超级的“黏合平台”,将很多技术黏合在一起,形成一个整体,是每个组件发挥其最大的功效
Spring构造器初始化对象原理及流程
1.使用ApplicationContext对象可以将对应的xml文件进行加载
2.搜索beans元素下都多少个bean元素
3.对每一个bean元素读取其class属性值
4.根据该值使用反射,创建对应的对象
如果读取到了该bean元素下有property元素
通过配置的property的name值,生成一个setter方法
使用反射构建该方法对应的Method对象
使用创建的对象,加上后面配置的值,invoke(obj,val)
5.创建一个Map<String, Object>
使用id作为key
使用反射创建的对象作为value
将所有的bean初始化完毕后,放入到map
6.调用getBean("beanId")方法,实际上是使用参数作为map的key
访问其对应的数据
Bean的初始化方式
Spring管理对象均以Bean的形式呈现,Bean就是Java对象
类构造器初始化(主流)
使用默认的无参构造方法来创建Bean对象,要求提供对应的构造方法
静态工厂方法初始化(非主流:了解)
该模式用于兼容早期系统,提供一个静态工厂类,然后定义Bean使用下列格式:
<!-- 静态工厂初始化 -->
<!-- class:静态工厂的类名 -->
<!-- factory-method:静态工厂中用于创建对象的方法 -->
<bean id="bean2" class="cn.smile.bean.xml.Bean2StaticFactory" factory-method="getInst">
</bean>
实例化工厂方法初始化(非主流:了解)
首先将实例工厂类配置为Bean
<!-- 实例工厂初始化 -->
<!-- 必须先创建实例工厂对应的Bean -->
<bean id="instFactory" class="cn.smile.bean.xml.Bean3InstFactory"></bean>
<bean id="bean3" factory-bean="instFactory" factory-method="getInst"></bean>
Bean的作用域
Spring中的Bean默认创造出的对象是同一个,也就是单例的,通过修改bean元素的scope属性可以控制创建出的实例的作用域
<bean id="beanScope" scope="singleton" class="cn.smile.spring.scope.Bean1"> </bean>
scope的取值可以使用如下值
singleton 单例
prototype 非单例
request 创建该Bean,并调用requestsetAttribute("beanId", beanObj);
session / globalSession全局Session (分布式服务器)
Bean的生命周期
Bean的初始化过程已经被Spring完全包装起来了,无法人工干预
Spring预留了两个回调方法的入口
回调方法:定义出来完成一定的功能,提供给调用者/服务器/上层容器调用的方法,叫做回调方法
由于Bean的声明周期由Spring管理,Spring在没有关闭其IoC容器前,将不销毁所管理的Bean,因此必须将其手动关闭才可以销毁Spring所控制的Bean实例
ApplicationContext接口并不提供关闭操作,使用其子类对象ClassPathXmlApplicationContext进行关闭操作
注意:销毁操作只能用于单例的对象,即scope属性为singletion的对象
非单例的Bean对象的回收交由JVM完成--GC
Bean的属性注入
Spring支持使用两种方式为Bean注入属性
构造器注入
提供对应的构造方法
配置中设置构造方法的参数
<!-- 构造器注入属性 -->
<!-- construtor-arg:使用构造器传递参数 -->
<!-- value:赋值 -->
<bean id="bean6" class="cn.smile.bean.xml.Bean6" >
<constructor-arg value="Smile"/>
<constructor-arg value="2017"/>
</bean>
注意:如果类型匹配不成功,可以为配置中指定index索引属性,规范构造器中参数的位置
Setter注入(重点)
注入简单类型:String,基本数据类型封装类
提供对应要注入的属性
为每个要注入的属性提供对应的标准封装setter方法
在配置中为Bean指定要注入的属性,使用property元素 name="属性名" value="值"
<property name="name" value="Smile"/>
注入引用类型:对象
提供对应要注入的属性
为每个要注入的属性提供对应的标准封装setter方法
将要注入的引用类型对象配置为Spring管理的资源,bean
<!-- 为一个类注入引用类型的对象,必须将该对象设置为spring的bean -->
<!-- 声明bean7中使用的引用类型资源 -->
<bean id="abc" class="cn.smile.bean.xml.Bean7Use"></bean>
<!-- 在Bean的属性注入中,使用ref引用对应的资源 ref=”beanId/beanName” -->
<!-- setter注入 -->
<!-- name:属性名 -->
<!-- value:简单类型的值 -->
<!-- ref:引用别的Bean,beanId/beanName -->
<bean id="bean7" class="cn.smile.bean.xml.Bean7">
<property name="name" value="Smile"/>
<property name="age" value="2017"/>
<property name="use" ref="abc"/>
</bean>
p命名空间————属性注入的格式优化
Spring2.5引入全新的命名空间p,有效的简化了配置的内容,缩短配置信息
在约束信息中加入使用命名空间p
xmlns:p="http://www.springframework.org/schema/p"
属性注入格式优化
常量属性格式 p:<属性名>="属性值"
引用bean对象格式 p:<属性名>-ref="bean名称"
<bean id="bean8" class="cn.smile.bean.xml.Bean7"
p:name="smile2"
p:age="2014"
p:use-ref="abc"
>
</bean>
Spring EL表达式
Spring3.0引入全新的SpEL(Spring Expression Language)Spring表达式语言,使用表达式语言可以是属性注入格式进一步简化,同时支持包括对象注入,集合注入,集合访问,实例方法引用,静态方法引用等多种格式。
Spring3.0提供了专用的EL表达式,用于描述更多的格式,详情参考《Spring_表达式语言.pdf》
所有格式统一使用 value="......"
常量 #{10} #{3.14} #{2e5} #{'Smile'}
引用Bean #{beanId}
引用Bean属性 #{beanId.propertyName}
引用Bean方法 beanId.methodName().method2()
引用静态方法 T(java.lang.Math).PI
运算符支持 #{3 lt 4 == 4 ge 3}
正则表达式支持 #{user.name matches '[a-z]{6,}'}
集合支持 #{likes[3]}
setter注入集合属性(了解)
Spring属性注入还支持集合对象的使用,常见的集合对象注入如下:
List/数组
Set
Map
Properties
团队开发合作模式
当开发人员过多时,如果所有bean都配置到同一个配置文件applicationContext.xml中,会引起文件巨大,查找不方便的现象出现
Spring提供了团队开发的xml配置格式
将多个bean配置到不同的applicationContext文件中(多个)
文件命名规范:applicationContext-功能模块名.xml
applicationContext-user.xml
applicationContext-order.xml
applicationContext-device.xml
提供一个主配置文件将所有的公共bean配置到主配置文件中(1个)
applicationContext.xml
当配置中需要导入其他的配置文件中的bean,使用import元素完成
<!-- 加载主配置文件 -->
<import resource="applicationContext.xml"/>
加载上下文对象时,使用多个配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("application-user.xml","application.xml");
冲突问题:
如果同一个配置文件中,具有多个相同id的Bean,抛出异常
如果多个不同的配置文件中,具有多个相同id的Bean,以最后加载的为准
可以为bean声明name属性,丰富该bean的调用名称 name= "beanName1,beanName2,......"
使用注解定义bean
@Component
功能:指定对应的类为Spring控制的bean
格式:定义在类的上方,可以为类指定bean名称
定义UserDaoImpl类为Spring控制的bean,未指定名称
@Component
public class UserDaoImpl implements UserDAO{
...
}
定义UserDAOImpl类为Spring控制的bean,名称"userDAO"
@Component("userDao")
public class UserDAOImpl implements UserDAO{
...
}
bean的名称可以定义多个,如@Component("u1,u2,u3")
需要在配置中添加
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/beans/spring-context.xsd
<!-- 开启自动扫描路径,含子路径 -->
<context:component-scan base-package="cn.smile"/>
注解格式注入无需设置setter方法
Spring2.5还定义了3个@Component的衍生注解,用于后期版本中对其功能进行深层次的扩展
@Repository 用于对数据层实现类进行标注
@Service 用于对业务逻辑层实现类进行标注
@Controller 用于对控制层实现类进行标注
目前上述三种注解与@Component功能完全相同,仅仅是名称上的区别
使用注解定义属性注入
@AutoWired
功能:标注类的成员变量为自动装配注入属性
格式:定义在成员变量的上方
参数:require
可选值:true(默认值)/false
作用:标识该属性是否必须注入,如果未对其指定注入的值,则系统抛出异常
注入不同类别的属性需要使用不同的注解
简单类型:@Value
对象类型:@Qualifier
自动装配类型识别(引用类型)
注入属性类型为class
如果类名对应的类只有一个,注入成功
如果类名对应的类有多个,注入失败
注入属性类型为interface
如果不存在对应接口的实现类,注入失败
如果对应接口的实现类为一个,注入成功
如果对应接口的实现类为多个,注入失败
如果对应接口的实现类指定有bean名称,则按照属性定义的名称进行匹配
如果存在对应名称的自动装配bean,注入成功
如果存在对应名称的自动装配bean,注入失败
@Qualifier
功能:为属性注入的Bean类型的值
格式:定义在成员变量的上方
注意:该注解与@Autowired配合使用
@Qualifier必须给出注入的bean的名称
如果对应的bean不存在,抛出异常,注入失败
为@Autowired指定参数required=false,避免注入失败时候抛出异常
使用注解@Resource为属性注入(了解)
Spring提供对JSR-250中定义@Resource标准注解的支持。
@Resource与@Autowired功能非常相似,用于bean的自动装配,格式略有区别
整合JUnit
使用JUnit整合Spring可以有效的加快测试速度,避免大量繁琐的重复代码,获取配置信息的任务交由JUnit来完成
使用JUnit整合Spring需要导入对应的测试包
spring-test-3.2.0.RELEASE.jar
需要在MyEclipse中添加JUnit,和导入jar包类似,选择Add Library,然后选择一个JUnit的版本即可
具体步骤:
要求为测试类设置类运行器,定义在类的上方
//设置当前类的JUnit测试的类运行器由Spring提供