疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java面试题Java框架部分


 

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