Java_框架面试题html
七大模块,以下: 1. Spring Core: Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的须要,并真正地容许你从程序逻辑中分离出依赖关系和配置。java
Spring Context: 构建于Core封装包基础上的 Context 封装包,提供了一种框架式的对象访问方法,有些象JNDI注册器。Context封装包的特性得自于Beans封装包,并添加了对国际化(I18N)的支持(例如资源绑定),事件传播,资源装载的方式和Context的透明建立,好比说经过Servlet容器。nginx
Spring DAO: DAO (Data Access Object)提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。 而且,JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不只仅是实现了特定接口,并且对全部的POJOs(plain old Java objects)都适用。git
Spring ORM:ORM 封装包提供了经常使用的“对象/关系”映射APIs的集成层。 其中包括 JPA 、 JDO 、 Hibernate 和 iBatis 。利用ORM封装包,能够混合使用全部Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。web
Spring AOP: Spring的 AOP 封装包提供了符合AOP Alliance规范的面向方面的编程实现,让你能够定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。并且,利用source-level的元数据功能,还能够将各类行为信息合并到你的代码中。面试
Spring Web: Spring中的 Web 包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet listeners进行IOC容器初始化和针对Web的ApplicationContext。当与WebWork或Struts一块儿使用Spring时,这个包使Spring可与其余框架结合。spring
Spring Web MVC: Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并非仅仅提供一种传统的实现,它提供了一种清晰的分离模型,在领域模型代码和Web Form之间。而且,还能够借助Spring框架的其余特性。数据库
DI(依赖注入),IOC(控制反转),AOP(面向切面编程)编程
IOC:Inversion of Control,控制反转模式(也称做依赖性介入)的基本概念是:不建立对象,可是描述建立它们的方式。在代码中不直接与对象和服务链接,但在配置文件中描述哪个组件须要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一块儿。
在Java开发中,IOC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制,这称为控制反转,就是被调用类的实例由原先的调用类控制建立、销毁如今转变成由Spring的容器管理。
注入方式: 1. 接口注入 2. 属性注入[属性的SET/GET] 3. 构造注入[构造方法注入] 使用构造函数依赖注入时,Spring保证对象其所依赖的全部对象先实例化后,才实例化这个对象。 使用set方法依赖注入时,Spring首先实例化对象,而后才实例化全部依赖的对象。 * 当设值注入与构造注入同时存在时,先执行设置注入,在执行构造注入。
使用DI注入时,Property表明注入类的属性,若是引用其余的bean,则用ref属性来代表被引用bean的名称,若是是引用字符串的话,用value属性。
如: \<property name=”userDao” ref=”被引用bean的名称” /> \<property name=”username” value = ”字符串”/>
注入DataSource数据源对象,不须要手动关闭数据库链接,JdbcTemplate会帮咱们关闭数据库链接
我的理解:若是说汇编语言是对计算机指令的抽象,面向对象语言是对程序要解决的问题的抽象,AOP则是对程序功能自己的抽象。
实现AOP有几种方式: >1. Spring 1.2版本中经过ProxyFactoryBean来实现aop,即经过动态代理来实现的,Aspect必须继承MethodBeforeAdvice,MethodAfterAdvice等 >2. Spring 2.0 AOP须要改的是FBI 这个类,并且它也不须要再实现某些接口 >3. 使用标注(@AspectJ)实现AOP
spring提供的事务管理能够分为两类:编程式的和声明式的。编程式的,比较灵活,可是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活.
不能。Spring的声明式事务为实现类产生代理。不能在代码中使用Try/Catch,由于代码中捕获了异常,Spring容器捕获不了异常。
SpringMVC是基于过滤器对servlet进行了封装的一个框架,咱们使用的时候就在web.xml中配置DispatcherServlet类;SpringMVC工做是主要是经过DispatcherServlet管理接受到的请求并进行处理。 * SpringMVC的工做流程描述:
- 第一步:用户向服务器发送请求,请求被Spring前端控制Servelt DispatcherServlet捕获;
- 第二步: DispatcherServlet对请求URL进行解析,获得请求资源标识符(URL),而后根据该URL调用HandlerMapping得到该Handler配置的全部相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
- 第三步: DispatcherServlet 根据得到的Handler,选择一个合适的HandlerAdapter。(附注:若是成功得到HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)
- 第四步:提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程当中,根据你的配置,Spring将帮你作一些额外的工做: >> 1. HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息 >> 2. 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等 >> 3. 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期 >> 4. 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
- 第五步: Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
- 第六步:根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
- 第七步:ViewResolver 结合Model和View,来渲染视图
- 第八步:将渲染结果返回给客户端。
Nginx 是俄罗斯人编写的十分轻量级的 是一个高性能的HTTP和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器. * Nginx实现负载均衡只须要在nginx文件中进行配置便可,配置以下: 1. 第一步:在http模块中配置upstream 模块:(举例)
upstream www.myweb.com { server 127.0.0.1:9100 weight=1; server 127.0.0.1:9200 weight=1;} <br /> 其中weight=1表示权重,用于后端服务器性能不均的状况,访问比率约等于权重之比,权重越大访问机会越多; upstream是配置nginx与后端服务器负载均衡很是重要的一个模块,而且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器;
第二步:在server模块里添加:(举例) location /myweb { proxy_pass http://www.myweb.com;} 其中 www.myweb.com 字符串要和 upstream 后面的字符串相等;
其中,request、response、session、application、config这五个对象和Servlet的API是同样的。
struts1是基于JSP和servlet的一个开源的Web应用框架,使用的是MVC的设计模式。struts2是基于webwork技术的框架,是sun和webwork公司联手开发的一个功能很是齐全的框架,struts2和struts1没有任何关系,是一个全新的框架
JavaServer Face是基于组件的web开发框架,跟sturts差很少的框架
SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,能够被多个线程并发访问。SessionFactory通常只会在启动的时候构建。对于应用程序,最好将SessionFactory经过单例模式进行封装以便于访问。Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工做单元。Session是由SessionFactory建立的,在任务完成以后它会被关闭。Session是持久层服务对外提供的主要接口。Session会延迟获取数据库链接(也就是在须要的时候才会获取)。为了不建立太多的session,可使用ThreadLocal将session和当前线程绑定在一块儿,这样可让同一个线程得到的老是同一个session。Hibernate 3中SessionFactory的getCurrentSession()方法就能够作到。
有些业务逻辑在执行过程当中要求对数据进行排他性的访问,因而须要经过一些机制保证在此过程当中数据被锁住不会被外界修改,这就是所谓的锁机制。 1. 悲观锁,顾名思义悲观的认为在数据处理过程当中极有可能存在修改数据的并发事务(包括本系统的其余事务或来自外部系统的事务),因而将处理的数据设置为锁定状态。悲观锁必须依赖数据库自己的锁机制才能真正保证数据访问的排他性 2. 乐观锁,顾名思义,对并发事务持乐观态度(认为对数据的并发操做不会常常性的发生),经过更加宽松的锁机制来解决因为悲观锁排他性的数据访问对系统性能形成的严重影响。最多见的乐观锁是经过数据版本标识来实现的,读取数据时得到数据的版本号,更新数据时将此版本号加1,而后和数据库表对应记录的当前版本号进行比较,若是提交的数据版本号大于数据库中此记录的当前版本号则更新数据,不然认为是过时数据没法更新。 * Hibernate中经过Session的get()和load()方法从数据库中加载对象时能够经过参数指定使用悲观锁;而乐观锁能够经过给实体类加整型的版本字段再经过XML或@Version注解进行配置。
Application Context 是 spring 中较高级的容器。和 BeanFactory 相似,它能够加载配置文件中定义的 bean,将全部的 bean 集中在一块儿,当有请求的时候分配 bean。 另外,它增长了企业所须要的功能,好比,从属性文件从解析文本信息和将事件传递给所指定的监听器。这个容器在 org.springframework.context.ApplicationContext interface 接口中定义。
ApplicationContext 包含 BeanFactory 全部的功能,通常状况下,相对于 BeanFactory,ApplicationContext 会被推荐使用。BeanFactory 仍然能够在轻量级应用中使用,好比移动设备或者基于 applet 的应用程序。
Spring beans 是那些造成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans经过容器中配置的元数据建立。好比,以XML文件中<bean/> 的形式定义。
Spring 框架定义的beans都是单件beans。在bean tag中有个属性”singleton”,若是它被赋为TRUE,bean 就是单件,不然就是一个 prototype bean。默认是TRUE,因此全部在Spring框架中的beans 缺省都是单件。
二者都是装入bean定义信息,装配bean,根据须要分发bean。可是ApplicationContext提供更多功能,它提供了bean工厂所没有的解析信息文本工具,包括对国际化的支持,提供了载入文件资源的通用方法,如载入图片,它能够用注册为监听器的bean发送事件。另一个很重要的区别是单例bean被载入的方式不同。bean工厂延迟载入全部的bean,直到getbean方法被调用,才被建立。而ApplicationContext会预装入全部的单例bean,确保须要的时候单例bean都已经准备好了,这样咱们的应用就不须要等待这些单例bean被建立。
这里有三种重要的方法给Spring 容器提供配置元数据。 1. XML配置文件。 2. 基于注解的配置。 3. 基于java的配置。
当定义一个<bean> 在Spring里,咱们还能给这个bean声明一个做用域。它能够经过bean 定义中的scope属性来定义。如,当Spring要在须要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。另外一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope 属性 必须设为 singleton。 Spring框架支持如下五种bean的做用域: singleton : bean在每一个Spring ioc 容器中只有一个实例。缺省的Spring bean 的做用域是Singleton,且Spring框架中的单例bean不是线程安全的。 prototype:一个bean的定义能够有多个实例。 request:每次http请求都会建立一个bean,该做用域仅在基于web的Spring ApplicationContext情形下有效。 session:在一个HTTP Session中,一个bean定义对应一个实例。该做用域仅在基于web的Spring ApplicationContext情形下有效。 * global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该做用域仅在基于web的Spring ApplicationContext情形下有效。
有两个重要的bean 生命周期方法,第一个是setup , 它是在容器加载bean的时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用。<br /> The bean 标签有两个重要的属性(init-method和destroy-method)。用它们你能够本身定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)。
当一个bean仅被用做另外一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring 的 基于XML的 配置元数据中,能够在 \<property/>或\<constructor-arg/> 元素内使用\<bean/> 元素,内部bean一般是匿名的,它们的Scope通常是prototype。
Spring提供如下几种集合的配置元素: 1. \<list>类型用于注入一列值,容许有相同的值。 2. \<<set> 类型用于注入一组值,不容许有相同的值。 3. \<<map> 类型用于注入一组键值对,键和值均可觉得任意类型。 4. \<<props>类型用于注入一组键值对,键和值都只能为String类型。
有五种自动装配的方式,能够用来指导Spring容器用自动装配方式来进行依赖注入。 1. no:默认的方式是不进行自动装配,经过显式设置ref 属性来进行装配。 2. byName:经过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,以后容器试图匹配、装配和该bean的属性具备相同名字的bean。 3. byType::经过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,以后容器试图匹配、装配和该bean的属性具备相同类型的bean。若是有多个bean符合条件,则抛出错误。 4. constructor:这个方式相似于byType, 可是要提供给构造器参数,若是没有肯定的带参数的构造器参数类型,将会抛出异常。 5. autodetect:首先尝试使用constructor来自动装配,若是没法工做,则使用byType方式。
自动装配的局限性是: 1. 重写: 你仍需用 <constructor-arg>和 <property> 配置来定义依赖,意味着总要重写自动装配。 2. 基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。 3. 模糊特性:自动装配不如显式装配精确,若是有可能,建议使用显式装配。
能够。
基于Java的配置,容许你在少许的Java注解的帮助下,进行你的大部分Spring配置而非经过XML文件。
以@Configuration 注解为例,它用来标记类能够当作一个bean的定义,被Spring IOC容器使用。另外一个例子是@Bean注解,它表示此方法将要返回一个对象,做为一个bean注册进Spring应用上下文。
在Spring中有两种方式访问Hibernate: 1. 控制反转 Hibernate Template和 Callback。 2. 继承 HibernateDAOSupport提供一个AOP 拦截器。
用Spring的 SessionFactory 调用 LocalSessionFactory。集成过程分三步: 1. 配置the Hibernate SessionFactory。 2. 继承HibernateDaoSupport实现一个DAO。 3. 在AOP支持的事务中装配。
编程式事务管理:这意味你经过编程的方式管理事务,给你带来极大的灵活性,可是难维护。
声明式事务管理:这意味着你能够将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。 >大多数Spring框架的用户选择声明式事务管理,由于它对应用代码的影响最小,所以更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式容许你经过代码控制事务)少了一点灵活性。
引入容许咱们在已存在的类中增长新的方法和属性。