Spring框架解析

一、Spring组件概览

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架,是一系列轻量级Java EE框架的集合,是潜在地一站式解决方案,定位于与典型应用相关的大部分基础结构。

Spring 的核心要点:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。

图 1. Spring 框架的 7 个组件
Spring 框架图示
组成 Spring 框架的每个组件都可以单独存在,或者与其他一个或多个组件联合实现。每个组件的功能如下:

Spring Core核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory 使用IOC模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

Spring Context:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息,包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。AOP模块提供了AOP(拦截器)机制,并提供常用的拦截器,供用户自定义和配置。

Spring DAO:DAO模块Spring 提供对JDBC的支持,对JDBC进行封装,允许JDBC使用Spring资源,并能统一管理JDBC事物,并不对JDBC进行实现。JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。

Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map,没有提供spring自己的实现。

Spring Web:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

Spring MVC:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

二、IOC和AOP

Spring 的两大特性:IOCAOP

1、IOC

IOC:控制权由应用代码转到外部容器,即控制权的转移,将控制创建的职责搬进了框架中,从应用代码脱离开来。IOC可以用许多不同的方式去表达,DI仅仅是IOC的一个具体的例子。

使用Spring的IoC容器时只需指出组件需要的对象,在运行时Spring的IoC容器会根据XML配置数据提供给它。

当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能的独立于其他的 Java 类来增加这些类可重用可能性,当进行单元测试时,可以使它们独立于其他类进行测试。IOC有助于将这些类粘合在一起,并且在同一时间让它们保持独立。

spring依赖注入有两种方式:①setter方式注入(设值注入);②构造器方式注入;③自动装配(autowire)功能实现属性自动注入。

Bean 的配置文件是一个 XML 文件,并作为粘合 bean 的类。在这里插入图片描述
构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。在没有设值注入的情况下才会根据配置文件中的构造注入,一旦有设值注入,则构造注入失效,两者都可以注入复杂的数据类型。autowire减少依赖注入配置。

2、AOP

AOP:面向切面编程,一个程序中跨越多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑,比如日志记录、声明性事务、安全性,和缓存等等。

在 OOP 中模块化的关键单元是,而在 AOP 中模块化的关键单元是方面。AOP 将横切关注点从它们所影响的对象中分离出来,然而DI将应用程序对象从彼此中分离出来。

AOP将散落在系统中的“方面”代码集中实现,有助于提高系统可维护性,是一种设计模式,Spring提供了一种实现。

Spring并没有提供日志系统,需要使用AOP方式,借助Spring与日志系统log4j实现自己的日志系统。

三、Spring Beans

Spring Core核心容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁,可以在配置文件中配置Bean初始化函数和消亡函数,这些对象被称为 Spring Beans

BeanFactory是最简单的容器,提供了基础的依赖注入支持。ApplicationContext建立在BeanFactory之上,提供了系统构架服务。

如果Bean的某一个属性没有注入,BeanFactory加载后,直至第一次使用调用getBean方法才会抛出异常。而ApplicationContext则在初始化自身时检验,这样有利于检查所依赖属性是否注入。

Spring延迟加载有2种方法:一是hibernate提供的延迟载入机制;二是Spring框架提供的DAO模式结合Hibernate延迟加载的Web方案。

bean的生命周期
创建:<bean name=”” class=”” 额外属性>。
初始化:配置init-method/实现接口InitializingBean。
调用:context.getBean(),进行方法的调用。
销毁:配置destroy-method/实现DisposableBean接口。

如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。默认情况下Spring中定义的Bean是以单例模式创建的,每次指定别名取得的Bean时都会产生一个新的实例。

四、Spring事务管理

spring事务可以分为编程式事务声明式事务。编程式事务需要你在代码中直接加入处理事务的逻辑,显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法。声明式的事务的做法是在配置文件里面定义一下什么时候需要事务,到时候系统会自动commit,出异常了自动rollback。如果你的应用中存在大量事务操作,应使用声明式事务。

Spring事务管理即按照给定的事务规则来执行提交或者回滚操作。Struts2的声明式事务管理力度是级别的,Spring是方法级别的。

TransactionDefinition接口用于定义一个事务,包含了事务的静态属性,即给定的事务规则,PlatformTransactionManager接口用于执行具体的事务操作,TransactionStatus 接口用于表示一个运行着的事务的状态。

事务属性的种类: 传播行为、隔离级别、只读和事务超时。

