Spring相关问题

1.什么是Spring框架?

Spring是一个轻量级的java开源框架,为了解决企业级应用开发的复杂性创建的java开发平台,其核心是为了简化java开发,为了简化java开发,Spring采取以下四种策略:

  1. 基于pojo的轻量级和最小入侵式编程。
  2. 通过依赖注入和面向接口编程实现松耦合
  3. 基于切面实现声明式编程
  4. 通过切面和模板减少样板式代码

2.Spring框架有哪些主要的模块?

  1. Spring IOC : Spring的核心模块,包含了最基本的IoC容器BeanFactory的接口和实现,IOC容器的高级使用行态ApplicationContext应用上下文供用户使用。
  2. Spring Aop: Spring的核心模块,围绕着AOP的增强功能,Spring集成了Aspectj作为AOP的一个特定实现,同时还基于jdk动态代理(代理对象有接口的时候)/CGLIB(字节码生成的开源类库,代理对象没接口的时候)的基础上,实现了一个AOP框架。
  3. Spring MVC : 以DispatcherServlet为核心,实现了MVC模式,包括怎么样与WEB容器环境的集成,web请求的分发,拦截,处理和ModelAndView数据的返回,以及如何集成各种UI视图展现和数据表现。
  4. Spring jdbc/Spring ORM :Spring 对jdbc做了一层封装,提供了JdbcTemplate作为模板类,Spring提供了许多对ORM工具的封装。
  5. Spring 事务处理:Spring事务处理是使用Spring aop对功能进行增强的模块,提供IOC容器读入配置。

3.什么是控制反转?什么是依赖注入?

控制反转也称为依赖倒置原则,如果对象之间的依赖关系由具体的对象来完成,那么将要导致代码的高度耦合和可测试性降低,如果把对象的依赖关系交给Ioc容器或者框架来完成,把具体的控制权交给平台或者框架来处理,将会降低面向对象系统设计的复杂性和提高系统的可测试性,控制反转是指一个对象如何获取它所依赖的对象的引用,反转是指责任的反转。

4.Spring IOC 应用场景

Spring中,Spring IOC 提供了JavaBean容器,通过IOC模式管理依赖关系,并通过依赖注入和AOP切面增强了为JavaBean这样的POJO对象赋予了事务管理等基本功能,使用IOC容器,把资源获取的方向反转,让IOC容器主动管理这些依赖关系,将这些依赖关系注入到组件中,那么会让这些依赖关系的适配和管理更加灵活,有三种注入方式:

  • 接口注入
  • setter注入
  • 构造器注入

5.BeanFactory和ApplicationContext的区别

在Spring容器中主要有两个系列的基本容器,一个是实现BeanFactory接口的简单系列容器,这个容器只实现了最基本容器功能;另一个是ApplicationContext应用上下文,它作为容器的高级形态而,这个容器在简单容器的基础上增加了许多面向框架的特性。
ApplicationContext容器提供了BeanFactory不具备的新特性:

  • 支持不同的信息源。
  • 访问资源。
  • 支持应用事件。
  • 在ApplicationContext提供附加服务。
    几种应用上下文(IoC容器):
    1.AnnotationConfigApplicationContext:从一个或多个基于java配置类中加载Spring应用上下文,加载bean,然后包装成BeanDefinition。
    2.AnnotationConfigWebApplicationContext:从一个或多个基于java配置类中加载Spring Web应用上下文,加载bean。
    3.ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载Spring应用上下文。
    4.FileSystemXmlApplicationContext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
    5.XmlWebApplicationContext:从web应用下的一个或多个xml配置文件中加载上下文定义。

6. Spring的配置方式

1.基于xml配置。
2.基于注解的配置
3.基于java类的配置

7.如何使用基于xml配置的方式配置Spring

使用xml文件配置,bean标签。

8.如何适应基于java类的方式配置Spring

对于java配置类加上@Configration注解,对于pojo加上@Bean注解。

9.如何使用基于注解的方式配置Spring

这种方式也叫做自动化装配(应用组件之间的协作),Spring从两个角度实现自动化装配
1.组件扫描:Spring会自动发现应用上下文所创建的bean
为pojo加上@Component注解,表明它是一个java bean。在通过@ComponnentScan注解来开启组件扫描(java 类配置的方式@Configuration注解)或者xml文件,默认会扫描与配置类相同的包。
如何设置扫描的基础包:@ComponentScan(basesPackage={"包名","包名"})

