Java EE知识储备(三)

来源:互联网 发布:66型重巡洋舰知乎 编辑:程序博客网 时间:2024/04/20 12:59

Java EE知识储备(三)

目录:

1、ServletContext中常用方法:

2、Hibernate的load和get对比:

3、Spring声明式事务管理:

4、Spring事务传播行为:

5、基本数据类型计算和常量区分:

6、Java.lang下的类能否被继承:

7、线程start和run方法:

8、截止JDK1.8版本,java并发框架支持锁包括:

9、final关键字:

10、Java垃圾收集器:

 

1、ServletContext中常用方法:

答:context.getParameter():获取get/post传递的参数值。

context.getInitParameter(参数名):获取Tomcat的server.xml中web应用的初始化参数。

context.getInitParameters():获取多个。

context.setAttribute(参数名,参数值):定义context属性。

context.getAttribute(参数名):获取对象容器中的共享数据。

RequestDispatcher rd = request.getRequestDispatcher("/success.html");

rd.forward(request, response);请求转发

 

2、Hibernate的load和get对比:

答: 都是按主键查询的方法。其中get不支持延迟加载,load支持延迟加载。

(1)load方法:load的时候首先查询一级缓存,没有就创建并返回一个代理对象,等到使用的时候,才查二级缓存,如果二级缓存中没有数据就查数据库,如果数据库中没有,就抛异常

(2)get方法:先查一级缓存,如果一级缓存中没有这条具体的数据,就查数据库,如果数据库没有值,就返回null,总之get方法不管用不用,都要拿到真实的数据

(3)延迟加载的含义:当Hibernate在查询数据的时候,数据并没有存在于内存中,当程序真正对数据操作时,对象才存在于内存中,就实现了延迟加载。从而节省了服务器的内存开销,提高了服务器的性能。

(4)Hibernate2实现集合,实体对象的延迟加载;Hibernate3提供了属性的延迟加载功能。

(5)Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

 

3、Spring声明式事务管理:

答: (1)配置文件:

<!-- 配置事务管理器 -->

      <property name="transactionManager">

<!-- 配置事务属性 -->

      <property name="transactionAttributes">        

<props>

         <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

     <prop key="*">PROPAGATION_REQUIRED</prop>

</props>

</property>

  声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。

(2)基于注释:

 

图3.1 基于注释


4、Spring事务传播行为:

(1)定义:当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。

(2)七种传播行为:

①PROPAGATION_REQUIRED:表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务

②PROPAGATION_SUPPORTS:表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行

③PROPAGATION_MANDATORY:表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常

④PROPAGATION_REQUIRED_NEW:表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager

⑤PROPAGATION_NOT_SUPPORTED:表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager

⑥PROPAGATION_NEVER:表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常

⑦PROPAGATION_NESTED:表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。注意各厂商对这种传播行为的支持是有所差异的。可以参考资源管理器的文档来确认它们是否支持嵌套事务。

 

5、基本数据类型计算和常量区分:

答:(1)Java中的byte、short、char类型进行计算时都会自动提升为int型。

(2)Java的常量分为编译期常量和运行期常量。编译器常量:如final int a = 4 * 5;运行期常量:如final int b = new Random(100);

 

6、Java.lang下的类能否被继承:

答:Java.lang包下的类若加了final类型的,则是不能被继承的,常见的如Integer,Double,Math,StringBuffer,StringBuilder等;常见的可以被继承的类,如Thread(用于创建新的线程),Number(Byte、Double、Integer、Float、Long、Short等类都是继承Number类的),ClassLoader(用户自定义类加载器)

 

7、线程start和run方法:

答:(1)start方法

用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法。但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。

(2)run方法

 run()方法只是类的一个普通方法而已,如果直接调用run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。

 

8、截止JDK1.8版本,java并发框架支持锁包括:

答:自旋锁(采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区)、

阻塞锁(让线程进入阻塞状态进行等待,当获得相应的信号(唤醒,时间)时,才可以进入线程的准备就绪状态,准备就绪状态的所有线程,通过竞争,进入运行状态)、

读写锁、

互斥锁(锁本身就是互斥的)、

可重入锁(递归锁,指可以多次进入改锁的域,同一线程外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响)、

悲观锁(假定会发生并发冲突,全部上锁)、

乐观锁(假定不会发生并发冲突,提交时再检查)、

公平锁(无优先级的锁)、

非公平锁(有优先级的锁)、

偏向锁(无竞争不锁,有竞争挂起,转为轻量锁)、

对象锁(锁住对象)、

线程锁、

锁粗化(多锁变成一个,自己处理)、

轻量级锁(CAS实现)、

锁消除(偏向锁就是锁消除的一种)、

锁膨胀(jvm实现,锁粗化)、

信号量(使用阻塞锁实现的一种策略)

 

9、final关键字:

答:(1)final是Java中的修饰符,可以修饰类,方法和属性,不能修饰抽象类

(2)final修饰的方法不能被重写。

(3)final修饰属性,这个属性就是一个常量,不能被再次赋值。

(4)final修饰类,则类不能被继承。

 

10、Java垃圾收集器:

答:还有G1收集器已在JDK 1.7 u4版本正式投入使用。

 

图10.1 垃圾收集器

 

2 0
原创粉丝点击