Java面试小结(五)

关于Java面试,Spring Redis相关。参考博客Review-Day12

Http协议中,get与post的区别

  • (1)get请求一般用于获取数据,post请求一般用于需要发数据到后台时使用

  • (2)get请求的参数,会放在url上,所以安全性,隐私性会比较差,post请求的参数会放在request.body中,比较的安全

  • (3)get请求不受到刷新,回退的影响,post请求则会在网页回退或者刷新后,重新进行发送

  • (4)get请求会被缓存,post请求不会被缓存

  • (5)get请求会被记录在浏览器的历史记录中,post请求则不会被记录

  • (6)get请求可以被收藏为标签,post不能被收藏为标签

  • (7)get请求只能进行url编码,post请求则支持多种编码

  • (8)get请求通常通过url地址栏请求,post通常通过表单发送数据请求

  • (9) post请求url长度理论上没有限制,get请求有限制[不同的浏览器不一样]

什么是IOC,有什么好处?底层用什么技术实现?

Ioc—Inversion of Control,即“控制反转”,一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

IOC的优点:

  • 第一,资源集中管理,实现资源的可配置和易管理。
  • 第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。

IOC底层原理使用的技术

  • xml配置文件
  • 工厂模式
  • 反射

什么是AOP? 使用场景是什么?AOP底层技术是什么?两种代理模式的区别是什么?

AOP面向切面编程

定义:通过预编译方式和运行期动态代理实现,在不修改源代码的情况下,给程序动态统一添加功能的一种技术。是spring框架的一个重要内容,是OOP(面向对象编程)的衍生模范。

AOP的作用:

AOP可以做到在程序的运行期间, 不修改业务代码的情况下对方法进行功能的增强.

AOP的使用场景:

  • 可以使用AOP进行程序运行时的权限验证.

  • 使用AOP添加日志输出功能,避免因为日志模块修改API导致修改起来很复杂的问题。

  • 监听一些重要的生命周期的运行,并输出日志

AOP的优势:

  • AOP可以减少重复的代码
  • AOP可以在很大程度上提高开发效率
  • AOP编写出来的代码, 可以很方便的进行维护

AOP底层技术:

AOP的底层是通过spring提供的动态代理技术实现的. 在程序的运行期间, spring动态生成代理对象, 代理对象的方法在执行时就可以进行增强功能的介入, 从而完成目标对象方法的功能增强.

JDK动态代理和CGLIB动态代理的区别?

(1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
(2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final

Spring中的bean的生命周期是什么?

  • 实例化 Instantiation

  • 属性赋值 Populate

  • 初始化 Initialization

  • 销毁 Destruction

  • 实例化一个Bean,也就是我们通常说的new

  • 按照Spring上下文对实例化的Bean进行配置,也就是IOC注入

  • 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID

  • 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)

  • 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法

  • 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术

  • 如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法

  • 如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法

注意:以上工作完成以后就可以用这个Bean了,那这个Bean是一个single的,所以一般情况下我们调用同一个ID的Bean会是在内容地址相同的实例

  • 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法

  • 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法

Spring的依赖注入有哪些方式?

什么是依赖注入

  • 依赖 : 指Bean对象的创建依赖于容器 .
  • 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 .

由容器动态的将某个依赖关系注入到组件之中

依赖注入的类型有三类

  • 基本数据类型和String类型
  • 其他bean类型(在配置文件中或者注解配置过的bean)
  • 复杂类型/集合类型

注入方式

  • **通过构造函数注入(**前提:构造函数注入的属性最好不经常发生改变,类中提供了有参的构造函数.)
  • 使用属性的setter方法注入(属性注入即通过setXxx()方法注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际应用中最常采用的注入方式)
  • 注解注入(使用注解注入依赖对象不用再在代码中写依赖对象的setter方法或者该类的构造方法,并且不用再配置文件中配置大量的依赖对象,使代码更加简洁,清晰,易于维护)
  • 接口注入(接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限)

spring如何实现事务管理?

  • 编程式事务管理:通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
  • 声明式事务管理:将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务

描述session与cookie

  • cookie数据存放在客户的浏览器上,session数据放在服务器上.
  • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
  • 设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)