面试题整理(8)

每天五道面试题!只记录答案,不标出源码,有什么不对的地方欢迎评论,共同进步。

1. 什么是Spring

  Spring是一个轻量级的IOC和AOP容器框架,是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发。

主要由以下七个模块组成

  1、Spring Core:核心类库,提供IOC服务。

  2、Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等)。

  3、Spring AOP:AOP服务。

  4、Spring DAO:对JDBC的抽象,简化了数据访问异常的处理。

  5、Spring ORM:对现有的ORM框架的支持。

  6、Spring WEB:提供了基本的面向WEB的综合特性,例如多方文件上传。

  7、Spring MVC:提供面向WEB应用的MVC实现。

2. Spring中Autowired和Resource关键字的区别

相同点

  两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

不同点

  @Autowired为Spring提供的注解,只能按照byType注入,默认情况下要求依赖对象必须存在,如果允许null,可以设置它的required属性为false。如果需要通过byName注入,可以结合@Qualifier注解一起使用。

  @Resource默认按照byName自动注入,支持byType注入,由J2EE提供,属性有两个:name和type。同时指定name和type,会从Spring上下文找唯一匹配的bean装配,找不到抛异常。

3. 对Spring AOP的理解

  AOP,一般称为面向切面编程,是面向对象编程的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块命名为“切面”(Aspect),减少系统中的重复代码,降低模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。

  AOP实现的关键在于代理模式,AOP代理主要分为静态代理动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。

  1、AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强,会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的时候就是增强后的AOP对象。

  2、Spring AOP使用的动态代理,动态代理指AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。主要方式有两种:JDK动态代理(只提供接口的代理,Spring默认使用)和CGLIB动态代理(可以对不是final的类进行代理,实际就是通过继承的方式进行动态代理)。

  3、静态代理与动态代理区别在于生成AOP代理对象的时机不同,相对来说AspectJ的静态代理方式具有更好的性能,但是AspectJ需要特定的编译器进行处理,而Spring AOP无需特定编译器处理。

  4、JDK代理较CGLIB创建快很多,但是运行上CGLIB更快,所以单例情况下,选择CGLIB更好。

  5、JDK代理底层是基于反射实现,而CGLIB底层借助asm字节码技术实现,AspectJ在程序编译时不产生新的class,而是插入代理的字节码。

4. Spring Bean的生命周期

  1、实例化Bean:对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。

  2、设置对象属性(依赖注入):实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息以及通过BeanWrapper提供的设置属性的接口完成依赖注入。

  3、处理Aware接口:接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean。

  4、BeanPostProcessor:如果想对Bean进行一些自定义的处理,那么可以让Bean实现BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。

  5、InitializingBean与init-method:如果Bean在Spring配置文件中配置了init-method属性,则会自动调用其配置的初始化方法。

  6、调用方法:如果这个Bean实现了BeanPostProcessor接口,会调用postProcessBeforeInitialization(Object obj, String s)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术。

  以上几个步骤完成后,Bean就已经被正确的创建了,之后就可以使用这个Bean了。

  7、DisposableBean:当Bean不再需要时,会经过处理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法。

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

5. Spring支持的集中Bean的作用域

  Spring容器中的Bean可以分为五个范围

  1、singleton:默认,每个容器红只有一个bean的实例,单例模式由BeanFactory自身来维护,生命周期随着容器销毁而销毁。

  2、prototype:多例模式,为每个bean请求提供一个实例,不会随着容器的销毁而销毁,由垃圾回收处理。

  

剩下三种只在WEB服务时使用
  

  3、request:为每个网络请求创建一个实例,在请求完成后,bean会失效并被垃圾回收器回收。

  4、session:每个session有一个bean实例,在session过期后,bean会随之失效。

  5、global-session:可以理解为集群模式下的session。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值