2.自动装配:Spring自动满足bean之间的依赖。
让Spring自动满足bean依赖的一种方法,可以使用@Autowired注解进行自动装配。

10.Spring bean的生命周期(bean的创建过程)

  • Spring对bean进行实例化
  • Spring将值和bean引用注入到bean对应的属性中
  • 如果bean实现了BeanNameAware接口,Spring将bean的id传给setBeanName()方法
  • 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory传入
  • 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来。
  • 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法。
  • 如果bean实现了InitializingBean接口,Spring将调用它们的postProcessAfterInitialization()方法。
  • 此时bean已经准备就绪,可以被应用程序所使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁。

11.Spring bean的作用域

在默认情况下Spring IOC容器中的所有bean都是以单例形式创建的,改变bean作用域可以使用@Scope注解来改变。xml 中 <scope = "prototype">

  • 单例:在整个应用中,只创建bean的一个实例。
  • 原型:每次注入或者通过Spring应用上下文获取的时候,都会创建一个bean实例。
  • 会话:在web应用中,为每个会话创建一个bean实例。
  • 请求:在web应用中,为每个请求创建一个bean实例。

12.Spring用到哪些设计模式

单例模式 --- bean加载默认单例
代理模式 -- AOP
工厂模式 --- Ioc容器BeanFactory就是使用工厂模式
模板方法模式 --- 封装jdbc的方法,jdbcTemplate
控制反转模式 --- Spring核心Ioc的生成。

13.Spring 如何实现IoC

Spring有两种类型的容器BeanFactory和ApplicationContext,
使用Ioc容器时的几个步骤:

  • 创建IoC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息。
  • 创建一个BeanFactory
  • 创建一个BeanDefinition的读取器,这里使用XmlBeanDefinitionReader来载入XML文件形式的BeanDefinition
  • 从定义好的资源位置读取配置信息,具体的解析过程由XmlBeanDefinitionReader来完成。完成整个载入和注册Bean定义之后,需要的IoC容器就建立起来了。

IoC容器的实现过程:

第一步:IoC容器的初始化,这个过程包括BeanDefinition的Resource定位,载入和注册三个基本过程。

  • 定位:BeanDefinition的资源定位。
  • BeanDefinition的载入过程,这个载入是指把用户定义好的Bean表示成IoC容器的内部数据结构BeanDefinition。
  • 向IoC容器中注册这些BeanDefinition的过程,就是将BeanDefinition注入到一个HashMap中去,IoC容器就是通过这个HashMap来持有这些BeanDefinition数据的。

第二步:IoC容器的依赖注入
getBean()方法是依赖注入的起点,Bean对象会依据BeanDefinition定义的要求生成,提供了两种实例化java对象的方法,一种通过JVM的反射功能,一种通过前面提到的CGLIB来生成。其依赖关系在BeanDefinition中。

14.Spring如何实现AOP

AOP面向切面编程,Spring提供了两种AOP实现:Spring AOP + AspectJ.
第一步:创建AopProxy代理对象,代理对象的生成有两种生成过程,
1.使用JDK的动态代理。
2.使用字节码生成器CGLIB生成。
如果目标对象是接口类,则采用JDK动态代理方式生成,否则使用CGLIB来生成。
第二步:对调用方法进行拦截,当代理对象的暴露的方法被调用时,首先会对这些方法调用进行拦截,拦截过程在JDK的Proxy代理对象中,是通过invoke方法来完成的,在CGLIB的Proxy代理对象中,拦截是由设置好的回调callback来完成的。

15.Spring 中bean的创建过程

Spring bean实例化,然后调用一系列的生命周期方法完成bean的创建,默认是以单例模式创建的,原型,会话,请求模式。

16.Spring bean的加载机制

Spring中的IoC容器来加载bean,有两种类型的IoC容器,BeanFactory,ApplicationContext。
首先,初始化IoC容器,就是定位,载入和注册BeanDefinition,就是在容器内部维持一个hashmap装载BeanDefinition。然后对IoC容器进行依赖注入,bean对象会根据BeanDefinition的要求生成,通过了两种实例化java对象的方法,JVM反射和CGLIB.

17.Spring MVC是什么?

Spring是一个java软件开发平台,提供IoC AOP 事务处理 持久化等功能,Spring MVC是未用户开发web应用提供支持。

18.Spring IOC容器是怎么样在web环境中发挥作用的?

