Spring体系模块
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
- 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是
BeanFactory
,它是工厂模式的实现。BeanFactory
使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 - Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
- Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
- Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
- Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
- Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
- Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
Spring简化了Java的开发
为了降低Java开发的复杂性,Spring采取了4个关键策略:
- 基于POJO的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实心松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少样板式代码
1.依赖注入(DI)
通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定,对象无需自行创建或管理他们的关系。在Spring中由容器管理对象的依赖关系。带来的最大收益--松耦合
创建应用组件之间协作的行为统称为装配。Spring有多种装配Bean的方式,采用XML是一种很常用的方式。
<bean id="" class="com.java.ClassName">
<constructor-arg value="123"/> 构造器传入参数
</bean>
id填入Bean的ID,class填入类的全类名。
Spring还支持基于Java的配置
@Configuration // 声明当前类为一个配置类
public class Config {
@Bean // 声明为一个Bean
public ClassName className() {
return new ClassName();
}
}
Spring通过应用上下文(Application Context)装载bean的定义并把它们组装起来。Spring应用上下文全权负责对象的创建和组装。Spring自带和多种应用上下文的实现。
3.切面(AOP)
DI能够让相互协作的软件组件保持松散耦合,而面向切面编程允许你把遍布应用各处的功能分离出来形成可重用的组件。例如日志、事物管理、安全等这样的系统服务经常在AOP中使用。
AOP能够使这些服务模块化,并且以声明的方式将他们应用到他们需要影响的组件中。可以将安全、事物和安全与核心业务逻辑相分离。
<aop:config>
<aop:aspect ref="aspect"> //声明一个切面
// 定义切点
<aop:pointcut id="point" expression="execution(* *.method())"/>
// 声明该切点的前置通知
<aop:before pointcut-ref="point" method="afterMethod"/>
// 声明该切点的后置通知
<aop:after pointcut-ref="point" method="afterMethod"/>
</aop:aspect>
</aop:config>
这样就可以在xml中简单配置一个AOP。
4.使用模板消除样板式代码
当使用JDBC查询数据时存在大量的样板式代码。Spring的jdbcTemplate使得执行数据库操作时,避免出现大量的模板式代码。
Bean容器
在基于Spring的应用中,你的应用对象生存于Spring容器(container)中,Spring容器负责创建对象,装配他们,配置他们并管理他们整个生命周期。
Spring容器自带了多个容器实现,可以归为两种不同类型。bean工厂是最简单的容器,提供基本的DI支持。应用上下文基于BeanFactory构建。经常使用的应用上下文:
- AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文。
- AnnotationConfigWebApplicationContext:从一个或者多个基于Java的配置类中加载Spring Web应用上下文。
- ClassPathXMLApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
- FileSystemXmlApplicationContext:从文件系统的一个或多个XML配置文件中加载上下文定义。
- XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义。
无论是从文件系统中装载应用上下文,还是从类路径下装载应用上下文,将bean加载到beanFactory的过程都是相似的。
1.bean的生命周期
- Spring对bean进行实例化
- Spring将值和bean的引用注入到bean对应的属性中;
- 如果bean实现了BeanFactoryAware接口,Spring将bean的ID传递给setBeanName()方法;
- 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入。
- 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入;
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法。
- 如果bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用。
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法。
- 此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到应用上下文被摧毁;
- 如果bean实现了DisposableBean接口,Spring将调用他的destroy()接口方法。同样的,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。