Spring 整理资料

概述

Spring是当前主流的Java Web开发框架,为企业级应用提供了丰富的功能。最早由Rod Johnson创建。

主要是

  1. Spring体系结构
  2. Spring开发环境
  3. Spring核心容器

体系结构

核心容器

Spring 的核心容器是其他模块建立的基础:

  1. Spring-core
  2. Spring-beans
  3. Spring-context
  4. Spring-context-support
  5. Spring-expression

Spring-core

提供框架的基本组成部分:

  1. 控制反转(Inversion of Control , IoC)
  2. 依赖注入(Dependency Injection,DI)

Spring-beans

提供BeanFactory,工厂模式经典实现。Spring将管理的对象称之为Bean

Spring-context

建立在core和beans模块之上,提供框架式的对象访问方式,是访问定义和配置的任务对象的媒介。

  1. ApplicationContext

Spring-context-support

支持整合第三方库到Spring应用程序上下文,比如用于高速缓存,任务调度。

Spring-expression

提供强大的表达式语言支持运行时查询和操作对象图,是对JSP 2.1规范中统一表达式语言 (Unified EL)的扩展。

支持设置和获取属性值、属性分配、方法调用、访问数组、集合、和索引器的内容、逻辑和算术运算、变量命名、IoC容器中以 名 称 检索对象、列表投影、选择以及常用的列表聚合。

AOP 和Instrumentation

AOP(Aspect Oriented Programming)面向切面的编程

  1. Spring-aop
  2. Spring-aspects
  3. Spring-instrument

Spring-aop

提供一个符合AOP要求的实现,允许定义方法拦截器和切入点等。

Spring-aspects

提供与 AspectJ(一个功能强大且成熟的AOP框架) 的集成功能。

Spring-instrument

提供类植入(Instrumentation)、支持和类加载器实现。

消息

Spring 4.0 后新增了消息模块

  1. Spring-messaging

Spring-messaging

提供对消息传递体系结构和协议的支持

数据访问和集成

数据方面主要由JDBC、ORM、OXM、JMS和事务模块组成。

  1. Spring-jdbc
  2. Spring-orm
  3. Spring-oxm
  4. Spring-jms
  5. Spring-tx

Spring-jdbc

提供JDBC的抽象层,消除繁琐的JDBC编码和数据库厂商特有的错误代码解析。

Spring-orm

为流行的对象关系映射(Object Relational Mapping)API提供集成层,比如JPA、Hibernate。

Spring-oxm

提供支持对象/XML映射的抽象层实现,比如:JAXB、Castor、JiBX、XStream。

Spring-jms

jms(Java Messaging Service)Java消息传递服务。提供与spring-messaging模块的集成。

Spring-tx

支持用于实现特殊接口和所有POJO(Plain Ordinary Java Object)简单的Java对象的编程和声明式事务管理

Web

  1. Spring-web
  2. Spring-webmvc
  3. Spring-websocket
  4. Portlet

Spring-web

提供基本的web开发集成功能。

Spring-webmvc

包含用于web程序的Sping MVC 和 REST Web Services 实现。

Spring-websocket

提供WebSocket 和 SockJS的实现。

Portlet

类似与Servlet,提供Portlet环境下的MVC实现。

测试

  1. Spring-test

Spring-test

支持使用JUnit、TestNG、Spring组件进行单元测试和集成测试。

开发环境

IDE的选择。

  1. JDK配置
  2. Web服务器配置
  3. Maven配置等

核心

IoC 和 DI 控制反转和依赖注入

控制反转是Spring框架的基础,也是核心理念。

控制反转(Inversion of Control, IoC)是一个比较抽象的概念,是Spring框架的核心,用来消减计算机程序的耦合问题。依赖注入(Dependency Injection,DI)是IoC的另外一种说法,只是从不同的角度描述相同的概念。

当Spring框架出现后,对象的实例不再由调用者来创建,而是由Spring容器来创建。控制权由调用者转移到Spring容器,控制权发生了反转,这就是Spring的控制反转。

从Spring容器角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入。综上所述,控制反转是一种通过描述(在Spring中可以是XML或注解)并通过第三方去产生或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入。

IoC容器

Spring IoC容器设计主要基于BeanFactory和ApplicationContent两个接口。

BeanFactory

提供了完整的IoC服务支持,是一个管理Bean的工厂,主要负责初始化各种Bean。

ApplicationContext

ApplicationContext是BeanFactory的子接口,也称为应用上下文。ApplicationContext接口除了包含BeanFactory的所有功能以外,还添加了对国际化、资源访问、事件传播等内容的支持。

