栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring框架问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring框架问题

Spring框架的问题
    • 1. 什么是Spring框架,Spring框架有哪些主要模块
    • 2.使用Spring框架带来的好处
    • 3. 什么是控制反转IOC,什么是依赖注入
    • 4.请解释下Spring框架中的IoC容器
    • 5. BeanFactory和ApplicationContext有什么区别
    • 6.Spring有几种配置方式
    • 7.Spring的自动装配
      • 前提
      • 进入正题
    • 8.Spring框架中都用了哪些设计模式
    • 9.注解的原理
    • 10.Spring中的jdbc与传统的jdbc的区别
    • 11.什么是面向切面编程(AOP)
    • 12.为了降低java开发的复杂性,Spring采取了以下4种关键策略
    • 13.依赖注入有哪些方式
    • 14.Spring如何减少xml的配置数量
    • 15.自动检测bean
    • 16.AOP理论中相关名词
      • 前提
      • 回到正题
    • 17.Spring切面可以应用的五种类型通知
    • 18.Spring提供的四种各具特色的AOP支持
    • 19.Spring提供了在Spring上下中配置数据源Bean的多种方式
    • 20.Spring为ORM框架提供的一些服务
    • 21.Spring的事务的支持
    • 22.Spring的注解的说明
    • 23.Spring的优点
    • 24.AOP的作用

注:有些按照自己理解写的,不一定对。如果有错误,请指正,谢谢

1. 什么是Spring框架,Spring框架有哪些主要模块

参考:廖雪峰的官方网站–Spring开发

Spring框架:

  1. Spring是一个可以快速开发Java EE 应用程序的开源框架,它提供了一系列底层容器和基础设备,并可以和大量常用框架无缝集成

Spring框架的主要模块有:

  1. 核心容器,数据访问/集成,web,AOP,设备,消息,测试

2.使用Spring框架带来的好处

参考:八零末愤青–什么是spring框架?spring特点与好处,使用spring框架的好处是什么.

  1. 简化开发,降低耦合度
    有了Spring,不必再为单实例模式类,属性文件解析等底层需要编写代码,可以更专注上层应用。Spring提供了IoC容器,将对象的创建交给容器,对象的依赖关系交给容器去控制,避免了代码的过度耦合

  2. AOP编程支持
    Spring提供了AOP功能,方便了面向切面的编程

  3. 声明事物的支持
    Spring中通过声明进行事务的管理

  4. 方便程序测试
    可以用非程序依赖的编程方式进行几乎所有的测试工作

  5. 方便集成各种优秀的框架
    Spirng对大量常用的开源框架可以无缝集成

  6. 降低Java EE API的使用难度
    Spring对很多难用的Java EE API 提供了封装层,使它们的使用难度大大降低


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

参考:ThinkWon–控制反转(IoC)与依赖注入(DI)详解

依赖:例 要创建A,但创建A的前提是创建B,AB之间有依赖关系,A依赖于B,B是A的依赖对象

  1. 控制反转(IOC):传统上是由程序代码来操作对象,控制反转就是将组件对象调用权交给了容器,用容器来实现组件对象的装配和管理。控制反转就是对组件对象的控制权的转移,由程序代码转移到外部容器
  2. 依赖注入(DI):容器动态的将某种依赖关系的目标对象注入到系统的各个关联组件之中(注入依赖对象),让容器去决定依赖关系。

4.请解释下Spring框架中的IoC容器
  1. Spring框架中的beans和context包构成了Spring框架和IoC容器的基础
  2. BeanFactory接口是Spring IoC容器的核心接口
  3. IoC容器具有依赖注入的功能,可以创建对象,IoC容器负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖

5. BeanFactory和ApplicationContext有什么区别

参考:廖雪峰的官方网站–JavaBean
pseudonym_–Spring中BeanFactory和ApplicationContext的区别
xuweiqiang–BeanFactory和ApplicationContext有什么区别
先了解:
以Factory结尾,表示它是一个工厂类(接口),如BeanFactory,它是一个负责生产和管理bean的一个工厂

javaBean:javaBean就是一个符合某些规范的类
符合以下条件的类为JavaBean

  1. 属性被private修饰符修饰
  2. ’读‘’写‘属性的方法被public修饰符修饰
  3. ’ 读‘属性方法有返回值,‘写‘属性方法无返回值

