个人心得
我们所有的一切就要从这张图开始说起,相信大家一定都看到过这张图,抑或你没有直接见过,也一定看见过它的复制版本,很多经典的书籍上介绍spring整体框架结构也都是从这张图开始介绍的。那我们,今天就来看看这张图。
看一个框架,我们首先应该看的是其根基,我们发现最下面的Test模块撑起了整个spring框架,这也不足为奇,一个好的系统首先应该是便于测试的我想这点并没有争议。接下来就是core Container,你知道的,spring最核心的模块IOC就在这里体现了,我们可以看到它主要包含了四个小的模块,也就不赘述了。
在网上看,就是我们久违的AOP模块,还有Aspects,其余的两个我也不太懂啦,一会在过去看文档。
让我们闭上眼睛想一想,我们的程序最重要的功能是什么?当然是加工数据使其能够产出,这种产出可能是前端的呈现,也可能只是一个API的返回。而数据的来源数据库我们又该如何与其建立连接呢?我们常规使用的方式当然就是通过jdbc与数据库建立连接,执行CRUD操作,但是,有时候繁杂的数据库操作会变得特别难以管理,这个时候我们就需要引入ORM框架来协助我们。对于数据库操作而言,还有一件非常重要的事情,那就是事务,当然,spring也为我们事务的控制提供了多种方法,其不仅支持在代码中写,还支持纯配置文件配置,当然,在代码中写灵活性不高,但是控制的粒度比较细。
web一直是我们关注的中心店,因为java最为擅长的就是构建web服务程序,这是不可否认的。而这一个部分,spring-mvc对于servlet的高度封装,还有websocket通信,都为我们开发带来了极大的便利。
一张图的故事
spring介绍:点击这里
Core Container - 核心容器
spring-core:Spring中的核心工具类包。
1.核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开。
2.这个模块中,非常重要的接口就是ApplicationContext接口。这个接口继承了BeanFactory接口,也就是说它也有管理Bean的功能。但他和BeanFactory有什么不同呢?它是在BeanFactory基础之上,又增加了国际化,容器事件(可以监听容器的一些事件,来做一些操作)等。
spring-beans:Spring中定义bean的组件。
spring-context:Spring的运行容器。
Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能。提供框架式Bean访问方式,其他程序可以通过Context访问Spring的Bean资源。
spring-context-support:Spring容器的扩展支持。
spring-expression:Spring的表达式语言支持。
AOP - 面向切面编程
spring-aop:基于代理的AOP支持。
通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了Spring框架中。所以,可以很容易地使 Spring框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。AOP把一个业务流程分成几部分,例如权限检查、业务处理、日志记录,每个部分单独处理,然后把它们组装成完整的业务流程。每个部分被称为切面或关注点。
AOP的实现原理为动态代理技术,一共有两种代理模式:
1.ProxyFactoryBean代理工厂对象
Spring内置代理类,引入一个中间层,能够创建不同类型的对象,利用它可以实现任何形式的AOP。
2.TransactionProxyFactoryBean事务代理工厂对象
常用在数据库编程上,Spring利用TransactionProxyFactoryBean对事务进行管理,在指定方法前利用AOP连接数据库并开启事务,然后在指定方法返回后利用AOP提交事务并断开数据库。
Spring的声明式事务
注: Spring的声明式事务能不能为普通的类产生代理接口,能不能在代码中使用Try/Catch能捕获异常,如果不可以,请说明原因 ?
不能。Spring的声明式事务为实现类产生代理。不能在代码中使用Try/Catch,因为代码中捕获了异常,Spring容器捕获不了异常。
<bean name=”baseTransactionProxy” class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”>
⑴<!– 为事务代理bean注入事务管理器–>
<property name=”transactionManager” ref=”transactionManager”>
</property>
⑵<!– 设置事务属性–>
<property name=”transactionAttributes”>
<props>
⑶<!– 所有方法采用required的事务策略 ->
<prop key=”*”>PROPAGATION_REQUIRED</prop>
</props>
</property>
⑷<!– 为事务代理bean设置目标bean –>
<property name=”target” ref=”userDao”>
</property>
</bean>
⑸<!– 目标bean –>
<bean name=”userDao” class=”com.dao.userDao”>
<property name=”dataSource” ref=”dataSource” /></property>
</bean>
编程式事务
PlatformTransactionManager接口
//核心类
TransactionDefinition //事务属性定义
TranscationStatus //代表了当前的事务,可以提交,回滚。
PlatformTransactionManager //核心接口的子类
spring-aspects:集成Aspects的AOP支持。
WEB(MVC)
spring-web:提供web的基础功能。
Web模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。Web层使用Web层框架,可选的,可以是Spring自己的MVC框架,或者提供的Web框架,如Struts、Webwork、tapestry和jsf。
Web模块用于整合Web框架,将Web框架也纳入Spring的管理之中。如Spring提供继承方式与代理方式整合Struts,继承方式不需要更改任何配置文件,只把Action继承自ActionSupport即可,但会对Spring产生依赖。代理方式需要在struts-config.xml中配置,由Spring全盘代理,因此可以使用Spring的各种资源、拦截器等。
spring-webmvc:提供springmvc的功能。
MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的。Spring的MVC框架提供清晰的角色划分:控制器、验证器、命令对象、表单对象和模型对象、分发器、处理器映射和视图解析器。Spring支持多种视图技术。
Spring MVC 的工作流程:
⑴ 用户发送请求至前端控制器DispatcherServlet
⑵ DispatcherServlet收到请求调用HandlerMapping处理器映射器。
⑶ 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
⑷ DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
⑸ 执行处理器(Controller,也叫后端控制器)。
⑹ Controller执行完成返回ModelAndView
⑺ HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
⑻ DispatcherServlet将ModelAndView传给ViewReslover视图解析器
⑼ ViewReslover解析后返回具体View
⑽ DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
⑾ DispatcherServlet响应用户。从上面可以看出,DispatcherServlet有接收请求,响应结果,转发等作用。有了DispatcherServlet之后,可以减少组件之间的耦合度。
spring-websocket:提供web socket支持。
spring-webmvc-portlet:提供Portlet环境的支持。
Data Access/Integration - 数据访问/集成
spring-jdbc:提供对jdbc连接的封装功能。
DAO (Data Access Object)提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。 并且,JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plain old Java objects)都适用。
获取数据链接池的方式:
1:DBCP数据源
DBCP类包位于 /lib/jakarta-commons/commons-dbcp.jar,DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池,所以在类路径下还必须包括/lib/jakarta-commons/commons-pool.jar。下面是使用DBCP配置oracle数据源的配置片断:
<bean id=”dataSource”
class=”org.apache.commons.dbcp.BasicDataSource” destroy-method=”close”>
<property name=”driverClassName” value=” oracle.jdbc.driver.OracleDriver ” />
<property name=”url” value=”jdbc:oracle:thin:@localhost:1521:orcl ” />
<property name=”username” value=”root” />
<property name=”password” value=”1234″ />
</bean>
2:C3P0数据源
C3P0是一个开放源代码的JDBC数据源实现项目,它在lib目录中与Hibernate一起发布,实现了JDBC3和JDBC2扩展规范说明的Connection 和Statement 池。C3P0类包位于/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一个Oracle数据源:
<bean id=”dataSource” class=”com.mchange.v2.c3p0.ComboPooledDataSource” destroy-method=”close”>
<property name=”driverClassName” value=” oracle.jdbc.driver.OracleDriver ” />
<property name=”url” value=”jdbc:oracle:thin:@localhost:1521:orcl ” />
<property name=”username” value=”root” />
<property name=”password” value=”1234″ />
</bean>
3.Spring的数据源实现类(DriverManagerDataSource)Spring本身也提供了一个简单的数据源实现类DriverManagerDataSource ,它位于org.springframework.jdbc.datasource包中。这个类实现javax.sql.DataSource接口,但它并没有提供池化连接的机制,每次调用getConnection()获取新连接时,只是简单地创建一个新的连接。因此,这个数据源类比较适合在单元测试或简单的独立应用中使用,因为它不需要额外的依赖类。
<bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource” destroy-method=”close”>
<property name=”driverClassName” value=” oracle.jdbc.driver.OracleDriver ” />
<property name=”url” value=”jdbc:oracle:thin:@localhost:1521:orcl ” />
<property name=”username” value=”root” />
<property name=”password” value=”1234″ />
</bean>
4.获取JNDI数据源
如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,我们可能更希望使用应用服务器本身提供的数据源。应用服务器的数据源使用JNDI开放调用者使用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。下面是一个简单的配置:
<bean id=”dataSource” class=”org.springframework.jndi.JndiObjectFactoryBean”>
<property name=”jndiName” value=”java:comp/env/jdbc/oracle”/>
</bean>
spring-tx:提供对事务的支持。
spring-orm:提供对象-关系映射支持。
ORM 封装包提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。
spring-oxm:提供对象-XML映射支持。
spring-jms:提供消息队列的支持。