<mark>七大模块</mark>
- <mark>Spring Core:</mark> Core 封装包是框架的最基础部分,提供 IOC 和依赖注入特性。这里的基 础概念是 BeanFactory,它提供对 Factory 模式的经典实现来消除对程序性单例模式的需要, 并真正地允许你从程序逻辑中分离出依赖关系和配置。
- <mark>Spring Context:</mark> 构建于 Core 封装包基础上的 Context 封装包,提供了一种 框架式的对象访问方法,有些象 JNDI 注册器。Context 封装包的特性得自于 Beans 封装包,并添加了对国际化(I18N)的支持(例如资源绑定),事件传 播,资源装载的方式和 Context 的透明创建,比如说通过 Servlet 容器。
- <mark>Spring DAO:</mark> DAO (Data Access Object)提供了 JDBC 的抽象层,它可消 除冗长的 JDBC 编码和解析数据库厂商特有的错误代码。 并且,JDBC 封装包 还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口, 而且对所有的 POJOs(plain old Java objects)都适用。
- == Spring ORM==:ORM 封装包提供了常用的“对象/关系”映射 APIs 的集成层。 其 中包括 JPA、JDO、Hibernate 和 iBatis 。利用 ORM 封装包,可以混合使用所 有 Spring 提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。
- <mark>Spring AOP</mark>: Spring 的 AOP 封装包提供了符合 AOP Alliance 规范的面向方 面的编程实现,让你可以定义,例如方法***(method-interceptors)和切点
(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且, 利用 source-level 的元数据功能,还可以将各种行为信息合并到你的代码中。 - <mark>Spring Web</mark>: Spring 中的 Web 包提供了基础的针对 Web 开发的集成特性, 例如多方文件上传,利用 Servlet listeners 进行 IOC 容器初始化和针对 Web 的 ApplicationContext。当与 WebWork 或 Struts 一起使用 Spring 时,这个包使 Spring 可与其他框架结合。
- <mark>Spring Web MVC</mark>: Spring 中的 MVC 封装包提供了 Web 应用的 Model-View-Controller(MVC)实现。Spring 的 MVC 框架并不是仅仅提供一种 传统的实现,它提供了一种清晰的分离模型,在领域模型代码和 Web Form 之 间。并且,还可以借助 Spring 框架的其他特性。
<mark>七种事务</mark>:
PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是 最常见的选择。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY使用当前的事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。 PROPAGATION_NESTED 如 果 当 前 存 在 事 务 , 则 在 嵌 套 事 务 内 执 行 。 如 果 当 前 没 有 事 务 , 则 执 行 与 PROPAGATION_REQUIRED 类似的操作。
== PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别:==
它们非常类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。
使用 PROPAGATION_REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA事务管理器的支持。
使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。DataSourceTransactionManager使用savepoint支持PROPAGATION_NESTED时,需要JDBC 3.0以上驱动及1.4以上的JDK版本支持。其它的JTATrasactionManager实现可能有不同的支持方式。
PROPAGATION_REQUIRES_NEW 启动一个新的, 不依赖于环境的 “内部” 事务. 这个事务将被完全 commited 或 rolled back 而不依赖于外部事务, 它拥有自己的隔离范围, 自己的锁, 等等. 当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行。
另一方面, PROPAGATION_NESTED 开始一个 “嵌套的” 事务, 它是已经存在事务的一个真正的子事务. 潜套事务开始执行时, 它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交。
由此可见, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大区别在于, PROPAGATION_REQUIRES_NEW 完全是一个新的事务, 而 PROPAGATION_NESTED 则是外部事务的子事务, 如果外部事务 commit, 嵌套事务也会被 commit, 这个规则同样适用于 roll back.
<mark>REQUIRED,REQUIRES_NEW,NESTED异同</mark>
PROPAGATION_NESTED,这是一个嵌套事务,使用JDBC 3.0驱动时,仅仅支持DataSourceTransactionManager作为事务管理器。
需要JDBC 驱动的java.sql.Savepoint类。使用PROPAGATION_NESTED,还需要把PlatformTransactionManager的nestedTransactionAllowed属性设为true(属性值默认为false)。
嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。
NESTED和REQUIRED修饰的内部方法都属于外围方法事务,如果外围方法抛出异常,这两种方法的事务都会被回滚。但是REQUIRED是加入外围方法事务,所以和外围事务同属于一个事务,一旦REQUIRED事务抛出异常被回滚,外围方法事务也将被回滚。而NESTED是外围方法的子事务,有单独的保存点,所以NESTED方法抛出异常被回滚,不会影响到外围方法的事务。
NESTED和REQUIRES_NEW都可以做到内部方法事务回滚而不影响外围方法事务。但是因为NESTED是嵌套事务,所以外围方法回滚之后,作为外围方法事务的子事务也会被回滚。而REQUIRES_NEW是通过开启新的事务实现的,内部事务和外围事务是两个事务,外围事务回滚不会影响内部事务。
-
答案:ABCD 解析: ThreadLocal 类用于创建一个线程 本地变量。 在 Thread 中有一个成员变量 ThreadLocals ,该变量的类型是 ThreadLocalMap,也就是一 个 Map ,它的键是 threadLocal ,值为就是变量的副本。通过 ThreadLocal 的 get()方法可 以获取该线程变量的本地副本,在 get 方法之前要先 set,否则就要重写 initialValue()方法。 ThreadL ocal 的使用场景: 数据库连接:在多线程中,如果使用懒汉式的单例模式创建 Connection对象,由于该对象是共 享的,那么必须要使用同步方法保证线程安全,这样当一个线程在连接数据库时,那么另外一 个线程只能等待。这样就造成性能降低。如果改为哪里要连接数据库就来进行连接,那么就 会频繁的对数据库进行连接,性能还是不高。这时使用 ThreadLocal 就可以既可以保证线程 安全又可以让性能不会太低。但是 ThreadLocal 的缺点时占用了较多的空间。
-
<mark>单选题 查看解析下面有关 maven 和 an 的描述 ,描述错误的是? (C)</mark>
A. Ant 没有正式的约定如一个- 般项目的目录结构,你必须明确的告诉 Ant哪里去找源代码
B. Maven 拥有约定,因为你遵循了约定,它已经知道你的源代码在那里
C. maven 和 ant 都有“生命周期"的概念,当你输入一个命令后,mave或者 ant 会执行一系列的有序的步骤,直到到达你指定的生命周期
D. Ant构建文件默认命名为build. xm1,Maven默认构建文件为pom. xm1
== 解析:== Ant 和 Maven 都是基于 Java 的构建(build)工具。理论上来说,有些类似于( Unix ) C 中的 make , 但没有 make 的缺陷。Ant 是软件构建工具,Maven 的定位是软件项目管理和理解 工具。
Ant 特点:没有一个约定的目录结构,必须明确让 ant 做什么,什么时候做,然后编译,打包没有生命 周期,必须定义目标及其实现的任务序列没有集成依赖管理
Maven 特点: 拥有约定,知道你的代码在哪里,放到哪里去,拥有一一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程,只需要定义一个 pom. xml,然后把源码放到默 认的目录, Maven 帮你处理其他事情,拥有依赖管理,仓库管理
5.<mark>答案:C 解析:</mark>
getAttribute 则可以是对象。
getParameter()是获取 POST/GET 传递的参数值;
getAttribute()是获取对象容器中的数据值;
getParameter:用于客户端重定向时,即点击了链接或提交按扭时传值用,即用于在用表 单或 url 重定向传值时接收数据用。
getAttribute:用于服务器端重定向时,即在 sevlet 中使用了 forward 函数,或 struts 中使 用了mapping.findForward。
getAttribute 只能收到程序用 setAttribute 传过来的值。
getParameter()是获取 POST/GET 传递的参数值;
getAttribute()是获取 SESSION 的值; 另外,可以用 setAttribute,getAttribute 发送接收对象.而 getParameter 显然只能传字符 串。
setAttribute 是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务 器重定向到另一个页面时,应用服务器会把这块内存拷贝另一个页面所对应的内存中。这样 getAttribute 就能取得你所设下的值,当然这种方法可以传对象。 session 也一样,只是 对象在内存中的生命周期不一样而已。
getParameter 只是应用服务器在分析你送上来 的 request
页面的文本时,取得你设在表单或 url 重定向时的值。 getParameter 返回的是 String, 用于读取提交的表单中的值; getAttribute 返回的是 Object,需进行转换,可用 setAttribute 设置成任意对象,使用很 灵活, 可随时用;