小言_互联网的博客

2020秋招Java面试题——Java框架题答案

328人阅读  评论(0)

Java框架

1. Spring的核心特性是什么?Spring优点?

  • Spring的核心是控制反转(IoC)和面向切面(AOP)
  • Spring优点:
    (1)方便解耦,简化开发 (高内聚低耦合)
    Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理
    spring工厂是用于生成bean
    (2)AOP编程的支持
    Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
    (3) 声明式事务的支持
    只需要通过配置就可以完成对事务的管理,而无需手动编程
    (4) 方便程序的测试
    Spring对Junit4支持,可以通过注解方便的测试Spring程序
    (5)方便集成各种优秀框架
    Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
    (6) 降低JavaEE API的使用难度
    Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

2. spring框架中需要引用哪些jar包,以及这些jar包的用途
4 + 1 : 4个核心(beans、core、context、expression) + 1个依赖(commons-loggins…jar)

3. 理解AOP、IoC的基本原理;

  • IOC:控制反转(IoC)与依赖注入(DI)是同一个概念,
    • 控制反转的思想:
      传统的 java 开发模式中,当需要一个对象时,我们会自己使用 new 或者 getInstance 等直接或者间接调用构造方法创建一个对象。而在 spring 开发模式中,spring 容器使用了工厂模式为我们创建了所需要的对象,不需要我们自己创建了,直接调用 spring 提供的对象就可以了
    • 引入IOC的目的:
      (1)脱开、降低类之间的耦合;(2)倡导面向接口编程、实施依赖倒换原则;
      (3)提高系统可插入、可测试、可修改等特性
  • AOP:面向切面编程(AOP)
    • 面向切面编程思想:
      在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程。
    • 切面:简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
    • AOP 底层:动态代理。
      如果是接口采用 JDK 动态代理,如果是类采用CGLIB 方式实现动态代理。

4. AOP的一些场景应用;
AOP用来封装横切关注点,具体可以在下面的场景中使用:

  • Authentication 权限
  • Caching 缓存
  • Context passing 内容传递
  • Error handling 错误处理
  • Lazy loading 懒加载
  • Debugging  调试
  • logging, tracing, profiling and monitoring 记录跟踪 优化 校准
  • Performance optimization 性能优化
  • Persistence  持久化
  • Resource pooling 资源池
  • Synchronization 同步
  • Transactions 事务

5. spring注入的几种方式

(1)构造方法注入
(2)setter注入
(3)基于注解
6. Spring容器的加载顺序?
Spring解析,加载及实例化Bean的顺序
7. spring如何实现事务管理的
参考:
实现原理
实现方式
8. Spring中Bean的作用域有哪些

  • 作用域:用于确定spring创建bean实例个数
  • 取值(常用的两个):
    singleton 单例,默认值。
    prototype 多例,一个 bean 的定义可以有多个实例。每执行一次getBean将获得一个实例。

9. 请介绍一下bean的生命周期
(1)bean 定义:在配置文件里面用来进行定义。
(2)bean 初始化:有两种方式初始化:
在配置文件中通过指定 init-method 属性来完成
实现 org.springframwork.beans.factory.InitializingBean 接口
(3)bean 调用:有三种方式可以得到 bean 实例,并进行调用
(4)bean 销毁:销毁有两种方式
使用配置文件指定的 destroy-method 属性
实现 org.springframwork.bean.factory.DisposeableBean 接口

10. Spring中自动装配的方式有哪些

  • no:不进行自动装配,手动设置Bean的依赖关系。
  • byName:根据Bean的名字进行自动装配。
  • byType:根据Bean的类型进行自动装配。
  • constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。
  • autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配。
    (自动装配没有自定义装配方式那么精确,而且不能自动装配简单属性(基本类型、字符串等),在使用时应注意。)
    11. @Resource 和 @Autowired 区别?分别用在什么场景?
    (1)共同点:两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
    (2)不同点:
  • @Autowired
    @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
    @Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
  • @Resource
    @Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