javaBean的主要作用是传递数据,把一组数据组合成一个bean便于传输,可以方便的被IDE工具分析,快速生成读写属性(getter和setter)的代码。

回到正题 区别

  1. BeanFactory是spring中较古老的Factory,用来实例化,配置和管理Bean,但太老了,所以它的子类ApplicationContext基本代替了它。除了有BeanFactory
    的实例化,配置和管理Bean,还能提供国际化的文本信息,统一资源文件的读取方式,提供在监听器中注册bean的时间
  2. Bean是延迟加载形式来注入bean的,实例化BeanFactory对象时并未实例化bean,在getbean()时才是实例化bean。而实例化ApplicationContext对象时,就一次性实例化了所有的Bean
  3. BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。

6.Spring有几种配置方式
  1. 基于XML配置
  2. 基于注解配置
  3. 基于Java配置

7.Spring的自动装配

参考:廖雪峰的官方网站–装配Bean
ZackGo–Spring的自动装配
唐浩荣–Spring详解(七)----Spring Bean的自动装配(基于XML的方式)
Spring 由构造函数自动装配
Spring 自动装配 byType

前提

Spring的流程
一个Spring项目开发的流程
创建项目-导入依赖-创建Spring的配置文件application.xml-配置接口-创建接口实现类-配置application.xml-配置测试类-项目整体目录结构-运行测试

装配bean在配置application.xml这一步

使用Spring的IoC容器,就是通过该application.xml配置文件,将Bean的依赖关系描述出来,然后让容器来创建并装配Bean,一旦容器初始化完毕,就直接从容器中获取Bean使用它们。

有两种配置方式
一是通过application.xml,Spring的配置文件配置
优点:所有的Bean都能一目了然的列出来,通过配置注入能更直观的看见每个Bean的依赖
缺点:繁琐,每增加一个组件,就得将新的Bean配置到xml中

二是通过Annotation,注释配置
优点:方便,无需xml,就能让Spring自动扫描到Bean并组装

而自动装配也是配置过程中的一步,所以自动装配也有两种方式,分别是基于application.xml配置和Annotation注释配置

进入正题

自动装配: 构造注入和setter注入有时在做配置时比较麻烦。所以框架为了提高开发效率,提供自动装配功能,用于简化配置。而所谓的自动装配,指的是spring容器依据某种规则(自动装配的规则,有五种),自动建立对象之间的依赖关系。而spring框架式默认不支持自动装配的,要想使用自动装配,则需要修改spring配置文件中标签的autowire属性。

【1】 Spring框架xml配置中共有五种自动装配

  1. no:默认 不支持自动装配
  2. default:表示默认采用上一级标签的自动装配的取值。如果存在多个配置文件的话,那么每一个配置文件的自动装配方式都是独立的。
  3. byName:
 

当一个bean节点带有 autowire=“byName” 的属性时:
[1]将查找其类中所有属性。(去查找id为a的A类的所有属性)

[2]去配置文件中查找是否存在id名称与属性名称相同的bean。(在application.xml中查找其它的bean,看它们的id是否与A类中属性相同)

[3]如果有,就取得该bean对象,并调用属性所在类中的setter方法,将找到的bean注入;找不到注入null。(A类中有一个属性为b,而application.xml中找到一个id为b的bean,那么就取得该bean对象将该bean注入A类)
注意:不可能找到多个符合条件的bean(id唯一)

  1. byType:
    当一个bean节点带有 autowire=“byType” 的属性时:
    byType表示通过属性类型自动装配
 
  
 

[1]该bean (A类)中的属性的类型
[2]然后在application.xml文件中找类型与该bean(A类)的属性类型匹配的bean (B类)
[3]然后将找到bean B注入到 bean a中
注意:找到多个符合条件的bean时会报错。若没找到这个类型的Bean,就不会注入
例如,在配置文件中,如果一个 bean 定义设置为自动装配 byType,并且它包含 SpellChecker 类型的 spellChecker 属性,那么 Spring 就会查找类型为 SpellChecker 的 bean

  1. constructor:
    一个bean节点用constructor自动配置(构造函数自动配置),那么将它的那个类的构造函数的中的某个参数的参数类型与application.xml中的bean的类名相比较,如果找到匹配的,就自动注入,否则会抛出异常。

