Spring的那些事儿(面试整理)

最近在求职,面试的时候,被问到Spring的主要核心模块,当时一脸茫然的看着面试官,面试官也对我微微一笑,我还能怎么办?也只能回之以微笑,呵呵,算是凉凉了。

面对所谓的互联网的寒冬,求职是真的不容易呀,顶着烈日去面试,也是够辛苦的。这里整理一下,以备下次再被问到,就不会用呆萌的眼神看着面试官了。哈哈

好了,废话不多说,言归正传,今天聊聊Spring的核心模块

在面试的时候,很多面试官,都会问到,谈谈你对Spring的理解?Spring是如何管理bean的?你给我说一下Spring管理的bean的生命周期…总之,在简历上面写了熟悉Spring框架,这些问题,几乎都会被问到。今天就整理一下关于Spring的知识点。后续面试得更多,会持续更新

  1. 什么是Spring?
    Spring是一个DI/IOC、AOP的轻量型容器框架,我们以前没有使用框架的时候,都是需要自己去new创建bean,现在我们可以直接将bean交给Spring管理,通过依赖注入的方式获取bean。在Spring的AOP模块上面,我们通常是在日志记录、事务管理、性能检测等方面会使用到Spring的AOP。

  2. Spring有哪些核心模块?
    Spring一共有七大核心模块包括:core、orm、dao、web、context、aop、mvc、aop。

核心容器(Spring Core)
core提供Spring框架的基本功能。Spring使用BeanFactory来产生和管理Bean,以bean的方式组织和管理Java应用中的各个组件及其关系。BeanFactory使用控制反转将应用的配置和依赖性规范与实际的应用程序代码分开。

对象实体映射(Spring ORM)
Spring框架可以集成若干个ORM框架,如:Hibernate、JDO和 IBatis SQL Map等,提供了ORM对象的关系工具,这些ORM框架都遵从Spring的通用事物和DAO异常层次结构。

JDBC和DAO模块(Spring DAO)
JDBC、DAO的抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理,和不同数据库供应商所抛出的错误信息。异常层次结构简化了错误处理,并且极大的降低了需要编写的代码数量,比如打开和关闭链接。

Web模块(Spring Web)
Web上下文模块建立在应用程序上下文模块之上,为基于web的应用程序提供了上下文。web模块简化了处理多部分请求以及将请求参数绑定到域对象的工作。

应用上下文(Spring Context)
Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能。

MVC模块(Spring Web MVC)
MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的。MVC容纳了大量视图技术,其中包括JSP、POI等,模型来有JavaBean来构成,存放于model当中,而视图是一个接口,负责实现模型,控制器表示逻辑代码,由c的事情。Spring框架的功能可以用在任何J2EE服务器当中,大多数功能也适用于不受管理的环境。Spring的核心要点就是支持不绑定到特定J2EE服务的可重用业务和数据的访问的对象,毫无疑问这样的对象可以在不同的J2EE环境,独立应用程序和测试环境之间重用。

Spring面向切面编程(Spring AOP)
 通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring框架中。所以,可以很容易地使 Spring框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

  1. Spring AOP中JDK和CGLib动态代理,哪一个的效率更高?
    我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理,另一种是CGLib的方式。
    JDK动态代理:只能为接口创建代理实例。
    主要涉及java.lang.reflect包下边的两个类:Proxy和InvocationHandler。其中,InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态地将横切逻辑和业务逻辑编织在一起。
    CGLib:为通过接口定义业务方法的类,创建动态代理实例。
    采用底层的字节码技术,全称是:Code Generation Library,CGLib可以为一个类创建一个子类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。
    JDK 和 CGLib动态代理区别

JDK动态代理具体实现原理:面向接口的代理模式
①通过实现InvocationHandler接口创建自己的调用处理器;
②通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理;
③通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型;
④通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入;

CGLib动态代理:通过字节码底层继承要代理类
CGLib是一个强大、高性能的Code生产类库,可以实现运行期动态扩展java类,Spring在运行期间通过 CGlib继承要被动态代理的类,重写父类的方法,实现AOP面向切面编程呢。

两者性能的对比
在1.6和1.7的时候,JDK动态代理的速度要比CGLib动态代理的速度要慢
JDK1.8以后,JDK动态代理的速度已经比CGLib动态代理的速度快很多了

  1. Spring的常用注解
    @Component泛指组件,不属于三层,但需要Spring管理
    @Repository 数据访问组件,即DAO组件。
    @Service 业务层组件、
    @Controller 控制层组件
    @Scope用于指定scope作用域的(用在类上)
    @Autowired 默认按类型装配,

  2. Spring管理的bean的生命周期
    ①从BeanFactory或ApplicationContext取得的单例的bean;
    ②按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;
    ③如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值;
    ④如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);
    ⑤如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);
    ⑥如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
    ⑦如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法;
    ⑧如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;

以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。

⑨当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;
⑩最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

  1. Spring如何处理线程并发问题?什么是ThreadLocal?
    在Spring所创建的是单例的模式,每个request请求过来,系统都会用原有
    一般所有的模块是共享采用的是ThreadLocal进行一个线程并发的问题。
    ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。采用以空间换取时间,为每一个线程提供一个变量的副本,可以同时访问而互不访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值