介绍
Spring,作为一个开源框架,是一个轻量级的解决方案,在Java Web开发方面非常流行。Spring的产生是为了解决企业应用开发的复杂性,其可以一站式构建企业级应用。从结构方面来说,Spring 框架是一个由多个定义良好的模块组成的分层架构(分层架构允许用户选择使用其中一个或多个组件,同时为J2EE应用的开发几桶继承的框架)。
Spring 框架模块图
什么是Spring?
Spring是一个以IoC(Inversion of Control, 控制反转) 和 AOP(Aspect Oriented Programming) 为内核的框架。这里的IoC是Spring的基础,其实现的是一种控制,过去构造对象通过new+构造方法,而现在是通过Spring构建对象。DI(Dependency Injection,依赖注入) 与 IoC拥有相同含义,但是两者是从两个不同的角度来描述同一个概念。
IoC(控制反转) & DI(依赖注入)
控制反转 & IoC
在面向对象传统编程方式的时候,获取对象的方式通常是用new关键字+构造器主动创建一个对象。Spring中的IoC方式对象的生命周期由Spring框架提供的IoC容器来管理,直接从IoC容器中获取一个对象,从而控制权从应用程序交给了IoC容器。理论上,IoC实际上是借助了“第三方”实现了对具有依赖关系的对象的解耦。
应用程序在没有应用IoC容器之前,如果对象A依赖对象B,那么对象A会在实例化或者运行到某一点的时候,自己必须主动创建对象B或者直接使用已经被创建好的对象B,其中无论是创建对象B,还是对象A自己创建对象B,控制权都在应用程序自身。但是在应用程序引入了IoC容器之后,对象A和对象B就失去了直接联系,那么当对象A实例化和运行时,如果需要对象B,IoC容器会自动创建一个对象B注入到对象A所需要的地方。由此,对象A获得依赖对象B的过程,有主动行为编程被动行为,即把创建对象交给了IoC容器处理,控制权点到过来了,这就是所谓的控制反转。
依赖注入 & DI
所谓的依赖注入,就是由IoC容器在运行期间动态地将某种依赖关系注入到对象之中。比如,将对象B注入给对象A的成员变量。实际上,依赖注入和控制反转是从不同角度对同一个事物的描述。依赖注入是从应用程序角度描述的,即应用程序依赖容器创建并注入它所需要的外部资源。而控制反转是从容器角度描述的,即即有容器控制应用程序,有容器反向地先发个应用程序注入应用程序所需要的外部资源。
使用DI & IoC的好处
- 拥有较好的维护性,便于单元测试。调试程序和诊断故障。代码中的每一个Class都能够单独测试,彼此之间互不影响,只要保证自身的功能无误就行,这就是组件之间低耦合带来的好处
- 每个开发团队的成员只需要关注自己需要实现的业务逻辑,可以做到完全不用关心其他人的工作进展,因为你的任务跟别人没有任何关系,你的任务可以单独测试,不用依赖别人的组件,降低相互之间的责任模糊区间。所以,在一个中大型项目中,团队成员分工明确,责任清晰,很容易将一个大的任务划分为细小的子任务,开发效率和产品质量必将得到大幅提高。
- 可复用性好,可以吧具有普遍性的常用数组独立出来,反复应用到项目中的其他部分,或者其他项目,当人这也是面向对象的基本特征。显然,IoC更好地贯彻了这一原则,提高了模块的可复用性。符合接口标注了实现都可以插接到支持此标准的模块中。
- 生成对象的方式转换为外置方式,把对象生成放在配置文件中进行定义。这样,更换一个实现子类将会变得很简单,只要修改配置文件就可以了,完全具有热插拔特性。
IoC 和 Di 的具体实现
Spring框架主要功能就是通过其核心容器来实现的。Spring框架提供了两种核心容器:BeanFacotry 和 ApplicationContext。IoC/DI 通常由seeter注入和构造方法注入两种实现方式。
在Spring IoC 中,主要组件有Beans、配置文件(applicationContext.xml)或者配置类、BeanFactory接口以及其相关类、ApplicationContext接口以及其相关类。 其中这里的Beans是指项目中提供业务功能的Bean(容器需要管理的组件),Beans其实就是一个常见的JavaBean或者Java类。在Spring中,对Bean的管理是在配置文件中或者配置类中进行的,在Spring容器中编辑配置文件管理Bean又称为Bean的装配,世界上装配就是告诉容器哪些Bean是需要的,以及容器是如何使用IoC将它们配合起来的。在过去,Bean的配置是通过一个XML配置文件完成,可以命名为applicationContext.xml。但是随着时间推进,为了使过程更加简化和高效,Bean的配置后来逐渐演变成通过在配置类内进行配置。
BeanFactory:采用工厂设计模式,负责读取Bean的配置文件,管理对象的生成、加载、维护Bean对象和其它Bean对象之间的依赖关系,负责Bean的生命周期。具体的代码是:BeanFactory factory = new XmlBeanFactory(new FileInputStream(“applicationContext.xml”))。
ApplicationContext接口
这个接口提供高级功能的容器,基本功能与BeanFactory类似,但是其多了以下功能
- 提供访问资源文件更方便的方法
- 支持国际化消息
- 提供文资料系解析的方法
- 可以发布时间,对事件感兴趣的Bean可以接收到这些事件
ApplicationContext 拥有以下实现类
- FileSystemXmlApplicationContext:从文件系统中的XML文件加载散文信息中定义的信息
- ClassPathXmlApplicationContext:从内陆金总的XML文件加载上下文中定义的信息,把上下文定义的文件当成类路径资源
- XmlWebApplicationContext: 从Web系统中的XML文件加载上下文定义的信息。
FileSystemXmlApplicationContext VS ClassPathXmlApplicationContext
FileSystemXmlApplicationContext只能再指定路径中查询配置文件,而ClassPathXmlApplicationContext 可以在整个类路径中查询配置文件
Bean
Spring如同一个工厂,用于生产和管理容器中的Bean。如果要使用这个工厂,需要开发者对Spring配置文件进行配置,在现实开发中,过去常常采用XML文件方式进行配置,现在常常采用配置类的方式进行配置。
Bean的作用域
Bean的实例定义了7中作用域,分别是singleton, prototype, request, session, globalSession, application, websocket。其中singleton和prototype为最常见的两种。
Singleton 作用域
Singleton是Spring容器默认的作用域,当Bean的作用域为singleton时,Spring容器就只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean的id属性相匹配,就会返回同一个Bean的实例。singleton作用域对于无会话状态的Bean来说是最理想的选择。其中有两种使用方法:1、xml文件法 2、注解法
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<bean id="student" class="com.project.bean.StudentBean" scope="singleton"></bean>
</beans>
package com.project.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.ibatis.annotations.ConstructorArgs;
import org.springframework.context.annotation.Scope;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Scope(scopeName = "singleton")
public class StudentBean {
/**
* 学号
*/
public int id;
/**
* 学生姓名
*/
public String name;
/**
* 学生年龄
*/
public int age;
/**
* 学生性别
*/
public String gender;
}
Prototype 作用域
对需要保持会话状态的Bean应用使用prototype作用域。在使用prototype作用域时,Spring容器为每个对对该Bean的请求都创建一个新的实例。
装配方式
-
XML装配方式
Spring提供了两种基于XML的装配方式:设置注入和构造注入。Spring实例化Bean的过程中,Spring首先会调用Bean的默认构造方法来实例化Bean对象,然后通过反射方式调用setter()方法来注入属性值。因此,设置注入有两点要求必须被满足:
1、Bean类必须提供一个默认的无参构造
2、Bean类必须为只需要注入的属性提供对应的setter方法 -
Annotation 注解装配方式
-
自动装配方式