依赖注入

实现IoC容器的方法是依赖注入,依赖注入的作用是在使用Spring创建对象时动态地将其所依赖的对象(属性值等)注入Bean组件。

构造方法注入

利用Java反射机制,通过构造方法完成依赖注入。

在配置xml文件中以 bean 的 子元素 constructor-arg 完成

以setter方法注入

Spring主流的注入方式,也是通过反射机制实现。

在配置xml文件中以 bean 的 子元素 property 完成

Spring Bean

在Spring的应用中,Spring IoC容器可以创建、装配和配置应用组件对象,这里的组件对象称为Bean。

配置方式

支持XML和Properties两种格式的配置文件

常用XML格式

<!--applicationContext.xml-->

<beans>
	<bean id="唯一标识" class="具体实现类的名" scope="作用域" >
    	<!--以构造方法进行依赖注入-->
        <constructor-arg index="参数的序号(0开始)" ref="其他bean的引用id"/> 
        <!--以setter进行依赖注入-->
        <property 
                  name="bean实例相应属性名称" 
                  value="属性值" 
                  ref="其他bean的引用id">
            
            <!--以下分别是list、map、set类型的依赖注入-->
        	<list></list>
            <map>
            	<entry></entry>
            </map>
            <set></set>
        </property>
    </bean>
</beans>

实例化方式

  1. 构造方法(常用)
  2. 静态工厂
  3. 实例工厂
<beans>
    <!--注意3种不同方法的对象class的方法-->
    
    
	<!--构造方法实例化bean-->
    <bean id="constructorInstance" class="instance.BeanClass"/>
    
    <!--在该bean里需要存在static BeanClass bean实例
	(静态工厂的实现:返回该类中的static BeanClass)即 factory-method对应-->
    <bean id="static" class="instance.BeanStaticFactory" factory-method="createInstance"/>
    
      <!--在该bean里需要存在
	返回 new BeanClass() 的实例工厂实现方法
	factory-bean 对应的bean引用 -->
    <bean id="Factory" class="instance.BeanFactory"/>
    <bean id="instance" factory-bean="Factory" factory-method="createBeanClassInstance"/>

    
</beans>

在使用到Bean的时候需要我们进行实例化:

public class Test{
    public static void main(String[] args){
        // 初始化Spring容器 加载相关配置文件
        ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml")
        // 通过bean的构造方法进行
        BeanClass b1 = (BeanClass)appCon.getBean("constructorInstance")
        // 通过静态工厂
        BeanClass b2 = (BeanClass)appCon.getBean("static")
        // 通过实例工厂
        BeanClass b3 = (BeanClass)appCon.getBean("instance")
    }
}

作用域

  1. singleton

    默认作用域

    当将bean的scope设置为singleton时,Spring IoC容器仅生成和管理一个Bean实例。在使用id或name获取Bean实例时,IoC容器将返回共享的Bean实例。

  2. prototype

    Spring IoC容器将为每次请求创建一个新的实例。

  3. request

  4. session

  5. application

  6. websocket

6种作用域中,singleton和prototype是最常用的两种,后面4种作用域仅在WebSpring应用程序上下文中使用。

生命周期

实例化→初始化→使用→销毁等阶段

Spring容器可以管理singlleton作用域Bean的生命周期,在此作用域下,Spring能够精确地知道Bean何时被创建,何时初始化完成,以及何时被销毁。而对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean的实例后,Bean实例就交给了客户端的代码管理,Spring容器将不再跟踪其生命周期,并且不会管理那些被配置成prototype作用域的Bean。

Bean装配方式

Bean依赖注入到Spring容器中,Bean的装配方式即是Bean依赖注入的方式。

  1. 基于XML配置
    1. 基于构造方法的注入
    2. 基于setter的注入
  2. 基于注解

其中XML配置已经不是主流

基于注解的方式,Spring提供了许多注解。

@Component
// 表示该类为一个Bean组件
// 细化出各部分的Bean组件含义
@Repository
// dao(数据访问)层
@Service
// 业务逻辑层
@Controller
// 控制层

@Autowired
// 对类成员变量、方法、构造方法进行标注,完成自动装配。默认按照Bean的类型进行装配。
@Resource
// @Autowired的功能一样,区别在于该注解默认是按照名称来装配注入的,只有当找不到与名称匹配的Bean时才会按照类型来装配注入

@Qualifier
// 与@Autowired注解配合使用。当@Autowired注解需要按照名称来装配注入时需要和该注解一起使用,Bean的实例名称由@Qualifier注解的参数指定


奖励一下