spring

作者: lucode | 来源:发表于2017-11-19 20:41 被阅读7次

    AOP和OOP的区别

    1.面向方面编程AOP,偏重业务处理过程的某个步骤或阶段,强调降低模块之间的耦合度,使代码拥有更好的移植性。
    2. 面向对象编程OOP,则是对业务分析中抽取的实体进行方法和属性的封装。
    AOP好处:AOP将程序分解成各个方面或者说关注点。这使得可以模块化,相当横向上分切了。它可以解决OOP和过程化方法不能够很好解决的横切(crosscut)问题,如:事务、安全、日志等横切关注

    spring 声明式事务和编程式事务

    Spring的特色之一,简单而强大的事务管理功能,包括编程式事务和声明式事务。

    1. Spring中涉及到事务管理的API有100多个,核心的只有三个: TransactionDefinition、PlatformTransactionManager、TransactionStatus。
      所谓事务管理,其实就是“按照给定的事务规则来执行提交或者回滚操作”。
      “给定的事务规则”就是用 TransactionDefinition 表示的。
      “按照……来执行提交或者回滚操作”便是用 PlatformTransactionManager 来表示。
      而 TransactionStatus 用于表示一个运行着的事务的状态。
    2. TransactionDefinition, 该接口在前面已经介绍过,它用于定义一个事务。它包含了事务的静态属性,比如:事务传播行为、超时时间等等。Spring 为我们提供了一个默认的实现类:DefaultTransactionDefinition,该类适用于大多数情况。如果该类不能满足需求,可以通过实现 TransactionDefinition 接口来实现自己的事务定义。
    3. PlatformTransactionManager 用于执行具体的事务操作。
    Public interface PlatformTransactionManager{
       TransactionStatus getTransaction(TransactionDefinition definition)  throws TransactionException;
       void commit(TransactionStatus status)throws TransactionException;
       void rollback(TransactionStatus status)throws TransactionException;
    }
    

    根据底层所使用的不同的持久化 API 或框架,PlatformTransactionManager 的主要实现类大致如下:
    DataSourceTransactionManager :适用于使用JDBC和iBatis进行数据持久化操作的情况。
    HibernateTransactionManager :适用于使用Hibernate进行数据持久化操作的情况。
    JpaTransactionManager :适用于使用JPA进行数据持久化操作的情况。
    另外还有JtaTransactionManager 、JdoTransactionManager、JmsTransactionManager等等。

    1. 编程式事务需要你在代码中直接加入处理事务的逻辑,可能需要在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法,如在执行a方法时候需要事务处理,你需要在a方法开始时候开启事务,处理完后。在方法结束时候,关闭事务. 声明式的事务的做法是在a方法外围添加注解或者直接在配置文件中定义,a方法需要事务处理,在spring中会通过配置文件在a方法前后拦截,并添加事务. 二者区别.编程式事务侵入性比较强,但处理粒度更细. 相当于一个是手动事务,另一个是系统自动事务。 编程试事务就是需要手工写代码提交事务,回滚事务等。 声明性事务就是在配置文件里面定义一下什么时候需要事务,到时候系统会自动commit,出异常了自动rollback,不需要在代码里面写commit或者rollback。

    spring IOC

    spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了,也就是控制权的转让。
    spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。
    我们一般都不直接用BeanFactory,而是用它的实现类 ApplicationContext ,这个类会自动解析我们配置的applicationContext.xml
    Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类。
    事实上,Spring提供了两种不同的容器:一种是最基本的BeanFactory,另一种是扩展的ApplicationContext。
    BeanFactory 仅提供了最基本的依赖注入支持,而 ApplicationContext 则扩展了BeanFactory ,提供了更多的额外功能。二者对Bean的初始化也有很大区别。BeanFactory当需要调用时读取配置信息,生成某个类的实例。如果读入的Bean配置正确,则其他的配置中有错误也不会影响程序的运行。而ApplicationContext 在初始化时就把 xml 的配置信息读入内存,对 XML 文件进行检验,如果配置文件没有错误,就创建所有的Bean ,直接为应用程序服务。相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。

    spring 事务

    PROPAGATION_REQUIRED
    如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

    PROPAGATION_SUPPORTS
    支持当前事务,如果当前没有事务,就以非事务方式执行。

    PROPAGATION_MANDATORY
    使用当前的事务,如果当前没有事务,就抛出异常。

    PROPAGATION_REQUIRES_NEW
    新建事务,如果当前存在事务,把当前事务挂起。

    PROPAGATION_NOT_SUPPORTED
    以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

    PROPAGATION_NEVER
    以非事务方式执行,如果当前存在事务,则抛出异常。

    PROPAGATION_NESTED
    如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

    事务属性的种类:

    传播行为、隔离级别、只读和事务超时
    a) 传播行为定义了被调用方法的事务边界


    image.png

    b) 隔离级别
    在操作数据时可能带来 3 个副作用,分别是脏读、不可重复读、幻读。为了避免这 3 中副作用的发生,在标准的 SQL 语句中定义了 4 种隔离级别,分别是未提交读、已提交读、可重复读、可序列化。而在 spring 事务中提供了 5 种隔离级别来对应在 SQL 中定义的 4 种隔离级别,如下:


    image.png
    c) 只读
    如果在一个事务中所有关于数据库的操作都是只读的,也就是说,这些操作只读取数据库中的数据,而并不更新数据,那么应将事务设为只读模式( READ_ONLY_MARKER ) , 这样更有利于数据库进行优化 。
    因为只读的优化措施是事务启动后由数据库实施的,因此,只有将那些具有可能启动新事务的传播行为 (PROPAGATION_NESTED 、 PROPAGATION_REQUIRED 、 PROPAGATION_REQUIRED_NEW) 的方法的事务标记成只读才有意义。

    如果使用 Hibernate 作为持久化机制,那么将事务标记为只读后,会将 Hibernate 的 flush 模式设置为 FULSH_NEVER, 以告诉 Hibernate 避免和数据库之间进行不必要的同步,并将所有更新延迟到事务结束。
    d) 事务超时
    如果一个事务长时间运行,这时为了尽量避免浪费系统资源,应为这个事务设置一个有效时间,使其等待数秒后自动回滚。与设
    置“只读”属性一样,事务有效属性也需要给那些具有可能启动新事物的传播行为的方法的事务标记成只读才有意义。

    spring 设置注入和构造注入

    http://blog.csdn.net/wu631464569/article/details/51906959

    spring 模块概述

    七大模块,如下:
    1、 Spring Core: Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。
    2、Spring Context: 构建于Core封装包基础上的 Context封装包,提供了一种框架式的对象访问方法,有些象JNDI注册器。Context封装包的特性得自于Beans封装包,并添加了对国际化(I18N)的支持(例如资源绑定),事件传播,资源装载的方式和Context的透明创建,比如说通过Servlet容器。
    3、Spring DAO: DAO (Data Access Object)提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。 并且,JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plain old Java objects)都适用。
    4.Spring ORM: ORM 封装包提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。
    5.Spring AOP: Spring的 AOP 封装包提供了符合AOP Alliance规范的面向方面的编程实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中。
    6.Spring Web: Spring中的 Web 包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet listeners进行IOC容器初始化和针对Web的ApplicationContext。当与WebWork或Struts一起使用Spring时,这个包使Spring可与其他框架结合。
    7.Spring Web MVC: Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型,在领域模型代码和Web Form之间。并且,还可以借助Spring框架的其他特性。

    相关文章

      网友评论

          本文标题:spring

          本文链接:https://www.haomeiwen.com/subject/dddsvxtx.html