a) 传播行为定义了被调用方法的事务边界:
在这里插入图片描述
b) 隔离级别
在操作数据时可能带来 3 个副作用,分别是脏读、不可重复读、幻读。为了避免这 3 种副作用的发生,在标准的 SQL 语句中定义了 4 种隔离级别,分别是未提交读、已提交读、可重复读、可序列化。而在 spring 事务中提供了 5 种隔离级别来对应在 SQL 中定义的 4 种隔离级别,如下:
在这里插入图片描述
c) 只读
如果在一个事务中所有关于数据库的操作只读取数据库中的数据,而并不更新数据,那么应将事务设为只读模式( READ_ONLY_MARKER ),更有利于数据库进行优化 。因为只读的优化措施是事务启动后由数据库实施的,因此,只有将那些具有可能启动新事务的传播行为的方法的事务标记成只读才有意义。

d) 事务超时
如果一个事务长时间运行,这时为了尽量避免浪费系统资源,应为这个事务设置一个有效时间,使其等待数秒后自动回滚,事务有效属性也需要给那些具有可能启动新事物的传播行为的方法的事务标记才有意义。

下图定义了声明式事务的配置模板

<!--spring对象txProxyTemplate是一个事务代理抽象工厂bean-->
<bean id="txProxyTemplate" abstract="true"
class=
"org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
	
	<!--注入sessionFactory属性-->
    <property name="transactionManager" ref="myTransactionManager" />

<!--事务属性-->
<property name="transactionAttributes">      
 <props>
 		
 		<!--对get方法采用只读事务-->
        <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
         <prop key="*">PROPAGATION_REQUIRED</prop>
     </props>
</property> 
</bean>

配置需要事务管理的bean的代理时,通过parent引用这个配置模板,代码如下:

<bean id="petBiz" parent="txProxyTemplate">
         <property name="target" ref="petTarget"/>
</bean>

五、Spring DAO

Spring提供的DAO(数据访问对象)支持的主要目的是便于以标准的方式使用不同的数据访问技术,支持了JDBC、JDO和Hibernate。

Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException,开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。

在Spring框架中获取连接池可以通过DBCP数据源、C3P0数据源、Spring的数据源实现类(DriverManagerDataSource)、获取JNDI数据源。

六、Servlet

Servlet是一个特殊的Java类,它必须直接或间接实现Servlet接口。Servlet接口定义了Servelt的生命周期方法。Servlet客户线程调用service方法响应客户的请求。

当多个客户请求一个Servlet时,Web容器可通过同步访问一个servlet的单独实例、或者通过维护一个Web组件池为每个实例调用一个新的请求来实现。

RequestDispatcher.forward()方法调用目标页面,是请求转发,前后页面共享一个request ,浏览器将不会知道这个过程,URL不变,比重定向更快。

HttpServletResponse.sendRedirect()方法使第一个页面通知浏览器发送一个新的页面请求,是重新定向,前后页面不是一个request,URL更新。

HttpServletResponse.encodeURL(java.lang.String url)方法能重写 URL

开发servlet继承HttpServlet时,一般不对service方法进行重载,只重载doXxx()方法,减少了开发工作量。但如果重载了service方法,doXXX()方法也是要重载的。

Servlet过滤器的xml配置包括两部分:
第一部分是过滤器在Web应用中的定义,由<filter>元素表示,包括<filter-name>和<filter-class>两个必需的子元素。
第二部分是过滤器映射的定义,由<filter-mapping>元素表示,可以将一个过滤器映射到一个或者多个Servlet或JSP文件,也可以采用url-pattern将过滤器映射到任意特征的URL。

七、Spring MVC

SpringMVC是Spring中的模块,它实现了mvc设计模式的web框架,首先用户发出请求,请求到达SpringMVC的前端控制器(DispatcherServlet),前端控制器根据用户的url请求处理器映射器查找匹配该url的handler,并返回一个执行链,前端控制器再请求处理器适配器调用相应的handler进行处理并返回给前端控制器一个modelAndView,前端控制器再请求视图解析器对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染并把数据装入到request域,返回给用户。

spring mvc的入口是servlet,而struts2是filter

spring mvc用的是独立的AOP方式,struts2有以自己的interceptor机制。

spring mvc的方法之间基本上独立的,独享request response数据,struts2所有Action变量是共享的。

DispatcherServlet负责处理HTTP请求、加载配置文件、初始化上下应用对象ApplicationContext、根据用户的请求返回相应的视图给用户。实现业务操作时在service层。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值