Spring,作为一个开源框架,是一个轻量级的解决方案,在Java Web开发方面非常流行。Spring的产生是为了解决企业应用开发的复杂性,其可以一站式构建企业级应用。从结构方面来说,Spring 框架是一个由多个定义良好的模块组成的分层架构(分层架构允许用户选择使用其中一个或多个组件,同时为J2EE应用的开发几桶继承的框架)。
Spring是一个以IoC(Inversion of Control, 控制反转) 和 AOP(Aspect Oriented Programming) 为内核的框架。这里的IoC是Spring的基础,其实现的是一种控制,过去构造对象通过new+构造方法,而现在是通过Spring构建对象。DI(Dependency Injection,依赖注入) 与 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容器处理,控制权点到过来了,这就是所谓的控制反转。
所谓的依赖注入,就是由IoC容器在运行期间动态地将某种依赖关系注入到对象之中。比如,将对象B注入给对象A的成员变量。实际上,依赖注入和控制反转是从不同角度对同一个事物的描述。依赖注入是从应用程序角度描述的,即应用程序依赖容器创建并注入它所需要的外部资源。而控制反转是从容器角度描述的,即即有容器控制应用程序,有容器反向地先发个应用程序注入应用程序所需要的外部资源。
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类似,但是其多了以下功能
ApplicationContext 拥有以下实现类
FileSystemXmlApplicationContext VS ClassPathXmlApplicationContext
FileSystemXmlApplicationContext只能再指定路径中查询配置文件,而ClassPathXmlApplicationContext 可以在整个类路径中查询配置文件
Spring如同一个工厂,用于生产和管理容器中的Bean。如果要使用这个工厂,需要开发者对Spring配置文件进行配置,在现实开发中,过去常常采用XML文件方式进行配置,现在常常采用配置类的方式进行配置。
Bean的实例定义了7中作用域,分别是singleton, prototype, request, session, globalSession, application, websocket。其中singleton和prototype为最常见的两种。
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;
}
对需要保持会话状态的Bean应用使用prototype作用域。在使用prototype作用域时,Spring容器为每个对对该Bean的请求都创建一个新的实例。
XML装配方式
Spring提供了两种基于XML的装配方式:设置注入和构造注入。Spring实例化Bean的过程中,Spring首先会调用Bean的默认构造方法来实例化Bean对象,然后通过反射方式调用setter()方法来注入属性值。因此,设置注入有两点要求必须被满足:
1、Bean类必须提供一个默认的无参构造
2、Bean类必须为只需要注入的属性提供对应的setter方法
Annotation 注解装配方式
自动装配方式