博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring框架整理
阅读量:2070 次
发布时间:2019-04-29

本文共 8827 字,大约阅读时间需要 29 分钟。

目录

1.说一下 IOC 和 AOP?

依赖注入的三种方式:

(1)接口注入
(2)Construct 注入
(3)Setter 注入
控制反转(IoC)与依赖注入(DI)是同一个概念,引入 IOC 的目的:(1)脱开、降低类之间的耦合;(2)倡导面向接口编程、实施依赖倒换原则; (3)提高系统可插入、可测试、可修改等特性。
具体做法:
(1)将 bean 之间的依赖关系尽可能地转换为关联关系;
(2)将对具体类的关联尽可能地转换为对 Java interface 的关联,而不是与具体的服务对象相关联;
(3)Bean 实例具体关联相关 Java interface 的哪个实现类的实例,在配置信息的元数据中描述;
(4)由 IoC 组件(或称容器)根据配置信息,实例化具体 bean 类、将 bean 之间的依赖关系注入进来。
AOP(Aspect Oriented Programming),即面向切面编程,可以说是 OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP 引入封装、继承、多态等概念来建立一种对 象层次结构,用于模拟公共行为的一个集合。不过 OOP 允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此, 这种散布在各处的无关的代码被称为横切(cross cutting),在 OOP 设计中,它导致了大量代 码的重复,而不利于各个模块的重用。 AOP 技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。 使用"横切"技术,AOP 把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

2.Spring 里面的注解autowired 和 resource 区别?

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

2、不同点 (1)@Autowired @Autowired 为 Spring 提供的注解,需要导入包 org.springframework.beans.factory.annotation.Autowired;只按照 byType 注入。
@Autowired 注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存 在,如果允许 null 值,可以设置它的 required 属性为 false。如果我们想使用按照名称(byName) 来装配,可以结合@Qualifier 注解一起使用。 (2)@Resource @Resource 默认按照 ByName 自动注入,由 J2EE 提供,需要导入包 javax.annotation.Resource。@Resource 有两个重要的属性:name 和 type,而 Spring 将 @Resource 注解的 name 属性解析为 bean 的名字,而 type 属性则解析为 bean 的类型。所以,如 果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入 策略。如果既不制定 name 也不制定 type 属性,这时将通过反射机制使用 byName 自动注入策略。

3.依赖注入的方式有几种,哪几种?

1、接口注入2、构造器注入 3、Set 注入

4. springIOC 原理?自己实现 IOC 要怎么做,哪些步骤?

①IoC(Inversion of Control,控制倒转)。这是 spring 的核心,贯穿始终。所谓 IoC, 对于 spring 框架来说,就是由 spring 来负责控制对象的生命周期和对象间的关系。 IoC 的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通 过 DI(Dependency Injection,依赖注入)来实现的。比如对象 A 需要操作数据库,以前我们总是要在 A 中自己编写代码来获得一个 Connection 对象,有了 spring 我们就只需要告诉 spring,A 中需要一个 Connection,至于这个 Connection 怎么构造,何时构造,A 不需要知道。 在系统运行时,spring 会在适当的时候制造一个 Connection,然后像打针一样,注射到 A 当中, 这样就完成了对各个对象之间关系的控制。A 需要依赖 Connection 才能正常运行,而这个 Connection 是由 spring 注入到 A 中的,依赖注入的名字就这么来的。那么 DI 是如何实现的 呢? Java 1.3 之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring 就是通过反射来实现注入的。

②实现 IOC 的步骤:定义用来描述 bean 的配置的 Java 类解析 bean 的配置,將 bean 的配置信息转换为上面的 BeanDefinition 对象保存在内存中, spring 中采用 HashMap 进行对象存储,其中会用到一些 xml 解析技术遍历存放 BeanDefinition 的 HashMap 对象,逐条取出 BeanDefinition 对象,获取 bean 的配置信息,利用 Java 的反射机制实例化对象,將实例化后的对象保存在另外一个 Map 中即可。

5.Spring 中 BeanFactory 和 ApplicationContext 的区别?

概念:

