Java框架相关
问题及答案来源自《Java程序员面试笔试宝典》第五章 Java Web 5.3 框架
11、什么是IoC?
IoC:控制反转(Inverse of Control, IoC),有时候也被称为依赖注入,是一种降低对象之间耦合关系的一种设计思想
一般而言,在分层体系结构中,都是上层调用下层的接口,上层依赖于下层的执行,即调用者依赖于被调用者。
而通过Ioc方式,使得上层不再依赖于下层的接口,即通过一定的机制来选择不同的下层实现,完成控制反转,使得
由调用着决定被调用者。IoC通过注入一个实例化的对象来达到解耦合的目的
使用这种方法后,对象不会被显式的调用,而是根据需求通过IoC容器(例如Spring)来提供。 采用IoC机制能够提高系统
的可扩展性,如果对象之间通过显式调用进行交互会导致调用者与被调用者存在着非常紧密的联系,其中一方的改动会
导致程序出现很多的改动
实际案例如下:
要为一家茶店提供一套管理系统,在这家商店刚开业时只卖绿茶,随着规模的扩大或者根据具体销售量,未来可能会随时
改变茶的类型,例如红茶等,传统的实现方式会针对茶抽象化一个基类,绿茶类只需要继承自该基类即可,如下图所示:
采用该实现方法后,在需要使用GreenTea时,只需要执行以下代码即可:AbstractTea t = new GreenTea(),当然,
这种方法是可以满足当前设计要求的,但是该方法的可扩展性不好,存在着不恰当的地方,例如商家发现绿茶的销售
并不好,决定开始销售红茶,那么需要实现一个BlackTea类,并且让这个类继承自AbstractTea即可。但是,系统中用到
的AbstractTea t = new GreenTea()都需要改为AbstractTea t = new BlackTea(),而这种创建对象实例额方法往往会导致
程序的改动量非常大。
那怎么样才能增强系统的可扩展性呢?– 可以采用设计模式中的工厂模式
此时可以使用设计模式中的工厂模式来把创建对象的行为包装起来:
通过以上的方法,可以把创建对象的过程委托给TeaFactory来完成,在需要使用Tea对象时,只需要调用Factory类的
getTea方法即可,具体创建对象的逻辑在TeaFactory中来实现,那么当商家需要把绿茶替换为红茶时,系统只需要改动
TeaFactory中创建对象的逻辑即可,采用了工厂模式后,只需要在一个地方做改动就可以满足要求,这样就增强了系统
的可扩展性。虽然采用工厂设计模式后,增强了系统的可扩展性,但是本质上来讲,工程模式只不过把程序中会变动的
逻辑移动到工厂类里面了,当系统中类较多时,在系统扩展时需要经常改动工厂类中的代码。而采用IoC设计思想后,程序
会有更好的扩展性
Spring框架IoC的实现方法:
spring框架在采用Ioc后的实现方法是将上面的TeaFactory通过Ioc容器通过配置文件来加载被调用对象,同时把被调用的对象
的实例化对象通过构造函数或者set方法的形式注入到调用者对象中
12、什么是AOP?
AOP:
面向切面编程(Aspect-oriented Programming,AOP)是对面向对象开发的一种补充,它允许开发人员在不改变原来模型的
基础上动态的修改模型以满足新的需求,例如,开发人员可以在不改变原来业务逻辑模型的基础上可以动态的增加日志、
安全或异常处理的功能。
13、什么是Spring框架?
Spring框架:
Spring是一个J2EE框架,这个框架提供了对轻量级IoC的良好支持,同时也提供了对AOP技术非常好的封装。
相比其他框架,Spring框架的设计更加模块化,框架内的每个模块都能完成特定的工作,而且各个模块可以独立的
运行,不会相互牵制,因此,在使用Spring框架开发时,开发人员可以使用整个框架,也可以只使用框架内的一部分
模块,例如只使用Spring AOP模块来实现日志管理功能,而不需要使用其他模块。
Spring框架主要由7个模块组成,分别是Spring AOP、Spring ORM、Spring DAO、Spring Web、Spring Context、
Spring Web MVC、Spring Core等。
Spring框架图:
下面是各模块的作用:
Spring AOP:采用了面向切面编程的思想,使Spring框架管理的对象支持AOP,同时这个模块也提供了事务管理,
可以不依赖具体的EJB组件,就可以将事务管理集成到应用程序中
Spring ORM:提供了对现有ORM框架的支持,例如Hibernate、JDO等
Spring DAO:提供了对数据访问对象(Data Access Object,DAO)模式和JDBC的支持。DAO可以实现把业务逻辑与
数据库访问的代码实现分离,从而降低代码的耦合度。通过对JDBC的抽象,简化了开发工作,同时简化了对异常的
处理(可以很好的处理不同数据库厂商抛出的异常)
Spring Web:提供了Servlet监听器的Client和Web应用的上下文。同时还集成了一些现有的Web框架,例如Structs
Spring Context:扩展核心容器,提供了Spring上下文环境,给开发人员提供了很多有用的服务
Spring MVC:提供了一个构件Web应用程序的MVC的实现
Spring Core:Spring框架的核心容器,它提供了Spring框架的基本功能,这个模块中最主要的一个组件为BeanFactory,
它使用工厂模式来创建所需的对象。同时BeanFactory使用IOC思想,通过读取XML文件的方式来实例化对象,可以说
BeanFactory提供了组件生命周期的管理,组建的创建、装配、销毁等功能
14、什么是Hibernate?
Hibernate:
Hibernate是一个开放源代码的对象关系映射(ORM)框架,它不仅可以允许在J2EE容器中,也可以运行在J2EE容器外
它对JDBC进行了轻量级封装,任何可以使用JDBC的地方都可以用Hibernate代替
Hibernate实现了Java对象与关系数据库记录的映射关系,简化了开发人员访问数据库的流程,提高软件开发效率
Hibernate的五个核心接口:
(1)Configuration接口:
作用:配置hibernate,启动hibernate
hibernate应用通过Configuration执行关系-映射文件的位置或者动态配置hibernate属性,最后创建SessionFactory实例对象
在hibernate的hiberante.cfg.xml文件配置中,会有这么一句话:
<mapping resource="com/lanhuigu/hibernate/entity/Customer.hbm.xml" />
这句就是指定关系-映射文件的位置。
(2)SessionFactory接口:
作用:初始化hibernate,一个SessionFactory对应一个实例数据源,创建session接口对象
SessionFactory特点:
- 线程安全,一个实例多个线程共享。
- 不能随意创建和销毁,因为是重量级的。一个数据库只需创建一个SessionFactory实例,初始化时创建。如果同时访问多个数据库,需要对应每个数据库创建对应的实例。否则线程共享数据时,发生数据混乱。
(3)Session接口:
作用:负责数据的保存,更新,删除,加载和查询对象
Session接口的特点:
- 线程不安全,避免多个线程共享一个session。
- 是轻量级的,创建和销毁消费资源少,被称为持久化管理器
主要有5个方法对象以上操作:
- save():
- update():
- delete():
- load():
- find():
(4)Transaction接口:
作用:底层封装JDBC,JTA,CORBA事务, 负责hibernate事务的管理。
(5)Query接口和Criteria接口:
作用:负责数据的查询
Query封装HQL(Hibernate Query Language)查询语句,Criteria封装基于字符串形式的查询语句
上述五大接口之间关系如下:
Hibernate的使用过程:
- 应用程序通过Configuration类读取配置文件并创建SessionFactory对象
- 通过SessionFactory对象生成一个Sesssion对象
- 通过Session对象的beginTrancation方法创建一个事务
- 通过Session对象的get()、load()、save()、update()、delete()、saveOrUpdate()方法实现数据的增删改
- 通过Session生成一个Query对象,利用Query对象执行查询操作
- 最后通过commit方法或者rollback方法完成事务操作
- 在完成所有持久化操作与事务操作后需关闭Session与SessionFactory
在使用Hibernate时如何提高性能?
延迟加载:当Hibernate从数据库中获取某个对象的值时通过建立代理对象把对象的属性设置为默认值,当使用这些
数据时才会从数据库中加载
缓存技术:Hibernate中提供了一级缓存和二级缓存。合理的利用缓存可以提高系统性能
优化查询语句:通过优化查询语句来提高系统性能
15、什么是Hibernate的二级缓存?
什么是缓存:
缓存的目的是为了通过减少应用程序对物理数据源访问的次数来提高程序运行的效率,原理是把当前或接下来一段时间
内可能会被用到的数据保存到内存中,在使用时直接从内存中读取,而不是从硬盘中读取
Hibernate中的缓存:
在Hibernate中,缓存用来把从数据库中查询出来的和使用过的对象保存到内存中,以便后期需要用到这个对象时可以直接
从缓存中获取这个对象,只有对象在缓存中不存在时才会去数据库中查询,缓存避免了大量发送SQL语句造成的性能损耗
另外Hibernate中的缓存分为一级缓存和二级缓存,一级缓存由Session管理,二级缓存由SessionFactory管理,一级缓存
必不可少,二级缓存可有可无
Hibernate中的一级缓存:
当用Session查询数据时,首先在该Session内部查找该对象是否存在,若存在直接返回,否则就到数据库中查询,并将
查询的结果缓存起来以便后期使用。一级缓存的缺点是当使用Session来表示一次会话时,它的生命周期较短,而且它是
线程不安全的,不能被多个线程共享,因此在实际使用中其对效率的提升不是很明显
Hibernate中的二级缓存:
二级缓存用来为Hibernate配置一种全局的缓存,以便实现多个线程与事务共享,在使用了二级缓存之后,当查询数据时会
首先在内部缓存中查找,如果不存在,接着在二级缓存中查找,最后才到数据库查找
另外二级缓存是独立于Hibernate的软件部件,属于第三方产品,常见的产品有EhCache、OSCache和JbossCache等
Hibernate3之后默认使用的产品是EhCache
16、Hibernate中session的update()和saveOrUpdate()、load()和get()有什么区别?
Hibernate的对象有3种状态,分别为:瞬时态(Transient)、持久态(Persistent)和脱管态(Detached)
saveOrUpdate方法(同时包含save方法和update方法的功能):
- 如果对象已经在本session中持久化了,不做任何操作,直接返回
- 如果传入的对象与session中另一个对象有相同的标识符,抛出一个异常
- 如果对象没有持久化标识(identifier)属性,对其调用save()
- 如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save()
- 如果对象是附带版本信息的(通过<version>或<timestamp>) 并且版本属性的值表明其是一个新实例化的对象,对其调用save()
- 否则update() 这个对象
get方法和load方法的区别:
- 如果数据库中不存在该对象,load方法抛出ObjectNotFoundException异常,而get方法返回null
- get方法首先查询Session内部缓存,若不存在接着查询二级缓存,最后查询数据库
- load方法首先查询Session内部缓存,若不存在创建代理对象,实际使用数据时再去查询二级缓存和数据库
- get方法永远返回实体类,load方法可以返回实体类的代理类实例
19、什么是SSH?
SSH:Structs + Spring + Hibernate
- 表示层(视图层):JSP
- 业务逻辑层:Spring
- 数据持久化层:Hibernate
补充:什么是SSM?
SSM:Spring+SpringMVC+MyBatis
框架原理:
页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,
业务层将处理逻辑发送给控制器,控制器再调用视图展现数据
Java框架相关的更多相关文章
- JAVA开发相关
JAVA开发相关1. IntelliJ IDEA开发工具熟练使用2. Maven3. Spring框架(IoC.AOP) 1)数据库相关MyBatis 2)数据库连接池 3)事务.多数据源.跨数据库分 ...
- Java框架介绍-13个不容错过的框架项目
本文转自互联网,个人收藏所用. 下面,我们将一同分享各有趣且颇为实用的Java库,大家请任取所需.不用客气~ 1.极致精简的Java Bootique是一项用于构建无容器可运行Java应用的极简技术. ...
- Storm分布式实时流计算框架相关技术总结
Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...
- Java线程相关的热门面试题
---恢复内容开始--- 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序 ...
- Android RIL的java框架
Android RIL的Java部分也被分为了两个模块,RIL模块与Phone模块.其中RIL模块负责进行请求以及相应的处理,它将直接与RIL的原声代码进行通信.而Phone模块则向应用程序开发者提供 ...
- Java web相关内容
我们即将学习Java web 这是通过查阅资料找到的和Java web 相关的内容. 一:Java web的含义 JavaWeb,是用Java技术来解决相关web互联网领域的技术总和.web包括:we ...
- 流行的9个Java框架介绍: 优点、缺点等等
流行的9个Java框架介绍: 优点.缺点等等 在 2018年,Java仍然是世界上最流行的编程语言.它拥有一个巨大的生态系统,在全世界有超过900万Java开发人员.虽然Java不是最直接的语言,但是 ...
- 为什么选择 Spring 作为 Java 框架
1. 概述 在本文中,我们将讨论 Spring 作为最流行的 Java 框架之一的主要价值体现. 最重要的是,我们将尝试理解 Spring 成为我们选择框架的原因.Spring 的详细信息及其组成部分 ...
- Java面向对象——相关基本定义
Java面向对象——相关基本定义 摘要:本文简单介绍了面向对象的编程方式,以及与之有关的一些基本定义. 面向对象 什么是面向对象 面向对象编程是一种对现实世界建立计算机模型的一种编程方法.简称OOP( ...
随机推荐
- Typescript学习总结之泛型
泛型: 参数化的类型,一般用来限制结合的内容 class Student { constructor(public name: string) { } say() { console.log(this ...
- A* search算法
今天,还是国庆和中秋双节的时间节点,一个天气不错的日子,孩子已经早早的睡觉了,玩了一整天,也不睡觉,累的实在扛不住了,勉强洗澡结束,倒床即睡着的节奏... 不多说题外话,进入正题. 什么是A*搜索算法 ...
- Ubuntu16.04系统重装***
首先准备一个Live CD,就是Ubuntu的安装盘. 备份原理就是将系统文件压缩打包.由于Linux系统所有都是文件,故,只需要将系统打包即可.当然,必须除了当前系统运行中的文件以及临时文件. 打包 ...
- postgresql 查看数据库,表,索引,表空间以及大小
转载 http://blog.51yip.com/pgsql/1525.html 1,查看数据库 playboy=> \l //\加上字母l,相当于mysql的,mysql> show d ...
- .NET使用Task动态创建多任务多线程并行程序计算Redis集群keys计算
Task是一个很好用的多任务处理类,并且通过Task可以对任务进行很好的控制. 下面将通过代码实现Redis集群在使用IServer.keys时通过多任务对多个服务器示例进行并行计算,并对返回key做 ...
- 一篇对OAuth2.0开发实例的介绍
今天看到了博友对SSO的文章,SSO单点登录的讲解突然想写一篇关于OAuth2.0用户授权的介绍. 应用场景:在APP或者网页接入一些第三方应用时,时长会需要用户登录另一个合作平台,比如QQ,微博,微 ...
- 1.汇编指令介绍(arm)
本文作为本人学习过程中的记录及时不时的突发奇想偶记.鄙人菜鸟一只,文中如有错误或疏漏,若读者肯不吝赐教,在下感激零涕.文章一直不断更新中 一.汇编语言 汇编语言是一种应用计算机.微处理器.微控制器或其 ...
- Oracle随机排序函数和行数字段
随机排序函数dbms_random.value()用法:select * from tablename order by dbms_random.value() 行数字段rownum用法:select ...
- 服务链路追踪(Spring Cloud Sleuth)
sleuth:英 [slu:θ] 美 [sluθ] n.足迹,警犬,侦探vi.做侦探 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元.由于服务单元数量众多,业务的 ...
- Eclipse代码提示补全问题,自动选择第一个
原地址 http://blog.csdn.net/liuhhaiffeng/article/details/7179243 Eclipse具有代码提示功能, 但是默认的提示只有在输入".&q ...