一 Spring 的基本应用

1. 什么是Spring?

Spring是由Rod Johnson 组织和开发的一个分层的 Java SE/EE full-stack (一站式) 轻量级开源框架,它以IoC(控制反转) 和 AOP(面向切面编程) 为内核,使用基本的 JavaBean 来完成以前只可能由 EJB (Java企业Bean) 完成的工作,取代了 EJB 的臃肿,低效的开发模式。
Spring致力于 JavaEE 应用各层的解决方法,在表现层它提供了 Spring MVC 以及 Struts 框架的整合功能;在业务逻辑层可以管理事物,记录日志等;在持久层可以整合 Mybatis , Hibernate ,等技术。因此,可以说 Spring 是企业应用开发很好的“一站式”选择。虽然 Spring 贯穿于表现层,业务逻辑层和持久层,但它并不想取代那些已有的框架,而是以高度的开放性与它们进行无缝整合。

2. Spring 框架的优点

Spring 具有简单,可测试和松耦合等特点,从这个角度出发, Spring 不仅可以用于服务器端开发,也可以应用于任何 Java 应用的开发中。
a). 非入侵式设计 
	Spring 是一种非入侵式 (non-invasive) 框架,它可以使应用程序代码对框架的依赖最小化。
b). 方便解耦,简化开发
	Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给 Spring 容器来管理,大大地降低了组件之间的耦合性。
c). 支持AOP
	Spring 提供了对 AOP 的支持,它允许将一些通用任务,如安全,事物,日志等进行集中式处理,从而提高程序的复用性。
d). 支持声明式事务处理
	只需要通过配置就可以完成对事物的管理,而无需手动编程。
e). 方便程序的测试
	Spring 提供了对 Junit4 的支持,可以通过注解方便地测试 Spring 程序。
f). 方便集成各种优秀的框架
	Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持。
g). 降低 JavaEE API 的使用难度
	Spring 对 JavaEE 开发中非常难用的一些 API (如 JDBC , JavaMail 等),都提供了封装,使这些 API 应用难度大大降低。

3. Spring 的核心容器

Spring 框架的主要功能是通过其核心容器来实现的。 Spring 框架提供了两种核心容器,分别为 BeanFactory 和 ApplicationContext 。
**a). BeanFactory** 
	BeanFactory 由 **org.springframework.beans.facytory.BeanFactory** 接口定义,是基础类型的 IoC (控制反转) 容器 ,它提供了完整的 IoC 服务支持。简单来说, BeanFactory 就是一个管理 Bean 的工厂,主要负责 初始化各种 Bean ,并调用他们的生命周期方法。
	BeanFactory 接口提供了几个实现类,其中最常用的是 **org.springframework.beans.factory.xml.XmlBeanFactory** ,该类会根据 XML 配置文件中的定义来装配 Bean 。
	创建 BeanFactory 实例时,需要提供 Spring 所管理容器的详细配置信息,这些信息通常采用 XML 文件形式来管理,其加载配置信息的语法如下 : 
BeanFactory beanfactory = new XmlBeanFactory (new FileSystemResource("F:/applicationContext.xml"));

ps: 这种加载方式在实际开发中不常用,了解即可。

**b). ApplicationContext**
	ApplicationContext 是 BeanFactory 的子接口,也被称为应用上下文,是另一种常用的 Spring 核心容器。 它由 **org.springframework.context.ApplicationContext**  接口定义,不仅包含了 BeanFactory 的所有功能,还添加了对国际化,资源访问,事件传播等方面的支持。
	创建 ApplicationContext 接口实例,通常采用两种方法,具体如下 :
	**1. 通过 ClassPathXmlApplicationContext  创建**
		ClassPathXmlApplicationContext  会从类路径 classPath 中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,其使用语法如下 :
ApplicationContext applicationcontext = new ClassPathXmlApplicationContext(String configLocation);
上述代码中,configLocation 参数用于指定 Spring 配置文件的名称和位置。如 其值为“applicationContext.xml” ,则 Spring 会去类路径中查找名称为 applicationContext.xml 的配置文件。
**2. 通过 FileSystemXmlApplicationContext 创建**
	FileSystemXmlApplicationContext  会从指定的文件系统路径 (绝对路径) 中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,其使用语法如下 :