BeanFactory: BeanFactory 是 spring 中比较原始,比较古老的 Factory。因为比较古老,所以 BeanFactory 无法支持 spring 插件,例如:AOP、Web 应用等功能。
ApplicationContext :ApplicationContext 是 BeanFactory 的子类,因为古老的 BeanFactory 无法满足不断更新的 spring 的需求,于是 ApplicationContext 就基本上代替了 BeanFactory 的工作,以一种更面向框架的工作方式以及对上下文进行分层和实现继承,并在这个基础上对功能进行扩展:
<1>MessageSource, 提供国际化的消息访问
<2>资源访问(如 URL 和文件)
<3>事件传递
<4>Bean 的自动装配
<5>各种不同应用层的 Context 实现
区别:
<1>如果使用 ApplicationContext,如果配置的 bean 是 singleton,那么不管你有没有或想不想用它,它都会被实例化。好处是可以预先加载,坏处是浪费内存。
<2>BeanFactory,当使用 BeanFactory 实例化对象时,配置的 bean 不会马上被实例化,而是等到你使用该 bean 的时候(getBean)才会被实例化。好处是节约内存,坏处是速度比较慢。多用 于移动设备的开发。
<3>没有特殊要求的情况下,应该使用 ApplicationContext 完成。因为 BeanFactory 能完成的事 情,ApplicationContext 都能完成,并且提供了更多接近现在开发的功能。

6.什么是 IoC 和 DI?DI 是如何实现的?

IoC 叫控制反转,是 Inversion of Control 的缩写,DI(Dependency Injection)叫依赖注入,是对 IoC 更简单的诠释。控制反转是把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的"控制反转"就是对组件对象控制权的转移, 从程序代码本身转移到了外部容器,由容器来创建对象并管理对象之间的依赖关系。

依赖注入的基本原则是应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由容器负责,查找资源的逻辑应该从应用组件的代码中抽取出来,交给容器来完成。DI 是对 IoC 更准确的描述,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。 一个类 A 需要用到接口 B 中的方法,那么就需要为类 A 和接口 B 建立关联或依赖关系,最原始的方法是在类 A 中创建一个接口 B 的实现类 C 的实例,但这种方法需要开发人员自行维护二者的依赖关系,也就是说当依赖关系发生变动的时候需要修改代码并重新构建整个系统。如果通过一个容器来管理这些对象以及对象的依赖关系,则只需要在类 A 中定义好用于关联接口 B 的方法 (构造器或 setter 方法),将类 A 和接口 B 的实现类 C 放入容器中,通过对容器的配置来实现二者的关联。依赖注入可以通过 setter 方法注入(设值注入)、构造器注入和接口注入三种方式来实现,Spring 支持 setter 注入和构造器注入,通常使用构造器注入来注入必须的依赖关系,对于可选的依赖关系,则 setter 注入是更好的选择,setter 注入需要类提供无参构造器或者无参的静态工厂方法来创建对象。

7. Spring 中 Bean 的作用域有哪些?

在 Spring 的早期版本中,仅有两个作用域:singletonprototype,前者表示 Bean 以单例的方式存在;后者表示每次从容器中调用 Bean 时,都会返回一个新的实例,prototype 通常翻译为原型。 设计模式中的创建型模式中也有一个原型模式,原型模式也是一个常用的模式,例如做一个室内设计软件,所有的素材都在工具箱中,而每次从工具箱中取出的都是素材对象的一个原型, 可以通过对象克隆来实现原型模式。Spring 2.x 中针对 WebApplicationContext 新增了 3 个作 用域,分别是:request(每次 HTTP 请求都会创建一个新的 Bean)、session(同一个 HttpSession 共享同一个 Bean,不同的 HttpSession 使用不同的 Bean)和 globalSession(同一个全局 Session 共享一个 Bean)。 单例模式和原型模式都是重要的设计模式。一般情况下,无状态或状态不可变的类适合使用单例模式。在传统开发中,由于 DAO 持有 Connection 这个非线程安全对象因而没有使用单例模式;但在 Spring 环境下,所有 DAO 类都可以采用单例模式,因为 Spring 利用 AOP 和 Java API 中的 ThreadLocal 对非线程安全的对象进行了特殊处理。

8. 谈谈 Spring 中自动装配的方式有哪些?

  • no:不进行自动装配,手动设置 Bean 的依赖关系。
  • byName:根据 Bean 的名字进行自动装配。
  • byType:根据 Bean 的类型进行自动装配。
  • constructor:类似于 byType,不过是应用于构造器的参数,如果正好有一个 Bean 与构造器的参数类型相同则可以自动装配,否则会导致错误。
  • autodetect:如果有默认的构造器,则通过 constructor 的方式进行自动装配,否则使用 byType 的方式进行自动装配。
    自动装配没有自定义装配方式那么精确,而且不能自动装配简单属性(基本类型、字符串等), 在使用时应注意。