Spring MVC是建立在IOC容器基础上的,因此要先启动ioc容器,启动过程如下:
从servlet事件中得到ServletContext,然后通过读取web.xml中的配置文件,
ContextLoaderListener被定义为一个监听器,这个监听器是与web服务器生命周期相关联的,因为ContextLoaderListener 实现ServletContextListener接口,这个接口监听ServletContext事件,然后调用ContextLoader初始化Ioc容器。

19.Spring MVC的过程?

Spring MVC的核心是DispatcherServlet,DispatcherServlet继承HttpServlet,DispatcherSevlet的工作主要有两个,
1.DispatcherServlet的启动和初始化,DispatcherServlet的启动过程是和Servlet的启动过程相联系的,Servlet初始化时其init方法会被调用,DispatcherServlet的初始化过程由其基类的HttpServletBean完成,接着会执行DispatcherServlet的持有的IoC容器的初始化过程,初始化时一个新的上下文被建立起来,这个上下文被设置为根上下文的子上下文,和Servlet对应的一个上下文。DispatcherServlet会初始化HandlerMapping和ViewResolver,默认使用的HandlerMapping是BeanNameUrlHandlerMapping

  • 对HTTP请求进行响应:在初始化完成之后,上下文环境已经定义的HandlerMapping已经被加载了,这些加载的HandlerMapping被放到一个List中,这个List中的每一个元素对应着一个具体的HandlerMapping得配置,每个HandlerMapping持有一系列的从url到Controller的映射,通过HandlerMapping接口类的getHandler()方法,可以获得与HTTP请求对应的HandlerExecutionChain,这个HandlerExecutionChain它有一个Inteceptor链和一个Controller对象.
    Spring MVC的执行步骤
  • 建立Controller对象和HTTP请求之间的映射关系,这个工作是由HandlerMapping中封装的HandlerExecutionChain对象来完成的,对Controller对象和URL的映射关系式在配置bean中描述的,并在IOC容器(WebApplicationContext)中初始化,这些映射关系会被放入到hashmap中。
  • 在mvc框架接受http请求之后,会在handlermapping中进行查询,从而得到对应的HandlerExecutionChain,这个HandlerExecutionChain封装了配置的Controller对象,这个Controller对象会完成的请求的响应动作,生成需要的ModelAndView对象
  • 得到ModelAndView以后,DispatcherServlet会把模型数据交给特定的视图对象。

20.Spring支持事物,如何管理?

Spring事务处理模块是通过AOP功能来实现声明式事务处理的,通过TransactionProxyFactoryBean可以生成Proxy代理对象,在这个代理对象中,通过TransactionInterceptor来完成代理方法的拦截,将事务处理的功能编织进来,在实现声明式事务处理时是AOP和IOC模块集成的部分,对于具体的事务处理实现,比如事务的生成,提交,挂起,回滚,对于不同的数据库处理方式做了一个抽象和适配,适配的具体事务处理器包括,对DataSource数据源的事务处理支持,对Hibernate数据源的事务处理支持等。

21.Spring Dao那种设计模式用的最多?

模板方法设计模式,JdbcTemplate就是Spring对jdbc进行封装的数据库操作的类。

22.Spring MVC用过哪些注解?

@Controoler ---- 定义这个pojo是Controller
@Autowired ---- 注入这个对象
@RequestMapping --- 定义url映射关系
@SessionAttributes --- 设置会话对象
@ResponseBody --- 响应体
@Transactional --- 对数据库操作做事务处理

23.Spring AOP 场景和底层实现?

事务处理,日志打印就是一个典型的aop应用,生成代理对象AopProxy然后对调用方法进行拦截,从而实现对目标对象的增强,生成AopProxy的过程由两种,当代理对象实现接口时,使用jdk动态代理,当没有接口时使用CGLIB来生成字节码文件,cglib底层采用的是对ASM,ASM是一个可以动态修改已经编译过的class文件或者是动态生成新的java class。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,083评论 18 139
  • 什么是Spring Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Jav...
    jemmm阅读 16,358评论 1 133
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,000评论 11 349
  • #幸福是需要修出来的~每天进步1%~幸福实修11班/15徐则兰~杭州 20170919 【幸福三朵玫瑰】 今日3朵...
    徐则兰阅读 169评论 1 2
  • 瘦削的时间 划过 在冬天 没有飘雪 我也 感到了温暖 所以 想要靠岸 只是 不安的心 还没有回顾 便已经转身 我也...
    小熊y阅读 195评论 2 3