如果一个 bean 定义设置为通过构造函数自动装配,而且它有一个带有 SpellChecker 类型的参数之一的构造函数,那么 Spring 就会查找定义名为 SpellChecker 的 bean并用它来设置构造函数的参数。并注入。

【2】 基于注解的方式自动装配
在使用@Autowired注解来自动装配指定的bean前,需要在Spring的配置文件进行配置
在启动Spring IoC容器时,容器自动加载了一个后置处理器,在容器扫描到@Autowied,@Resource或@Inject时,就会自动在I哦C容器自动查找需要的bean,并配给该对象的属性。

@Component:相当于,表示Spring会自动把这个类扫描进容器,value属性相当于id也可以直接写成 @Component(“id名”)、
@Value:相当于,这个注解表示注入一个值,但是这里只是一个简单值,如果是注入一个对象得用另一个注解(@Autowired)
@Repository:用于对DAO实现类进行标注
@Service:用于对Service实现类进行标注
@Controller:用于对Controller实现类进行标注
@Autowired:它默认是按byType进行匹配,可以用于修饰类成员变量(字段)、Setter 方法、构造函数,甚至普通方法,但是前提是方法必须有至少一个参数
@Resource默认按byName进行装配,名称可以通过name属性进行指定,如果没有指定name属性,则默认采用字段名进行查找,当找不到与名称匹配的bean时才按byType进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

8.Spring框架中都用了哪些设计模式
  1. 工厂模式:BeanFactory就是简单的工厂模式,用来创建实例对象
  2. 单例模式:Bean默认为单例模式
  3. 代理模式:Spring的AOP功能用到了JDK动态代理和CGLIB字节码生成技术
  4. 模板方法:用来解决代码重复的问题
  5. 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会被自动更新。
9.注解的原理

注解本质是继承了一个Annotation的特殊接口,其具体实现类是java运行时生成的动态代理类,我们通过反射获取注解时,返回的是java运行时生成的动态代理对象,通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法,该方法会从memberValues这个Map中索引出对应的值,而memberValues的来源时java常量池。

10.Spring中的jdbc与传统的jdbc的区别
  1. Spring 中的jdbc与传统的jdbc相比上了一层简单的封装,并提供了一些有用的接口,节省代码,什么的不用管(连接,事务,异常,关闭等),只要实现了Spring的回调类即可。
  2. 传统的jdbc的步骤:创建连接–创建sql语句–执行sql语句–返回结果集(设置在JavaBean中等待处理)–关闭连接释放资源
  3. Spring jdbc只需要实现创建sql语句,和返回结果集这一步,其它的都由Spring搞定。而这两步也是有接口,所以只需要实现这两个接口,返回实现类即可。
11.什么是面向切面编程(AOP)

针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以活得逻辑过程中各部分之间低耦合性的隔离效果

12.为了降低java开发的复杂性,Spring采取了以下4种关键策略
  1. 基于pojo的轻量级和最小侵入性编程
  2. 通过依赖注入和棉线接口实现松耦合
  3. 基于切面和惯例进行声明式编程
  4. 通过切面和模板减少样板代码
13.依赖注入有哪些方式

参考:唐浩荣–Spring详解(三)----认识IoC控制反转/DI依赖注入
依赖注入的方式

  1. 接口注入 在接口中定义要注入的信息,并通过接口完成注入
  2. Set注入 在接受注入的类中定义一个set方法,并将参数设置成需要注入的元素
  3. 构造注入 在接受注入的类中定义一个构造方法,并将参数中定义要注入的元素
14.Spring如何减少xml的配置数量
  1. 自动装配 有助于减少甚至消除元素和元素。让Spring自动识别如何装配Bean的依赖关系
  2. 自动检测 比自动装配更进一步,让Spring能够自动识别哪些类需要被配置成Spring Bean,从而减少对Bean元素的使用
15.自动检测bean

参考:随心更博–Spring 注解自动装载和检测
配置自动检测 ,需要使用,之后不再使用元素,Spring应用中的Bean都能够实现定义和装载

   	

该元素扫描指定包及其所有子包,并查找出能够自动注册为Spring Bean的类
通过注解知道哪些类需要注册成Spring Bean

  1. @Component 通用的构造型注解,表示该类为Spring组件
  2. @Controller 标识将该类定义为Spring MVC Controller
  3. @Repository 标识将该类定义为数据仓库
  4. @Service 标识将该类定义为服务