9.aop 的应用场景?

Authentication 权限 ,Caching 缓存 ,Context passing 内容传递 ,Error handling 错 误处理 ,Lazy loading 懒加载 ,Debugging 调试 ,logging, tracing, profiling and monitoring 记录跟踪优化校准,Performance optimization 性能优化 ,Persistence 持久化 ,Resource pooling 资源池 ,Synchronization 同步,Transactions 事务。

10. AOP 的原理是什么?

AOP(Aspect Orient Programming),指面向切面编程,作为面向对象的一种补充, 用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP 实现的关键在于 AOP 框架自动创建的 AOP 代理,AOP 代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以 Spring AOP 为代表。通常使用 AspectJ 的编译时增强实现 AOP, AspectJ 是静态代理的增强,所谓的静态代理就是 AOP 框架会在编译阶段生成 AOP 代理类,因此也称为编译时增强。 Spring AOP 中的动态代理主要有两种方式,JDK 动态代理CGLIB 动态代理。JDK 动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK 动态代理的核心是 InvocationHandler 接口和 Proxy 类。 如果目标类没有实现接口,那么 Spring AOP 会选择使用 CGLIB 来动态代理目标类。CGLIB (Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类, 注意,CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为 final,那么它是无法使用 CGLIB 做动态代理的。

11 你如何理解 AOP 中的连接点(JoinPoint)、切点(PointCut)、增强(Advice)、 引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?

a. 连接点(Joinpoint):程序执行的某个特定位置(如:某个方法调用前、调用后,方法抛出异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。Spring 仅支持方法的连接点。

b. 切点(Pointcut):如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。Spring AOP 的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。
c. 增强(Advice):增强是织入到目标类连接点上的一段程序代码。Spring 提供的增强接口都是带方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice 等。
d. 引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使 一个业务类原本没有实现某个接口,通过引介功能,可以动态的未该业务类添加接口的实现逻辑, 让业务类成为这个接口的实现类。
e. 织入(Weaving):织入是将增强添加到目标类具体连接点上的过程,AOP 有三种织入方式: ①编译期织入:需要特殊的 Java 编译期(例如 AspectJ 的 ajc);②装载期织入:要求使用特 殊的类加载器,在装载类的时候对类进行增强;③运行时织入:在运行时为目标类生成代理实现 增强。Spring 采用了动态代理的方式实现了运行时织入,而 AspectJ 采用了编译期织入和装载 期织入的方式。 f. 切面(Aspect):切面是由切点和增强(引介)组成的,它包括了对横切关注功能的定义, 也包括了对连接点的定义。

12.Spring 支持的事务管理类型有哪些?你在项目中使用哪种方式?

Spring 支持编程式事务管理声明式事务管理。许多 Spring 框架的用户选择声明式事务管理,因为这种方式和应用程序的关联较少,因此更加符合轻量级容器的概念。声明式事务管理要优于编程式事务管理,尽管在灵活性方面它弱于编程式事务管理,因为编程式事务允许你通过代码控制业务。 事务分为全局事务局部事务。全局事务由应用服务器管理,需要底层服务器 JTA 支持(如 WebLogic、WildFly 等)。局部事务和底层采用的持久化方案有关,例如使用 JDBC 进行持久化时,需要使用 Connetion 对象来操作事务;而采用 Hibernate 进行持久化时,需要使用 Session 对象来操作事务。 这些事务的父接口都是 PlatformTransactionManager。Spring 的事务管理机制是一种典型的策略模式,PlatformTransactionManager 代表事务管理接口,该接口定义了三个方法,该接口并不知道底层如何管理事务,但是它的实现类必须提供 getTransaction()方法(开启事务)、 commit()方法(提交事务)、rollback()方法(回滚事务)的多态实现,这样就可以用不同的实现类代表不同的事务管理策略。使用 JTA 全局事务策略时,需要底层应用服务器支持,而不同的 应用服务器所提供的 JTA 全局事务可能存在细节上的差异,因此实际配置全局事务管理器是可能 需要使用 JtaTransactionManager 的子类,如:WebLogicJtaTransactionManager(Oracle 的 WebLogic 服务器提供)、UowJtaTransactionManager(IBM 的 WebSphere 服务器提供)等。

13.介绍一下 spring?

Spring 是一个轻量级框架,可以一站式构建你的企业级应用。 Spring 的模块大概分为 6 个。分别是:

1、Core Container(Spring 的核心)【重要】
2、AOP(面向切面编程)【重要】
3、Messaging(消息发送的支持)
4、Data Access/Integration(数据访问和集成)
5、Web(主要是 SpringWeb 内容,包括 MVC)【重要】
6、Test(Spring 测试支持,包含 JUint 等测试单元的支持) 7、Instrumentation(设备支持,比如 Tomcat 的支持)

14. spring 框架的优点?

Spring 是一个轻量级的 DI 和 AOP 容器框架,在项目的中的使用越来越广泛,它的优点主要有以下几点:

1.非侵入式框架
2针对接口编程,解耦合
3.面向切面编程
4.方便集成各种优秀的框架
5.依赖注入
6.容器
7.主要作用就是为代码解耦

15.选择使用 Spring 框架的原因(Spring 框架为企业级开发带来的好处有哪些)?

  • 非侵入式:支持基于 POJO 的编程模式,不强制性的要求实现 Spring 框架中的接口或继承 Spring 框架中的类。
  • IoC 容器:IoC 容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码,因为代码的修改可能意味着项目的重新构建和完整的回归测试。有了 IoC 容器,程序员再也不需要自己编写工厂、单例,这一点特别符合 Spring 的精神"不要重复的发明轮子"。
  • AOP(面向切面编程):将所有的横切关注功能封装到切面(aspect)中,通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现了业务逻辑和系统服务之间的分离。另一方面, 有了 AOP 程序员可以省去很多自己写代理类的工作。
  • MVC:Spring 的 MVC 框架为 Web 表示层提供了更好的解决方案。
  • 事务管理:Spring 以宽广的胸怀接纳多种持久层技术,并且为其提供了声明式的事务管理, 在不需要任何一行代码的情况下就能够完成事务管理。
  • 其他:选择 Spring 框架的原因还远不止于此,Spring 为 Java 企业级开发提供了一站式选择, 你可以在需要的时候使用它的部分和全部,更重要的是,甚至可以在感觉不到 Spring 存在的情 况下,在你的项目中使用 Spring 提供的各种优秀的功能。

16.持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些?

所谓"持久"就是将数据保存到可掉电式存储设备中以便今后使用,简单的说,就是将内存中 的数据保存到关系型数据库、文件系统、消息队列等提供持久化支持的设备中。持久层就是系统 中专注于实现数据持久化的相对独立的层面。

持久层设计的目标包括:

  • 数据存储逻辑的分离,提供抽象化的数据访问接口。
  • 数据访问底层实现的分离,可以在不修改代码的情况下切换底层实现。
  • 资源管理和调度的分离,在数据访问层实现统一的资源调度(如缓存机制)。
  • 数据抽象,提供更面向对象的数据操作。
    持久层框架有:
  • Hibernate
  • MyBatis
  • TopLink
  • Guzz
  • j00Q
  • Spring Data
  • ActiveJDBC

转载地址:http://dmsmf.baihongyu.com/

你可能感兴趣的文章
Leetcode C++《热题 Hot 100-18》538.把二叉搜索树转换为累加树
查看>>
Leetcode C++《热题 Hot 100-21》581.最短无序连续子数组
查看>>
Leetcode C++《热题 Hot 100-22》2.两数相加
查看>>
Leetcode C++《热题 Hot 100-23》3.无重复字符的最长子串
查看>>
Leetcode C++《热题 Hot 100-24》5.最长回文子串
查看>>
Leetcode C++《热题 Hot 100-28》19.删除链表的倒数第N个节点
查看>>
Leetcode C++《热题 Hot 100-29》22.括号生成
查看>>
阿里云《云原生》公开课笔记 第二章 容器基本概念
查看>>
阿里云《云原生》公开课笔记 第三章 kubernetes核心概念
查看>>
阿里云《云原生》公开课笔记 第四章 理解Pod和容器设计模式
查看>>
阿里云《云原生》公开课笔记 第五章 应用编排与管理
查看>>
阿里云《云原生》公开课笔记 第六章 应用编排与管理:Deployment
查看>>
阿里云《云原生》公开课笔记 第七章 应用编排与管理:Job和DaemonSet
查看>>
阿里云《云原生》公开课笔记 第八章 应用配置管理
查看>>
阿里云《云原生》公开课笔记 第九章 应用存储和持久化数据卷:核心知识
查看>>
linux系统 阿里云源
查看>>
国内外helm源记录
查看>>
牛客网题目1:最大数
查看>>
散落人间知识点记录one
查看>>
Leetcode C++ 随手刷 547.朋友圈
查看>>