ApplicationContext applicationcontext = new FileSystemXmlApplicationContext(String configLocation);
与 ClassPathXmlApplicationContext   有所不同的是,在读取 Spring 配置文件时, FileSystemXmlApplicationContext 不再从类路径中读取配置文件,而是通过参数指定配置文件的位置。例如 “D:/workspaces/applicationContext.xml”。如果在参数中写的不是绝对路径,那么方法调用的时候,会默认用绝对路径来找。此方法,会导致程序的灵活性变差,所以不推荐使用。

在使用 Spring 框架时,可以通过实例化任何一个类来创建  ApplicationContext  容器。通常在 Java 项目中,会采用通过  ClassPathXmlApplicationContext   类来实例化 ApplicationContext  容器的方式,而在 web 项目中, ApplicationContext  容器的实例化工作会交由 Web 服务器完成。 Web 服务器实例化 ApplicationContext  容器时,通常会使用基于  ContextLoaderListener 实现的方式,此种方法只需要在 web.xml 中添加如下代码。
  <!-- 指定 Spring 配置文件的位置,多个配置文件时,用逗号分隔 -->
   <context-param>
    <param-name>contextConfigLocation</param-name>
     <!-- Spring 将加载根目录下的 以 applicationContext- 为前缀开头的 .xml 文件 -->
    <param-value>classpath:applicationContext-*.xml</param-value>
  </context-param>
<!-- 指定以 ContextLoaderListener 方式启动 Spring 容器 -->
 <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
创建 Spring 容器后,就可以获取 Spring 容器中的 Bean。 Spring 获取 Bean 的实例通常采用以下两种方法。
1. Object getBean (String name) : 根据容器中 Bean 的 id 或 name 来获取指定的 Bean ,获取以后需要进行强制类型转换。
2. <T> T getBean (Class <T> requiredType) : 根据类的类型来获取 Bean 的实例。由于此方法为泛型方法,因此在获取 Bean 之后不需要进行强制类型转换。

小Tips : BeanFactory 和 ApplicationContext 两种容器都是通过 XML 配置文件加载 Bean 的。二者的主要区别在于,如果 Bean 的某一个属性没有注入,使用 BeanFactory 加载后,在第一次调用 getBean() 方法时会抛出异常,而 ApplicationContext 则在初始化时自检,这样有利于检查所依赖属性是否注入。因此,在实际开发中,通常优先使用 ApplicationContext ,而只有在系统资源较少时,才考虑使用 BeanFactory。

4. 依赖注入

**1. 依赖注入的概念**
	依赖注入 (Dependency Injection 简称 DI) 与控制反转 (IoC) 的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。
	
	**调用者创建被调用者对象**
	当某个 Java 对象 (调用者)需要调用另一个 Java 对象 (被调用者,即被依赖对象)时,在传统模式下,调用者通常会采用 “ new 被调用者 ” 的代码方式来创建对象,这种方式会导致调用者与被调用者之间的耦合性增加,不利于后期项目的升级和维护。

	**将被调用者对象注入调用者对象**
	在使用 Spring 框架之后,对象的实例不再由调用者来创建,而是 Spring 容器来创建, Spring 容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了 Spring 容器,控制权发生了反转,这就是 Spring 的控制反转。
	从 Spring 容器的角度来看,Spring 容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是 Spring 的依赖注入。

	**2. 依赖注入的实现方式**
		依赖注入的作用就是在使用 Spring 框架创建对象时,动态地将其所依赖的对象注入 Bean 组件中,其实现方式通常有两种,一种是属性 setter 方法注入,另一种是构造方法注入,具体介绍如下。
		a). 属性 setter 方法注入 :指 Spring 容器使用 setter 方法注入被依赖的实例。通过调用无参构造器或无参静态工厂方法实例化 Bean 后,调用该 Bean 的 setter 方法,即可实现基于 setter 方法的依赖注入。
		b). 构造方法注入 : 指 Spring 容器使用构造方法注入被依赖的实例。基于构造方法的依赖注入通过调用带参数的构造方法来实现,每一个参数代表一个依赖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值