首页 > 编程 > Java > 正文

java面试题(5)-Java框架部分

2019-11-08 00:55:10
字体:
来源:转载
供稿:网友

说说SPRing? Spring的核心是控制反转、依赖注入,Aop(面向切面)相当于把每个bean与bean之间的关系交给第 三方容器进行管理. 说SpringIOC、SpringAOP? SpringIOC ,其实就是依赖注入、控制反转。相当于把每个bean与bean之间的关系交给第三方容器管理。而这个容器就是spring SpringAOP 面向切面的编程,或AOP,是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。 SpringAop 就是用 java的动态代理

Spring的底层实现机制是什么? 使用Demo4j(解析xml)+Java反射机制 Demo4j 其实就是解析XML。使用反射机制实例化bean。

SpringAOP用到了什么代理? JDK动态代理:对实现了接口的类生成代理 CGLib代理机制:对类生成代理 动态代理与静态代理区别? 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。  动态代理:在程序运行时,运用反射机制动态创建而成。  Spring注入有那些方式? Set注入 构造器注入 静态工厂的方法注入 实例工厂的方法注入 Spring有那些注解? @Autowired(按类型注入) @Service(标示为注入为服务层) @Resource(按名称注入) @Controller(标识控制器bean id) @RequestMapping(表示映射URL路径) 简述Spring的优缺点?   Spring 的优点??   1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦   2.可以使用容易提供的众多服务,如事务管理,消息服务等   3.容器提供单例模式支持   4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能   5.容器提供了众多的辅助类,能加快应用的开发   6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等   7.spring属于低侵入式设计,代码的污染极低   8.独立于各种应用服务器   9.spring的DI机制降低了业务对象替换的复杂性   10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部 缺点: 使用到了大量反射机制。反射机制非常占内存, SpringMVC工程流程 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获; 2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回; 3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法) 4.  提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:       HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息       数据转换:对请求消息进行数据转换。如String转换成Integer、Double等       数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等       数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中 5.  Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象; 6.  根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ; 7. ViewResolver 结合Model和View,来渲染视图 8. 将渲染结果返回给客户端。

SpringMVC工作流程描述  为什么SpringMVC只使用一个Servlet(DispatcherServlet)来处理所有请求? 详细见J2EE设计模式-前端控制模式 Spring为什么要结合使用HandlerMapping以及HandlerAdapter来处理Handler? 符合面向对象中的单一职责原则,代码架构清晰,便于维护,最重要的是代码可复用性高。如HandlerAdapter可能会被用于处理多种Handler。

Hibernate面试题 什么是Hibernate? hibernate是一个基于ORM持久框架,可以让程序员以面向对象的思想操作数据库,提高生产效率. 什么是ORM? orm不过是一种思想,对象关系映射。是对象关系模型,如hibernate,让你以面向对象的方式去编程。封装了JDBC.

说一下orm与jdbc的区别? jdbc只是一个java操作数据库的规范接口而已 orm不过是一种思想,对象关系映射。 ORM:是对象关系模型,如hibernate,让你以面向对象的方式去编程。封装了JDBC. JDBC:是从底层访问数据库服务器。一般银行,金融行业为了安全起见,直接用JDBC访问 Hibernate中get和load有什么不同之处?  load :找不到数据的话会抛出org.hibernate.ObjectNotFoundException异常。此时hibernate会使用延迟加载加载机制  get找不到的话会返回null。  如果查询不到数据,get 会返回 null,但是不会报错, load 如果查询不到数据,则报错ObjectNotFoundException 使用get 去查询数据,(先到一级/二级)会立即向db发出查询请求(select …), 如果你使用的是 load查询数据,(先到一级、二级))即使查询到对象,返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用查询结果的时候才真的发出select ,这个现象我们称为懒加载(lazy) hibernate的三种状态? 在Hibernate中,对象有三种状态:临 时状态(Transient)、持久状态(Persistent)和游离状态(Detached)。 处于持久态的对象也称为 PO(PersistenceObject),临时对象和游离对象也称为VO(ValueObject). 

hibernate的懒加载? 有几种禁用方法 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了。 我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。 1.使用代理对象:Hibernate.initialize(“代理对象”); 2.在需要禁用懒加载的映射文件中显示的加入lazy = “false” 3.使用opensessionInView【需要借助于过滤器】 需要在web.xml文件中配置 hibernate有几种查询方式? 1、 属性查询2、 参数查询、命名参数查询3、 关联查询4、 分页查询5、 统计函数 Hibernate的优缺点? 1.Hibernate的优缺点: 优点:1、程序更加面向对象; 2、提高了生产率; 3、方便移植(修改配置文件); 4、无侵入性。 缺点: 1、效率比JDBC略差; 2、不适合批量操作。 Hibernate的缓存机制 Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存。 1.Hibernate一级缓存又称为“Session的缓存”。 Session内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务)。 一级缓存中,持久化类的每个实例都具有唯一的OID。 2.Hibernate二级缓存又称为“SessionFactory的缓存”。 由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。 第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。 Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。 Hibernate延迟加载? 1) Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 2) Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。  Hibernate工作原理及为什么要用? 原理: 1)        读取并解析配置文件 2)        读取并解析映射信息 3)        创建SessionFactory 4)        打开Sesssion 5)        创建事务Transation 6)        持久化操作 7)        提交事务 8)        关闭Session 9)        关闭SesstionFactory 为什么要用: 1)        对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2)        Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3)        hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4)        hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

什么是Mybatis? Mybatis的前生是ibatis,最后升级版本后名称叫mybatis。mybatis是以纯sql操作数据。 Mybatis与Hibernate区别? Hibernate是面向对象的思想操作数据生成Sql语句,而mybatis是以纯sql操作数据 相对于mybatis容易优化.扩展性好,但是移植性差。 设计模式部分 你熟悉那些设计模式? 总共有23种设计模式 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 企业面试的时候,面试官非常喜欢考单例,而且非常喜欢考手写单例。 什么是单例?单例有那些写法? 单例分类:懒汉式单例、饿汉式单例 单例模式有以下特点: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 ①懒汉式单例 1.//懒汉式单例类.在第一次调用的时候实例化自己    2.public class Singleton {   3.    private Singleton() {}   4.    private static Singleton single=null;   5.    //静态工厂方法    6.    public static Singleton getInstance () {   7.         if (single == null) {     8.             single = new Singleton();   9.         }     10.        return single;   11.    }   12.}   ②饿汉式单例 13.//饿汉式单例类.在类初始化时,已经自行实例化    14.public class Singleton1 {   15.    private Singleton1() {}   16.    private static final Singleton1 single = new Singleton1();   17.    //静态工厂方法    18.    public static Singleton1 getInstance() {   19.        return single;   20.    }   21.}   懒汉式与饿汉式区别? 从名字上来说,饿汉和懒汉, 饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了, 而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。 另外从以下两点再区分以下这两种方式:

1、线程安全: 饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题, 懒汉式本身是非线程安全的,为了实现线程安全有几种写法,分别是上面的1、2、3,这三种实现在资源加载和性能方面有些区别。

2、资源加载和性能: 饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成, 而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。


上一篇:[Java] abstract 关键词

下一篇:[Java] RTTI

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表