Spring面试题
1、什么是Spring
Spring是一个分层的轻量级java开发框架,为企业级应用开发提供了全面的编程和配置模型。它为Java开发者提供了近乎于全面的基础架构支持,使得我们只需关注应用的业务逻辑而无需去理会那些与业务逻辑无关的繁琐、重复的编程工作。
Spring的众多功能特性大都依赖于他的两个核心功能模块:依赖注入( dependency Injection )和面向切面编程(AOP)。
1.1、Spring的优缺点
优点:
1、使用Spring的IOC容器,将对象之间的依赖关系交由Spring管理,降低了组件之间的耦合性,实现了软件各层的解耦。
2、使用容器提供众多服务,如事务管理、消息队列等。
3、AOP技术,利用它可以实现一些拦截,如权限拦截。
4、对主流的框架提供了很好的支持,如Mybatis。
5、低浸入式设计
6、Spring的DI机制降低了业务对象替换的复杂性。
缺点:
Spring依赖反射机制,反射机制占用内存影响性能。
1.2、Spring中有哪些功能模块
1、Spring Core
框架的最基础部分,提供IoC容器,对bean进行管理
2、Spring Context
基于Bean,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。
3、Spring Dao
提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的代码错误,还提供了声明式事务管理方法。
4、Spring ORM
提供了常用的对象-关系映射APIs的集成,其中包括Hibernate、Mybatis等。
5、Spring AOP
提供了符合AOP Alliance规范的面向切面的编程实现。
6、Spring Web
提供了基础的Web开发的上下文信息
7、Spring Web MVC
提供了web应用的Model-View-Controller功能实现。
1.3、Spring中用到的设计模式
1、工厂模式
Spring通过BeanFactory或者ApplicationContext创建Bean对象用到了工厂模式。
2、单例模式
Spring中bean的作用域默认为单例模式(singleton)。
3、代理模式
Spring AOP(面向切面编程)基于动态代理,如果要代理的对象实现了某个接口,SpringAOP会使用JDK Proxy创建代理对象;如果对象没有实现接口,Spring AOP会使用CGLib生成一个被代理对象的子类作为代理。
4、模板方法模式
Spring中的jdbcTemplate等以Template结尾的对数据库操作的类就使用了模板模式。
5、适配器模式
Spring AOP的实现基于代理模式,但是SpringAOP的增强(Advice)使用了适配器模式。SpringMVC的HandlerAdapter也是适配器模式。
6、观察者模式
定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,Spring事件驱动模型就是观察者模式一个很经典的应用。
1.4、Spring中的事件有哪几种?
1、上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
2、上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
3、上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
4、上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
5、请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知。
2、什么是IoC?
IOC(Inverse of Control)即控制反转——某一接口具体实现类的选择控制权从调用类中移除,转交由第三方Spring容器借由bean配置来进行控制。SPring IoC负责创建对象、管理对象、装配对象、配置对象,并且管理对象的整个生命周期。
(注:依赖注入(DI)其实指的就是IoC,其解释为:让调用类对某一接口实现类的依赖关系由第三方(Spring 容器)注入,以移除调用类对某一接口实现类的依赖。)
2.1、IoC的作用
管理对象的创建和依赖关系的维护。对象的创建并不是一件简单的事,在对象关系比较复杂时,如果依赖关系需要程序员来维护的话成本是很高的。
解耦,由容器去维护具体的对象。
托管了类的生产过程,比如我们需要在类的生产过程中做一些处理,最直接的例子就是代理,如有容器程序可以把这部分处理交给容器,应用程序则无需去关心类是如何完成代理的。
2.2、Spring IoC的实现机制
Spring 中的IoC的实现原理就是工厂模式加反射机制。
2.3、Spring的IoC支持哪些功能?
1、依赖注入
2、依赖检查
3、自动装配
4、支持集合
5、指定初始化方法和销毁方法
2.4、IoC的类型有哪几种?(依赖注入的类型有哪几种)
1、构造函数注入
通过调用类的构造函数,将接口实现类通过构造函数变量传入。
2、属性注入
有选择的通过Setter方法完成调用类所需依赖的注入,更加灵活方便。
3、接口注入
将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现改接口提供相应的注入方法(必须先声明一个借口)。
(注:Spring可以通过容器来完成依赖关系的注入)
3、Spring AOP
OOP(Object-Oriented Programming)面向对象编程,允许开发者定义纵向的关系,但并不适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。
AOP(Aspect-Oriented Programming),一般称为面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理等。
4、Spring的通知有哪些类型?
AOP 术语中,切面的工作被称为通知,实际上是程序执行时要通过Spring AOP框架触发的代码段。Spring切面可以应用5种类型的通知:
1、前置通知(@Before):在目标方法被调用之前调用此功能
2、后置通知(@After):在目标方法完成之后执行
3、返回通知(@AfterReturning):在目标方法成功执行之后调用此功能
4、异常通知(@AfterThrowing):在目标方法抛出异常后调用此通知
5、环绕通知(@Around):在目标方法调用之前和调用之后执行
5、Spring中bean的生命周期?
1、Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化
2、Bean实例化后对将Bean的引入和值注入到Bean的属性中
3、如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
4、如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
5、如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。
6、如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
7、如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
8、如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们postProcessAfterInitialization()方法。
9、此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
10、如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。
beanFactory和applicationContext的区别?
ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。beanFactory是Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能。而ApplicationContext应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;1.国际化(MessageSource)、2.访问资源(ResourceLoader)、3.载入多个(有继承关系的上下文),使得每一个上下文都专注于一个特定的层次。4.消息发送、响应机制(ApplicationEventPublisher)5.AOP拦截器
beanFactory和applicationContext的主要区别体现在装载bean的方面:
beanfactory在容器启动的时候不会去实例化bean,而是在从容器中取bean的时候才实例化一个。
applicationContext在启动的时候就把所有的bean全部实例化了。