Spring 整理资料
撰写时间: 2020-01-10 总共: 4842 字 转载请注明: BY-SA 4.0(除特别声明或转载文章外)
概述
Spring是当前主流的Java Web开发框架,为企业级应用提供了丰富的功能。最早由Rod Johnson创建。
主要是
- Spring体系结构
- Spring开发环境
- Spring核心容器
体系结构
核心容器
Spring 的核心容器是其他模块建立的基础:
- Spring-core
- Spring-beans
- Spring-context
- Spring-context-support
- Spring-expression
Spring-core
提供框架的基本组成部分:
- 控制反转(Inversion of Control , IoC)
- 依赖注入(Dependency Injection,DI)
Spring-beans
提供BeanFactory,工厂模式经典实现。Spring将管理的对象称之为Bean
Spring-context
建立在core和beans模块之上,提供框架式的对象访问方式,是访问定义和配置的任务对象的媒介。
- ApplicationContext
Spring-context-support
支持整合第三方库到Spring应用程序上下文,比如用于高速缓存,任务调度。
Spring-expression
提供强大的表达式语言支持运行时查询和操作对象图,是对JSP 2.1规范中统一表达式语言 (Unified EL)的扩展。
支持设置和获取属性值、属性分配、方法调用、访问数组、集合、和索引器的内容、逻辑和算术运算、变量命名、IoC容器中以 名 称 检索对象、列表投影、选择以及常用的列表聚合。
AOP 和Instrumentation
AOP(Aspect Oriented Programming)面向切面的编程
- Spring-aop
- Spring-aspects
- Spring-instrument
Spring-aop
提供一个符合AOP要求的实现,允许定义方法拦截器和切入点等。
Spring-aspects
提供与 AspectJ(一个功能强大且成熟的AOP框架) 的集成功能。
Spring-instrument
提供类植入(Instrumentation)、支持和类加载器实现。
消息
Spring 4.0 后新增了消息模块
- Spring-messaging
Spring-messaging
提供对消息传递体系结构和协议的支持
数据访问和集成
数据方面主要由JDBC、ORM、OXM、JMS和事务模块组成。
- Spring-jdbc
- Spring-orm
- Spring-oxm
- Spring-jms
- 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
- Spring-web
- Spring-webmvc
- Spring-websocket
- Portlet
Spring-web
提供基本的web开发集成功能。
Spring-webmvc
包含用于web程序的Sping MVC 和 REST Web Services 实现。
Spring-websocket
提供WebSocket 和 SockJS的实现。
Portlet
类似与Servlet,提供Portlet环境下的MVC实现。
测试
- Spring-test
Spring-test
支持使用JUnit、TestNG、Spring组件进行单元测试和集成测试。
开发环境
IDE的选择。
- JDK配置
- Web服务器配置
- 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>
实例化方式
- 构造方法(常用)
- 静态工厂
- 实例工厂
<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")
}
}
作用域
-
singleton
默认作用域
当将bean的scope设置为singleton时,Spring IoC容器仅生成和管理一个Bean实例。在使用id或name获取Bean实例时,IoC容器将返回共享的Bean实例。
-
prototype
Spring IoC容器将为每次请求创建一个新的实例。
-
request
-
session
-
application
-
websocket
6种作用域中,singleton和prototype是最常用的两种,后面4种作用域仅在WebSpring应用程序上下文中使用。
生命周期
实例化→初始化→使用→销毁等阶段
Spring容器可以管理singlleton作用域Bean的生命周期,在此作用域下,Spring能够精确地知道Bean何时被创建,何时初始化完成,以及何时被销毁。而对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean的实例后,Bean实例就交给了客户端的代码管理,Spring容器将不再跟踪其生命周期,并且不会管理那些被配置成prototype作用域的Bean。
Bean装配方式
Bean依赖注入到Spring容器中,Bean的装配方式即是Bean依赖注入的方式。
- 基于XML配置
- 基于构造方法的注入
- 基于setter的注入
- 基于注解
其中XML配置已经不是主流
基于注解的方式,Spring提供了许多注解。
@Component
// 表示该类为一个Bean组件
// 细化出各部分的Bean组件含义
@Repository
// dao(数据访问)层
@Service
// 业务逻辑层
@Controller
// 控制层
@Autowired
// 对类成员变量、方法、构造方法进行标注,完成自动装配。默认按照Bean的类型进行装配。
@Resource
// @Autowired的功能一样,区别在于该注解默认是按照名称来装配注入的,只有当找不到与名称匹配的Bean时才会按照类型来装配注入
@Qualifier
// 与@Autowired注解配合使用。当@Autowired注解需要按照名称来装配注入时需要和该注解一起使用,Bean的实例名称由@Qualifier注解的参数指定