2015年11月 面试题总结



hibernate一级缓存和二级缓存的区别

答:主要的不同是它们的作用范围不同。 一级缓存是session级别的。 也就是只有在同一个session里缓存才起作用。
而二级缓存是sessionFactory级别的。 其缓存对同一个sessionFactory生产出来的session都有效。


spring中AOP实现日志的方法

答:这种方式实现起来非常简单,只要配置一下配置文件就可以了。可是这种方式会拦截下所有的对action的每个操作。

使得效率比较低。不过想做详细日志这个方法还是非常好的。

public classs MyLog{  
03.            //在类里面写方法,方法名诗可以任意的。此处我用标准的before和after来表示  
04.           public void before(){  
05.                     System.out.println("被拦截方法调用之前调用此方法,输出此语句");  
06.           }  
07.           public void after(){  
08.                       System.out.println("被拦截方法调用之后调用此方法,输出此语句");  
09.           }  
10. }  
11.

<bean id="testLog" class="chen.hui.log.MyLog"></bean> <!--将日志类注入到bean中。-->  
02.   
03. <aop:config>  
04.    <aop:aspect id="b" ref="testLog"><!--调用日志类-->  
05.    	  <aop:pointcut id="log" expression="execution(* chen.hui.log.*.*(..))"/><!--配置在log包下所有的类在调用之前都会被拦截-->  
06.    	  <aop:before pointcut-ref="log" method="before"/><!--在log包下面所有的类的所有方法被调用之前都调用MyLog中的before方法-->  
07.    	  <aop:after pointcut-ref="log" method="after"/>><!--在log包下面所有的类的所有方法被调用之前都调用MyLog中的after方法-->  
09.    </aop:aspect>  
10.   
11. </aop:config>  

AOP常用场景:

Spring提供了对AOP技术的良好封装, AOP称为面向切面编程,就是系统中有很多各不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如,加入日志,加入权限判断,加入异常处理,这种应用称为AOP。实现AOP功能采用的是代理技术,客户端程序不再调用目标,而调用代理类,代理类与目标类对外具有相同的方法声明,有两种方式可以实现相同的方法声明,一是实现相同的接口,二是作为目标的子类在,JDK中采用Proxy类产生动态代理的方式为某个接口生成实现类,如果要为某个类生成子类,则可以用CGLI B。在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以Advice对象进行提供,显然要创建出代理对象,至少需要目标类和Advice类。spring提供了这种支持,只需要在spring配置文件中配置这两个元素即可实现代理和aop功能,


<bean id=”proxy” type=”org.spring.framework.aop.ProxyBeanFactory”>

       <property name=”target”ref=””></property>

       <property name=”advisor”ref=””></property>

 

</bean>


spring事务隔离级别

并发事务所导致的问题可以分为以下三类:

① 脏读:脏读发生在一个事务读取了另一个事务改写但尚未提交的数据时。如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。

② 不可重复读:不可重复读发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据时。这通常是因为另一个并发事务在两次查询期间更新了数据

③ 幻读:幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录

PROPAGATION_MANDATORY 表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常
PROPAGATION_NESTED 表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。注意各厂商对这种传播行为的支持是有所差异的。可以参考资源管理器的文档来确认它们是否支持嵌套事务
PROPAGATION_NEVER 表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常
PROPAGATION_NOT_SUPPORTED 表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager
PROPAGATION_REQUIRED 表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务
PROPAGATION_REQUIRED_NEW 表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager
PROPAGATION_SUPPORTS 表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行


常见异常:
算术异常类:ArithmeticExecption  
空指针异常类:NullPointerException  
类型强制转换异常:ClassCastException  
数组负下标异常:NegativeArrayException  
数组下标越界异常:ArrayIndexOutOfBoundsException  
违背安全原则异常:SecturityException  
文件已结束异常:EOFException  

文件未找到异常:FileNotFoundException


常见运行时异常:

NullPointerException

ArrayIndexOutOfBoundsException

ClassCastException


JAVA会发生内存泄漏吗,为什么,什么情况下会发生内存泄漏

会发生。长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。

例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。


常见设计模式:

创建型(工厂、工厂方法、抽象工厂、单例)

结构型(包装、适配器,组合,代理)

行为(观察者,模版,策略)

Factory(工厂模式),     Builder(建造模式),      Factory Method(工厂方法模式),

Prototype(原始模型模式),Singleton(单例模式),   Facade(门面模式),

Adapter(适配器模式),   Bridge(桥梁模式),       Composite(合成模式),

Decorator(装饰模式),   Flyweight(享元模式),    Proxy(代理模式),

Command(命令模式),     Interpreter(解释器模式), Visitor(访问者模式),

Iterator(迭代子模式),  Mediator(调停者模式),   Memento(备忘录模式),

Observer(观察者模式),  State(状态模式),        Strategy(策略模式),

Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)

工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,

通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。

首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,

工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。


倒序九九乘法表

public static void main(String[] args) {
		for(int i = 9; i >= 0; i--) {
			for(int j = i; j > 0; j--) {
				System.out.print(i+"*"+j+"="+i*j+" ");
			}
			System.out.println();
		}
	}


谈谈对Servlet过滤器的理解:

过滤器是一种小型的、可插入的web组件。用来拦截servlet容器的请求和响应过程,以便查看、提取客户端之间正在交换的数据。过滤器通常是封装了一些web组件,

这些功能很重要,但对于处理客户端请求或发送响应来说不是决定性的。典型的应用包括记录请求和响应的数据、管理和会话属性等。


简述Servlet监听器:

Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理。


JVM组成:



JVM由方法区、虚拟机栈、方法栈、堆、程序计数器组成

方法区:用于存储虚拟机加载的类信息、常量、静态变量是各个线程共享的内存区域。

虚拟机栈:当java方法执行的时候,都会创建一个栈帧用于存储局部变量。每个方法被调用到执行完的过程,旧对应这一个栈帧在虚拟机入栈到出栈的过程,生命周期与线程相同,是线程私有的。

方法栈:与虚拟机栈区别是执行java方法服务,而本地方法栈则是为native方法服务

堆:在启动时创建,该内存区域存放了对象实例及数组

程序计数器:作用是当前线程锁执行的字节吗行号指示器,通过改变计数器的值来选取下一条需要执行的动作。


什么是JSP:

JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。JSP被JSP编译器编译成Java Servlets。一个JSP编译器可以把JSP编译成JAVA代码写的servlet然后再由JAVA编译器来编译成机器码,也可以直接编译成二进制码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值