Spring扫描包时,会将使用了构造线注解的类,自动注册为Spring Bean,并设置默认id为无限定类名,全小写

16.AOP理论中相关名词

参考:FeelsChaotic–会用就行了?你知道 AOP 框架的原理吗?

小不点啊–框架源码系列三:手写Spring AOP(AOP分析、AOP概念学习、切面实现、织入实现

morris131–Spring中AOP的使用、切点表达式

前提

了解AOP

Spring框架的一个关键组件是**面向切面编程(AOP)**框架。在不改变类的代码的情况下,对类方法进行功能增强。
AOP方法的本质是 拦截,代理,反射。AOP的实现方式是使用动态代理技术
实现原理可以看作是代理/装饰设计模式的泛化

该图片来自博主小不点啊

该图片来自博主小不点啊 AOP概念学习
程序运行时会调用很多方法,这些方法就是Join points(连接点,可以被选择来进行增强的方法点),在这些方法的前后可以选择一个地方来切入,切入的地方就叫做Pointcut(切入点,选择增强的方法),然后Advice(增强的功能)加入到切入点所在的位置。Advice和Pointcut组成了一个切面(Aspect)

该图片来自博主小不点啊 AOP的几个概念
回到正题
  1. 关注点

(AOP把软件系统分为两个部分:核心关注点和横切关注点。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。)
核心关注点:业务处理的主要流程
横切关注点:此关注点是整个应用都使用的功能,它经常出现在核心关注点的多处,比如事务,安全,日志,几乎每个模块都需要的功能

  1. 切面
    增强功能和切入点的结合
  2. 增强或者通知
    在不修改原有代码的前提下,为某一个对象增加新的功能,在Spring中增强是通过拦截器实现的
  3. 织入
    将切面应用到目标对象来创建新的 代理对象的过程,是对方法的增强。
  4. 目标对象
    需要增强功能的对象称之为目标对象,也称为 被增强 或 被代理对象
  5. 代理对象
    为目标对象增加新功能而产生的一个新的对象称为代理对象,负责调用拦截器和目标对象的方法(包含了原始代码对象和增加后代码的对象)
  6. 引入
    向现有的类添加新方法或属性,从而无需修改这些现有类的情况下,让它们具有新的行为和状态。是对类的增强。
17.Spring切面可以应用的五种类型通知
  1. Before 在方法调用之前调用
  2. After 在方法完成之后调用
  3. After-returning 在方法成功执行之后调用
  4. After-throwing 在方法抛出异常之后调用
  5. Around 通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
18.Spring提供的四种各具特色的AOP支持
  1. 基于代理的经典AOP
  2. @AspectJ注解驱动切面
  3. 纯POJO切面
  4. 注入式AspectJ切面(适合Spring各版本)
19.Spring提供了在Spring上下中配置数据源Bean的多种方式
  1. 通过JDBC驱动程序定义数据源
  2. 通过JNDI查找数据源
  3. 连接池的数据源
20.Spring为ORM框架提供的一些服务
  1. Spring声明式事务的集成支持
  2. 透明的异常处理
  3. 线程安全的,轻量级的模板类
  4. DAO支持类
  5. 资源管理
21.Spring的事务的支持

Spring提供了编码式事务管理和声明式事务管理

22.Spring的注解的说明

采用扫描的方式 配置Spring XML书写方式

  1. @Service用于标注业务层组件
  2. @Controller用于标注控制层组件
  3. @Component泛指组件,用于不明确的类
  4. @Repository用户标注数据库访问组件
  5. @PostConstruct创建对象时执行的方法
  6. @PreDestroy对象摧毁时执行的方法
  7. @Autowired直接访问私有属性,直接给私有属性输入值
  8. @Resource根据类型注入
23.Spring的优点
  1. Spring是分层的架构,你可以选择使用你需要的层而不用管不需要的部分
  2. Spring是pojo。pojo编程使得可持续构建和可测试能力提高
  3. 依赖注入和IoC使得JDBC操作简单化
  4. Spring是开源免费的
  5. Spring使得对象管理几种化和简单化
24.AOP的作用

1.AOP面向切面编程,在不改变类的代码的情况下,对类的方法进行功能的增强

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/531600.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号