12. 静态代理和动态代理的区别?
参考:java经典讲解-静态代理和动态代理的区别

13. Hibernate和mybatis的区别?
(1)两者最大的区别
  针对简单逻辑,Hibernate与MyBatis都有相应的代码生成工具,可以生成简单基本的DAO层方法。
  针对高级查询,MyBatis需要手动编写SQL语句,以及ResultMap,而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于流程。
(2)开发难度对比
  Hibernate的开发难度大于MyBatis,主要由于Hibernate比较复杂,庞大,学习周期比较长。
  MyBatis则相对简单,并且MyBatis主要依赖于生气了的书写,让开发者刚进更熟悉。
(3)sql书写比较
  Hibernate也可以自己写sql来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性,不过Hibernate具有自己的日志统计。
  MyBatis的sql是手动编写的,所以可以按照要求指定查询的字段,不过没有自己的日志统计,所以要借助Log4j来记录日志。
(4)数据库扩展性计较
  Hibernate与数据库具体的关联在XML中,所以HQL对具体是用什么数据库并不是很关心
  MyBatis由于所有sql都是依赖数据库书写的,所以扩展性、迁移性比较差。
(5)缓存机制比较
  Hibernate的二级缓存配置在SessionFactory生成配置文件中进行详细配置,然后再在具体的表对象映射中配置那种缓存。
  MyBatis的二级缓存配置都是在每个具体的表对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓冲机制,并且MyBatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
  
两者比较,因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL,所以在使用二级缓存时如果出现脏数据,系统会报出错误提示。 而MyBatis在这一方面使用二级缓存时需要特别小心,如果不能完全去顶数据更新操作的波及范围,避免cache的盲目使用,否则,脏数据的出现会给系统的正常运行带来很大的隐患。

  1. mybatis是如何工作的?
    参考博客 https://blog.csdn.net/u014745069/article/details/80788127

15. Hibernate对象有几个状态值?(现在面试基本不问Hibernate了)
Transient 瞬时 :对象刚new出来,还没设id,设了其他值。
Persistent 持久:调用了save()、saveOrUpdate(),就变成Persistent,有id
Detached 脱管 : 当session close()完之后,变成Detached。

16. 对ajax的理解
参考:对ajax的理解
17. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理
参考:session和cookie的区别和联系,session的生命周期,多个服务部署时session管理
18. 简述Springmvc的流程;
参考博客 简述Springmvc的流程

19. spring中beanFactory和ApplicationContext的联系和区别
参考:BeanFactory和ApplicationContext的区别
20. Springmvc和Springboot有什么区别?
Spring MVC 是基于Spring的一个 MVC 框架 ;
Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。

21. Springboot为什么配置简单?(即它自动做了什么操作才能简化程序员的操作)
主要是使用了spring3之后提供的注解,来代替xml文件的配置,最核心的是以下两个注解
@Configuration,标注在类上,相当于定义一个配置类,一份spring的配置文件
@Bean,类似于spring配置文件中的
通过这两个注解就可以用java代码的方式来完成相关spring配置

22. 持久层设计要考虑的问题有哪些?请谈一下你用过的持久层框架都有哪些?
"持久"就是将数据保存到可掉电式存储设备中以便今后使用,简单的说,就是将内存中的数据保存到关系型数据库、文件系统、消息队列等提供持久化支持的设备中。持久层就是系统中专注于实现数据持久化的相对独立的层面。

持久层设计的目标包括:

  • 数据存储逻辑的分离,提供抽象化的数据访问接口。
  • 数据访问底层实现的分离,可以在不修改代码的情况下切换底层实现。
  • 资源管理和调度的分离,在数据访问层实现统一的资源调度(如缓存机制)。
  • 数据抽象,提供更面向对象的数据操作。

持久层框架有: Hibernate、MyBatis、TopLink、 Guzz、 jOOQ、 Spring Data、ActiveJDBC


转载:https://blog.csdn.net/chao_ji_cai/article/details/98960419
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场