Spring简答题(一)

1、 Spring 事务实现方式

(1)编程式事务方式

​ 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。

(2)声明式事务方式

​ 声明式事务管理又有两种实现方式:基于xml配置文件的方式;另一个实在业务方法上进行@Transaction注解,将事务规则应用到业务逻辑中

 

2、注解原理是什么

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

 

3、 Spring由哪些模块组成?

  Spring 总共大约有 20 个模块, 由 1300 多个不同的文件构成。 而这些组件被 分别整合在核心容器(Core Container) 、AOP(Aspect Oriented Programming)和设备支持(Instrmentation) 、数据访问与集成(Data Access/Integeration) 、 Web、 消息(Messaging) 、 Test等 6 个模块中。 以下是 Spring 5 的模块结构图:

spring core:提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)功能。

spring beans:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管 理对象称为Bean。

spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框 架式的对象访问方法。

spring jdbc:提供了一个JDBC的抽象层,消除了烦琐的JDBC编码和数据库厂 商特有的错误代码解析, 用于简化JDBC。

spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。

spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。

spring test:主要为测试提供支持的,支持使用JUnit或TestNG对Spring组件进 行单元测试和集成测试。

 

4、spring 的事务隔离

spring 有五大隔离级别,默认值为 ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致:

(1)ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么;

(2)ISOLATION_READ_UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读);

(3)ISOLATION_READ_COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读),SQL server 的默认级别;

(4)ISOLATION_REPEATABLE_READ:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级别;

(5)ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。

注:(1)脏读 :表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。

  (2)不可重复读 :是指在一个事务内,多次读同一数据。

  (3)幻读 :指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。

 

5、 spring JDBC API 中存在哪些类?

(1)JdbcTemplate

(2)SimpleJdbcTemplate

(3)NamedParameterJdbcTemplate

(4)SimpleJdbcInsert

(5)SimpleJdbcCall

 

6、Spring框架中bean的生命周期

bean在Spring容器中从创建到销毁经历了若干阶段,每一阶段都可以针对 Spring如何管理bean进行个性化定制。

上图进行详细描述:

  1. Spring对bean进行实例化;
  2. Spring将值和bean的引用注入到bean对应的属性中;
  3. 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法;
  4. 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
  5. 如果bean实现了ApplicationContextAware接口,Spring将调用 setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;
  6. 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization()方法;
  7. 如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似地,如果bean使用initmethod声明了初始化方法,该方法也会被调用;
  8. 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法;此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
  9. 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。

7、spring 中有多少种 IOC 容器?

1、BeanFactory:BeanFactory 就像一个包含 bean 集合的工厂类。它会在客户端要求时实例化 bean。
 
2、ApplicationContext:ApplicationContext 接口扩展了 BeanFactory 接口。它在 BeanFactory 基础上提供了一些额外的功能。

 

8、BeanFactory 和 ApplicationContext的区分 

 

9、Spring bean 支持 5 种 scope

1、Singleton : 每个 Spring IoC 容器仅有一个单实例。
2、Prototype : 每次请求都会产生一个新的实例。
3、Request : 每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内有效。
4、Session : 每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效。
5、Global-session : 类似于标准的 HTTP Session 作用域,不过它仅仅在基于portlet 的 web 应用中才有意义。Portlet 规范定义了全局 Session 的概念,它被所有构成某个 portlet web 应用的各种不同的 portlet 所共享。在 global session 作用域中定义的 bean 被限定于全局 portlet Session 的生命周期范围内。如果你在 web 中使用 global session 作用域来标识 bean,那么 web会自动当成 session 类型来使用。

 

10、自动装配有哪些方式?

1、no - 这是默认设置,表示没有自动装配。应使用显式 bean 引用进行装配。

2、byName - 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML文件中由相同名称定义的 bean。

3、byType - 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 bean 名称匹配,则匹配并装配属性。

4、构造函数- 它通过调用类的构造函数来注入依赖项。它有大量的参数。

5、autodetect - 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自动装配。 

 

11、@Component, @Controller, @Repository, @Service 有何区别?

@Component :这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中
 
@Controller :这将一个类标记为 Spring Web MVC 控制器。标有它的Bean会自动导入到 IoC 容器中。
 
@Service :此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用@Service 而不是 @Component,因为它以更好的方式指定了意图。
 
@Repository :这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。 

 

12、什么是 AOP?

  AOP(Aspect-Oriented Programming), 即 面向切面编程, 它提供了与OOP ( Object-Oriented Programming, 面向对象编程) 不同的抽象软件结构的视角。在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面)。

 

13、什么是 Aspect?

  Aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义.
  Spring AOP 就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的连接点中。
  AOP 的工作重心在于如何将增强编织目标对象的连接点上。
 
     

 

  可以简单地认为, 使用 @Aspect 注解的类就是切面.

 

14、什么是切点(JoinPoint) 

  程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理。在 Spring AOP 中, join point 总是方法的执行点。 

 

15、什么是通知(Advice)?

  特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice。Spring AOP 使用一个 Advice 作为拦截器,在 JoinPoint“周围”维护一系列的拦截器。

 

16、有哪些类型的通知(Advice)? 

  • Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用@Before 注解标记进行配置。
  • After Returning - 这些类型的 Advice 在连接点方法正常执行后执行,并使用@AfterReturning 注解标记进行配置。
  • After Throwing - 这些类型的 Advice 仅在 joinpoint 方法通过抛出异常退出并使用 @AfterThrowing 注解标记配置时执行。
  • After (finally) - 这些类型的 Advice 在连接点方法之后执行,无论方法退出是正常还是异常返回,并使用 @After 注解标记进行配置。
  • Around - 这些类型的 Advice 在连接点之前和之后执行,并使用@Around 注解标记进行配置。 

 

17、AOP 有哪些实现方式? 

  实现 AOP 的技术,主要分为两大类:

  静态代理

    指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;
    • 编译时编织(特殊编译器实现)
    • 类加载时编织(特殊的类加载器实现)。
  动态代理
    在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。
    •  JDK 动态代理
    •  CGLIB

18、如何理解 Spring 中的代理?

  将 Advice 应用于目标对象后创建的对象称为代理。在客户端对象的情况下,目标对象和代理对象是相同的。
Advice + Target Object = Proxy

 

19、什么是编织(Weaving)? 

  为了创建一个 advice 对象而链接一个 aspect 和其它应用类型或对象,称为编织(Weaving)。在 Spring AOP 中,编织在运行时执行。请参考下图:

        

 

 20、有几种不同类型的自动代理? 

(1)BeanNameAutoProxyCreator

(2)DefaultAdvisorAutoProxyCreator

(3)Metadata autoproxying

 

 

 

 

 

 

posted @ 2021-10-26 20:09  jet-software  阅读(169)  评论(0编辑  收藏  举报