【前言】别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得游手好闲,和你一样会抱怨,而只有你自己相信这些都是真的,最后,也只有你一个人继续不思进取 ……
【下载】个人结合诸多资料,总结的一些JavaEE常见面试题,主要针对初/中级程序员。想要word完整版下载的,评论里留言留下你的邮箱!
31.Spring中的BeanFactory和ApplicationContext有什么联系?
答:①Spring通过配置文件描述Bean以及Bean之间的依赖关系,利用Java的反射机制实现Bean的实例化,并建立Bean之间的依赖关系,在此基础上,Spring的IoC容器还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布等高级服务。
②BeanFactory是Spring框架最核心的接口,它提供了IoC容器的配置机制。
③ApplicationContext建立在BeanFactory之上,提供了更多面向应用功能,包括国际化和框架事务体系的支持。
④通常将BeanFacory称为IoC容器,而ApplicationContext称之为应用上下文,前者更倾向于Spring本身,后者更倾向于开发者,因此被使用得更多。
32.Spring中Bean的作用域有哪些?
答:(1)在Spring的早期版本中,仅有两个作用域:singleton和prototype,前者表示Bean以单例模式存在;后者表示多例,每次从容器中调用Bean时,都会返回一个新的实例;
(2)Spring 2.x中针对WebApplicationContext新增了3个作用域,分别是:request(每次HTTP请求都会创建一个新的Bean)、session(同一个HttpSession共享同一个Bean,不同的HttpSession使用不同的Bean)和globalSession(同一个全局Session共享一个Bean)。
33.你如何理解AOP中的连接点(Joinpoint)、切入点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?
答: ①连接点(Joinpoint):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点;
②切入点(Pointcut):所谓切入点是指我们要对哪些连接点(Joinpoint)进行拦截的定义;
③增强/通知(Advice):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能);
④引介(Introduction):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field;
⑤Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程;
⑥Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类;
⑦Aspect(切面):是切入点和通知的结合,以后咱们自己来编写和配置的;
34.代理模式与装饰者模式的区别:
答:(1)相同点:
①都要与基础对象实现相同的接口;
②都要在自身对象中引入被代理对象或被装饰对象的引用。
(2)不同点:
①装饰者模式定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的 灵活性大,典型的如IO的设计,就是典型的装饰者模式;
②代理模式的定义:对其他对象进行代理,以控制对被代理对象的访问。Spring的为业务层方法生成的 代理类,主要是进行一些事物控制等;
③由定义,我们可以看出:装饰的责任是扩展功能;而代理主要是控制访问。
35.阐述Spring框架中Bean的生命周期?
答:
①Spring IoC容器找到关于Bean的定义并实例化该Bean。
②Spring IoC容器对Bean进行依赖注入。
③如果Bean实现了BeanNameAware接口,则将该Bean的id传给setBeanName方法。
④如果Bean实现了BeanFactoryAware接口,则将BeanFactory对象传给setBeanFactory方法。
⑤如果Bean实现了BeanPostProcessor接口,则调用其postProcessBeforeInitialization方法。
⑥如果Bean实现了InitializingBean接口,则调用其afterPropertySet方法。
⑦如果有和Bean关联的BeanPostProcessors对象,则这些对象的postProcessAfterInitialization方法被调用。
⑧当销毁Bean实例时,如果Bean实现了DisposableBean接口,则调用其destroy方法。
36. Spring中的自动装配有哪些限制?
答:①如果使用了构造器注入或者setter注入,那么将覆盖自动装箱的依赖关系。
②基本数据类型的值、字符串字面量、类字面量无法使用自动装箱来注入。
③有先考虑使用显示的装配来进行更精确的依赖注入而不是使用自动装配。
37.和自动装配相关的注解有哪些?
答:①@Required:该依赖关系必须装配(手动或自动装备),否则将抛出BeanInitializationException异常。
②@Autowired:自动装配,默认按类型进行自动装配。
③@Qualifier:如果按类型自动装配时,有不止一个匹配的类型,那么可以使用该注解指定名字来消除歧义。
38.如何使用HibernateDaoSupport整合Spring和Hibernate?
答:①在Spring中配置Hibernate的会话工厂(LocalSessionFactoryBean或AnnotationSessionFactoryBean)。
②让DAO的实现类继承HibernateDaoSupport(继承getHibernateTemplate方法来调用模板方法)。
③让Spring来管理Hibernate的事务(推荐使用声明式事务)。
39.你是如何理解“横切关注”这个概念的?
答:“横切关注”是会影响到整个应用的关注功能,它跟正常的业务逻辑是正交的,没有必然的联系,但是几乎所有的业务逻辑都会涉及到这些关注功能。通知、事务、日志、安全性等关注就是应用的横切关注功能。
40.如何理解Spring AOP中Advice这个概念的?
答:Advice在国内的很多书面资料中都被翻译为“通知”,但是很明显这个翻译无法表达其本质,有少量的读物上将这个词翻译为“增强”,这个翻译是对Advice较为准确的诠释,我们通过AOP将横切关注功能加到原有的业务逻辑上,这就是对原有业务逻辑的一种增强,这种增强可以是前置增强、后置增强、返回后增强、抛异常时增强和包围型增强。
41.在Web项目中如何获得Spring的IoC容器?
答:WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
42.JSP中的静态包含和动态包含的区别?
答:①代码如下:
<%-- 静态包含 --%>
<%@ include file="..." %>
<%-- 动态包含 --%>
<jsp:include page="...">
<jsp:param name="..." value="..." />
</jsp:include>
②静态包含是通过JSP的include指令包含页面的;而动态包含是通过JSP的<jsp: forward>标签进行包含的。
③静态包含是编译时包含,如果包含的页面不存在,则会产生编译错误,而且两个页面的“contentType”属性应保持一致,因为这两个页面会合二为一,产生一个class文件,并且静态包含不会检查所含文件的变化,适用于包含静态页面。
④动态包含是运行时包含,可以向被包含的页面传递参数,包含页面和被包含页面是独立的,会编译出两个class文件,如果被包含的页面不存在,不会产生编译错误,也不影响页面其他部分的执行。
43.Servlet中如何获取用户提交的查询参数或表单数据?
答:①HttpServletRequest的getParameter()方法。
②HttpServletRequest的getParameterValues()方法。
③HttpServletRequest的getParameterMap()方法。
44.什么是Web Service(Web服务)?
答:①Web Service就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。
②它是基于HTTP协议传输数据,这使得运行在不同机上的不同应用程序,无须借助附加的、专门的第三方软件或硬件,就可以相互交换数据或集成。
45.什么是ORM?
答:①对象关系映射(Object-Relation Mapping,简称ORM)是一种为解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术;
②ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者注解),将程序中的对象自动持久化到关系数据库中,或者将关系数据库表中的行转换成Java对象,其本质就是将数据从一种形式转换到另一种形式。