Java EE知识储备(三)
2017-03-09 14:11
155 查看
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 垃圾收集器
目录:
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 垃圾收集器
相关文章推荐
- Java EE知识储备(二)
- Java EE知识储备(八)
- Java EE知识储备(六)
- Java EE知识储备(一)
- Java EE知识储备(五)
- Java EE知识储备(九)
- Java EE知识储备(四)
- Java EE知识储备(七)
- C++知识储备ing
- java技术面的基本知识储备
- jquery源码阅读知识储备(4)关于js中if的解惑
- jquery源码阅读知识储备(5)call方法和apply方法接触
- bash脚本编程知识储备
- 流立方与流体计算知识储备
- 知识储备:03链表:链表之哑节点的使用
- 知识储备在需要积累,在一定时候才能够呈现指数级的增长
- 多线程编程知识储备
- 【知识储备】Hibernate学习笔记
- Java EE基础知识学习(二)
- 字符串知识储备