理解Java动态代理和CGLIB代理

动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询、测试框架的后端mock、RPC,Java注解对象获取等。静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在编译期确定的。静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性。今天我们来探讨Java中两种常见的动态代理方式:JDK原生动态代理和CGLIB动态代理。

  

2017.12.09面试

下午的时候,去了一家公司面试,做了很久的车,刚开始公交还坐反了。。

面试题分为单选,多选和填空

试卷涉及到了struts、hibernate、spring等框架,数据库考到了Oracle数据库,没有mysql,关于oracle方面的题基本算是蒙的,后来面试的时候,面试官是一个搞研发的大叔,我还记得的问题有:


1.servlet和jsp的区别?

JSP与Servlet主要有两方面的不同:编译:JSP修改后可以立即看到结果,不需要编译;而Servelt缺需要编译。转换:JSP是动态网页开发技术,是运行在服务器端的脚本语言,而Servlet是web服务器端编程技术。所以JSP运行时就是转换为Servlet,也就是java程序来执行。

SERVLET是SUN早期推出的,其功能比较强劲,体系设计也很先进,只是,它输出HTML语句还是采用了老的CGI方式,是一句一句输出,所以,编写和修改HTML非常不方便。

后来SUN推出了类似于ASP的镶嵌型的JSP,把JSP TAG镶嵌到HTML语句中,这样,就大大简化和方便了网页的设计和修改。

这儿也就产生了一个区别了,SERVLET是往JAVA代码中嵌HTML元素,JSP是往HTML里嵌JAVA代码。

如果,我们这样嵌来嵌去的话代码肯定是混乱不堪,不容易理解。对于后期的维护将是一大难题!

所以说,jsp比较适合与承担view这个角色。

而servlet比较适合与承担Control这个角色。

理论上讲用servlet来写的东西,都可以用jsp完成。虽然JSP基本上实现了Servlet的功能,但JSP在性能上是无法与Servlet相比的。

参考自:http://blog.csdn.net/epm_kf6_10/article/details/48602117&&http://blog.csdn.net/yaohaibing576082210/article/details/5855444


2.事务的作用?

  事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。

就是为了保持事物的完整性、一致性。


3.转发和重定向的区别、为什么重定向request里面不带有数据

重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。 

转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

转发过程:

客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在student_list中都能取出来,因此,student_list能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。


重定向过程:

客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问student_list.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。


转发在服务器端完成的;重定向是在客户端完成的

转发的速度快;重定向速度慢

转发的是同一次请求;重定向是两次不同请求

转发不会执行转发后的代码;重定向会执行重定向之后的代码

转发地址栏没有变化;重定向地址栏有变化

转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

参考自:http://blog.csdn.net/lishehe/article/details/23133105


这三个问题,以及还有一些问题我都回答得不是很好。。。感觉回答问题的时候,没有想得那么多。。经验啊。

确实是我想得不够深入,理解得不够彻底。下次再战!!

还问了啥来着??记起来了再来写。。


  

:D 一言句子获取中...