一、Spring概述
1.1 Spring是什么
Spring是一个开源框架,是于2003年兴起的一个轻量级的Java开发框架, 由Rod Johnson 在其著作《Expert one on one J2EE design and development》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
它是一个容器框架,用来装javabean(java对象),中间层框架(万能胶)可以起一个连接作用,比如说把Struts和hibernate粘合在一起运用。
1.2 为什么要学习Spring
方便解耦,简化开发:Spring就是一个大工厂,可以将所有对象的创建和依赖关系交给Spring来管理,避免硬编码所造成的过度程序耦合。
AOP编程的支持:Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程
方便程序的测试:Spring对Junit4支持,可以通过注解方便的测试Spring程序
方便集成各种优秀框架:Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、Mybatis、Quartz等)的直接支持
降低JavaEE API的使用难度:Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
1.3 Spring的体系结构
下面是官网给出的Spring4结构图
【核心容器(Core Container)】
spring-core:依赖注入IoC与DI的最基本实现
spring-beans:Bean工厂与bean的装配
spring-context:spring的context上下文即IoC容器
spring-expression:spring表达式语言
【数据访问/集成部分(data access)】
spring-jdbc:jdbc的支持
spring-orm:对象关系映射,集成orm框架
spring-oxm:对象xml映射
spring-jms:java消息服务
- spring-tx:事务控制
【web】
spring-websocket:websocket protocol是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,spring支持websocket通信。
spring-web:基础web功能,如文件上传
spring-webmvc-portlet:提供了在portlet环境下的mvc实现
spring-webmvc:mvc实现
【AOP】
spring-aop:面向切面编程
spring-aspects:集成AspectJ
spring-instrument:提供一些类级的工具支持和ClassLoader级的实现,用于服务器
【test】
- spring-test:spring测试,提供junit与mock测试功能
1.4 Spring IoC 和 DI 简介
【IoC:Inverse of Control】——控制反转
- 读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。
- 正控:若要使用某个对象,需要自己去负责对象的创建
- 反控:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架
举个例子:
控制反转显然是一个抽象的概念,我们举一个鲜明的例子来说明。
在现实生活中,人们要用到一样东西的时候,第一反应就是去找到这件东西,比如想喝新鲜橙汁,在没有饮品店的日子里,最直观的做法就是:买果汁机、买橙子,然后准备开水。值得注意的是:这些都是你自己“主动”创造的过程,也就是说一杯橙汁需要你自己创造。
然而到了今时今日,由于饮品店的盛行,当我们想喝橙汁时,第一想法就转换成了找到饮品店的联系方式,通过电话等渠道描述你的需要、地址、联系方式等,下订单等待,过一会儿就会有人送来橙汁了。
请注意你并没有“主动”去创造橙汁,橙汁是由饮品店创造的,而不是你,然而也完全达到了你的要求,甚至比你创造的要好上那么一些。
总结:
传统的方式:通过new 关键字主动创建一个对象
IOC方式:对象的生命周期由Spring来管理,直接从Spring那里去获取一个对象。 IOC是反转控制 (Inversion Of Control)的缩写,就像控制权从本来在自己手里,交给了Spring。
【DI:Dependency Injection】——依赖注入
- 指 Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设置给该对象 。
- 实现IOC需要DI做支持
- 注入的方式:
- set方法注入
- 构造方法注入
- 字段注入
- 注入类型:
- 值类型注入(8大基本数据类型)
- 引用类型注入(将依赖对象注入)
二、入门案例
2.1 下载Spring的开发包
下载地址:https://repo.spring.io/libs-release-local/org/springframework/spring/
下载后解压的目录结构:
2.2 创建web工程,引入Spring的开发包
核心容器(Core Container)中的四个jar包(spring-core、spring-beans、spring-context、spring-expression)是我们使用spring要导入的最最基础的包。
另外还需要一个日志包:
2.3 创建一个对象
public class User {
private String name;
private Integer age;
get/set...
}
2.4 创建配置文件
- 配置文件可放在任意位置,建议放在src下
- 配置文件的文件名任意,建议为applicationContext.xml
【导入约束】
详细步骤见:spring配置文件中导入约束的详细步骤
【将对象注册到容器中】
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- 将User对象交给Spring容器管理 -->
<!-- Bean元素:使用该元素描述需要spring容器管理的对象
class属性:被管理对象的完整类名
name属性:给被管理的对象起个名字,获得该对象时根据该名称获得对象,可以重复,可以使用特殊字符
id属性:与name属性一模一样,名称不可重复,不能使用特殊字符
-->
<bean name="user" class="cn.itcast.domain.User"></bean>
</beans>
2.5 编写测试代码
@Test
public void fun1() throws Exception {
// 1.创建容器对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2.向容器"要"user对象
User user = (User) applicationContext.getBean("user");
// 3.打印user对象
System.out.println(user);
}
三、Spring中的容器
3.1 ApplicationContext
ApplicationContext接口有两个实现类:
- ClassPathXmlApplicationContext:从类路径下加载配置文件:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
- FileSystemXmlApplicationContext:从硬盘绝对路径下加载配置文件
ApplicationContext ac = new FileSystemXmlApplicationContext("c:/applicationContext.xml");
ApplicationContext容器的特点:每次容器启动时就会创建容器中配置的所有对象
3.2 BeanFactory
ApplicationContext 是 BeanFactory 的子接口之一,换句话说:BeanFactory 是 Spring IoC 容器所定义的最底层接口,而 ApplicationContext 是其*接口之一,并对 BeanFactory 功能做了许多的扩展,所以在绝大部分的工作场景下,都会使用 ApplicationContext 作为 Spring IoC 容器。
从上图中我们可以几乎看到, BeanFactory 位于设计的最底层,它提供了 Spring IoC 最底层的设计。
BeanFactory接口实现类的容器.特点是每次在获得对象时才会创建对象
【BeanFactory 和 ApplicationContext 的区别】
- BeanFactory:是Spring中最底层的接口,只提供了最简单的IoC功能,负责配置,创建和管理bean。另外,BeanFactory是在getBean的时候才会生成类的实例。
- ApplicationContext:继承了 BeanFactory,拥有了基本的 IoC 功能;ApplicationContext在加载applicationContext.xml(容器启动)时候就会创建类的实例。
在应用中,一般不使用 BeanFactory,而推荐使用ApplicationContext(应用上下文)