第4.33课 上课 框架介绍, 下载和安装, 入门示例, 配置元素
4_33

框架介绍
Spring框架介绍:Java EE开发必须要掌握的框架。
MVC框架:Spring MVC,有些公司可能用Struts 2。 甚至有些公司用自己的MVC实现, MVC框架是可选的。
持久层框架:MyBatis、Hibernate、JPA、JDBC,持久层框架的选择也很多。
中间层框架:Spring,几乎没有竞争对手。
目前,其他的Java EE框架,都会选择与Spring整合。
Spring框架是其他Java EE框架的中心。
百度百科介绍:
http://baike.baidu.com/link?url=Rek4yhx5tktSlPotGzzlCK5dMkncyfiDMaFecD46wySeIUSs8i6BZUi1nVOz98HYV0O-mdJz1nYPvQ8ZOg3Du_
Spring框架的历史:
2002年,Rod Johnson写了一本书,对以EJB为核心的Java EE平台进行批评和思考。
2003年,Rod Johnson开发了一个框架,这就是Spring。Spring的很多设计理念,其实就是起源EJB的启发。
当然,Spring更加简单易用。

传统的Java EE项目存在如下问题:
1. 组件之间的依赖关系:Action要调用Service的方法,Service要调用Dao的方法……这就称为依赖。比如A要调用B,称为A依赖B。
为了让A组件能调用B组件的方法,必须让A先获取B的实例。为了获取B的实例,有如下方式:
- 直接创建: 先new B→ 调用B的方法。
直接创建这种方式,必然导致A类与B组件的实现类(因为需要直接调用构造器)直接耦合。
如果以后项目需要升级,需要将B升级为更好的组件,此时B类需要更换,A又与B的实现类耦合,因此A也需要改。
- 工厂模式: A直接通过B组件的工厂来获取B组件 → 调用B的方法
A. 让A面向B的接口编程,在A的源代码中不会出现B的实现类。此时A与B的实现类进行了解耦。
B. A通过B的工厂来获取B的实例,B的创建工作交给B工厂去实现。A就不管B的创建。
缺点在于: 需要为B实现工厂,而且A还需要与B的工厂耦合。
C. Spring的IoC就可彻底解决该问题。
A组件面向B的接口编程即可,因此A可以与B的实现类分离。
程序员无需为B组件编写工厂类,因此编程更加简单。
2. 项目的Service、Dao组件设计——本身源自桥接模式的设计。
Service层负责业务规则的变化,Dao层负责持久化技术的变化。
目标:持久化技术的改变,只影响dao层。业务规则的改变,只影响Service。
但由于Service组件的事务控制代码——是用持久层技术API、Connection、Transacton、EntityTransaction,
这会导致当持久层技术改变时,事务控制代码要修改(业务组件依然要修改)。
为了彻底解决这个问题,用Spring AOP即可。
下载和安装
Spring的下载和安装
- 登录www.springsource.org下载Spring框架即可.
- 解压Spring框架。会得到如下文件结构:
- docs: API文档和参考手册。
- libs: 包括class文件jar包、api文档jar包、源代码jar包.
- schema:各种配置文件的XML Schema
- 为Java项目增加Spring的19个jar包 + commong-logging.jar包.
- 为Spring增加一个配置文件.
下载网址(www.springsource.org)需要依赖Maven
下载spring-framework-4.*.RELEASE-dist.zip
查看所有的版本:
http://repo.springsource.org/libs-release-local/org/springframework/spring/
下载仓库地址:
http://repo.springsource.org/libs-release-local/org/springframework/spring/4.2.5.RELEASE/spring-framework-4.2.5.RELEASE-dist.zip
解压spring-framework-4.*.RELEASE-dist.zip
docs(api文档与参考文档)
libs(jar包)
schema(约束文件)
入门示例
拷贝jar包

spring4配置文件
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
</beans>
bean简单配置
<!-- 配置Bean:
id : Bean的唯一标识符
class : 指定类(包名 + 类名)
-->
<bean id="userDao" class="org.it.dao.UserDao"></bean>

Spring编程部分



加载Spring配置文件
获取Spring容器
ClassPathXmlApplicationContext类路径
/** 创建Spring容器 */
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appContext.xml");
//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("file:c:/workspace/eclipse/spring01/src/appContext.xml");
/** 根据id从容器中获取指定的Bean */
HelloService hs = (HelloService)context.getBean("helloService");
/** 关闭Spring容器 */
context.close();
FileSystemXmlApplicationContext文件系统
/** 创建Spring容器 */
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("F:/workspace/eclipse/spring01/src/appContext.xml");
// FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("classpath:appContext.xml");
/** 根据id从容器中获取指定的Bean */
HelloService hs = (HelloService)context.getBean("helloService");
/** 关闭Spring容器 */
context.close();
Spring容器

BeanFactory
ApplicationContext
ApplicationContext比BeanFactory功能更强大,它额外增加了如下功能:
-预初始化:当创建Spring容器时,ApplicationContext就会初始化容器中的所有singleton Bean
BeanFactory不会预初始化。
如果要取消ApplicationContext的预初始化,只要为bean元素增加lazy-init="true"
-支持国际化: ApplicationContext继承MessageSource接口,因此提供国际化支持.
国际化的本质就是查找、替换。
a.编写国际化资源文件.
b.加载国际化资源文件.
c.根据key去获取国际化消息.ApplicationContext提供了getMessage()方法.
-资源访问, 比如访问指定URL和文件中的内容.
-事件机制,很少使用.
-加载多个配置文件.
FileSystemXmlApplicationContext(String... configLocations):可直接传入多个配置文件.
ClassPathXmlApplicationContext(String... configLocations):也可传入多个配置文件.
配置元素
beans配置文件根元素
beans: 它是配置文件的根元素.
bean配置对象元素
bean: 该元素用于驱动调用构造器。默认调用无参数的构造器(即使该构造器是private也可以)
如果增加了constructor-arg,就会调用有参的构造器.
有几个constructor-arg,就调用带几个参数的构造器.
property属性元素
property: 驱动调用settings方法.
说明:只要你会查api,看到该类有settings方法,你就可以配置对应的property元素.
constructor-arg构造器元素
constructor-arg: 配置构造器参数.
该元素可配置type属性,如果不指定type属性,该配置参数优先被当成String处理.
beans与bean指定属性区别
<bean .../>元素指定的属性,很多都可以在<beans.../>上指定出来.
如果在<beans.../>上指定的属性,它是全局的,对所有的Bean都有效.
如果在<bean.../>上指定的属性,只对该Bean有效,它是局部.
当全局、和局部冲突时,局部的取胜.
浙公网安备 33010602011771号