• 框架学习1:Spring常见问题


    1. 什么是Spring框架

    1. 定义:一款开源的轻量级 Java 开发框架,我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合。
    2. 用途:提高开发人员的开发效率以及系统的可维护性;不重新造轮子,开箱即用!
    3. 核心功能:IoCAOP
      (1):可以很方便地对数据库进行访问
      (2):可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等等)
      (3):对单元测试支持比较好
      (4):支持 RESTful Java 应用程序的开发。

    2. 列举一些重要的 Spring 模块?

    2.1. Data Access/Integration(数据访问和整合)

    1)spring-jdbc:提供对数据库访问的抽象JDBC(屏蔽数据库的影响)
    2)spring-orm :ORM框架支持
    3)spring-oxm :OXM 框架支持
    4)spring-jms:Java 消息服务
    5)spring-transaction:提供事务支持

    2.2. Web(网页)

    1)spring-websocket:提供对websocket的支持,可以让客户端和服务端进行双向通信。
    2)spring-servlet:为springmvc的实现做好铺垫
    2)spring-web:对web功能的实现提供最基础的支持
    3)spring-webflux:提供对webflux的支持,新的响应式框架

    2.3. Spring AOP+Spring Aspects

    1. Spring AOP:提供面向切面编程的实现
    2. Spring Aspects:与为与Aspects的继承提供支持

    2.4 Spring Core:核心模块

    1. Spring其他的所有功能都需要依赖该类库,主要提供loc依赖注入功能的支持。

    2.5 Spring Test

    1. spring提倡测试驱动开发。
    2. 有了控制反转的帮助,单元测试和集合测试变得很简单。
    3. 支持的测试模块:JUnit(单元测试框架);TestNG;Mockito等

    3. Spring IOC & AOP

    3.1 谈谈自己对于 Spring IoC 的了解?

    1. IoC:控制反转,是一种设计思想,不是一个具体的技术实现。
      (1):控制:对象创建(实例化和管理)的权力。
      (2):控制权交给外部环境(Spring框架和loc容器)
    2. 核心思想:将原本在程序中手动创建对象的控制权,交给Spring框架来管理
      (1):对象之间的耦合度或者说依赖程度降低;
      (2):资源变的容易管理;比如你用 Spring 容器提供的话很容易就可以实现一个单例。
    3. 区别展示:AOP和一般的依赖新建

    3.2 谈谈自己对于 AOP 的了解

    1. AOP(Aspect-Oriented Programming:面向切面编程):能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来
      (1):便于减少系统的重复代码,
      (2):降低模块间的耦合度,
      (3):并有利于未来的可拓展性和可维护性。
    2. 解决的问题
      (1):通过上面的分析可以发现,AOP 主要用来解决:在不改变原有业务逻辑的情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。
    3. AOP 为什么叫面向切面编程
      (1):切 :指的是横切逻辑,原有业务逻辑代码不动,只能操作横切逻辑代码,所以面向横切逻辑
      (2):面 :横切逻辑代码往往要影响的是很多个方法,每个方法如同一个点,多个点构成一个面。这里有一个面的概念.

    3.3 Spring AOP 和 AspectJ AOP 有什么区别?

    1. Spring AOP :属于运行时增强,基于代理(Proxying),
    2. AspectJ 是编译时增强:基于字节码操作(Bytecode Manipulation)

    4. Spring bean

    4.1 Bean是什么

    1. bean 代指的就是那些被 IoC 容器所管理的对象。
    2. 我们需要告诉 IoC 容器帮助我们管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是 XML 文件注解或者 Java 配置类

    4.3. bean 的作用域有哪些?

    (1):singleton :唯一bean实例,Spring中的bean默认都是单例的,对单例设计模式的应用。
    (2):prototype:每次请求都会创建一个新的bean实例。
    (3):request:每一次http请求都会生成一个bean,仅在当前的Http session内有效
    (4):session:

    4.4. bean的作用域配置方式有哪几种?

    4.5. 单例 bean 的线程安全问题了解吗?

    1. 在项目中很少使用多线程,但是是存在线程安全问题的
    2. 主要原因是:多个线程操作同一个对象的时候是存在资源竞争的。
    3. 解决方法:
      (1):在bean中尽量避免定义可变的成员变量
      (2):在类中定义一个ThreadLocal成员变量,将需要使用的可变成员变量保存在ThreadLocal中(每一个线程保存一份,一种解决思路)

    4.6. @Component 和 @Bean 的区别是什么?

    1. @Component
      1):注解作用于类
      2):通过类路径扫描来自动侦测以及自动装配到 Spring 容器中
    2. @Bean
      1):注解作用于方法
      2):@Bean告诉了 Spring 这是某个类的实例,当我需要用它的时候还给我。
      3):注解的自定义性更强,例如在引用第三方库中的类需要装配到Spring容器中,只能通过@Bean实现。

    4.7. 将一个类声明为 bean 的注解有哪些?

    1. 一般使用@Autowired注解自动装配bean。要想把类标识为可用于@Autowired注解自动装配的bean的类,需要下面几种注释(对于类进行的注解,分为三层):
      1):@Component:通用的注解。如果忘记了时放在那一层,用这个注解。
      2):@Repository:对应于持久层即Dao层,主要用于数据库相关的操作(啥也没有)
      3):@Service : 对应于服务层,主要涉及进一步的复杂逻辑,需要使用到Dao层。(@Autowired Dao层的类)
      4):@Controller:控制层,即调用Service层的信息返回数据给前端页面。(@Autowired Service层的类)

    4.8. Bean的生命周期?

    5. Spring MVC

    5.1 Spring MVC的大体认识?

    1. MVC是模型,视图和控制器的简写。MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。
    2. 核心思想:通过将业务逻辑,数据处理和显示分离
      MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。

    5.2 SpringMVC 工作原理了解吗?

    1. 自己着重看一看。

    6. Spring 框架中用到了哪些设计模式?

    1. 工厂设计模式:使用工厂模式通过BeanFactory,Applicationcontext创建bean对象。
    2. 代理设计模块:Spring AOP功能的实现。
    3. 单例设计模式:Spring中的Bean默认都是单例的。
    4. 模板方法模式:Spring中的jdbcTemplate,hibernateTemplate等以 Template结尾的对数据库操作的类,他们就使用了模板模式。
    5. 观察者模式:Spring事件驱动模型就是观察值模式很经典的一个应用。
    6. 适配器模式 :Spring AOP的增强或通知(Advice)使用到了适配器模式Spring MVC中也是用到了适配器模式适配Controller

    7. Spring 事务

    7.1 Spring 管理事务的方式有几种?

    1. 编程式事务: 在代码中硬编码(不推荐使用) :
    2. 声明式事务 : 在 XML 配置文件中配置或者直接基于注解(推荐使用) ;通过AOP实现。

    7.2 Spring 事务中哪几种事务传播行为?

    事务传播行为是为了解决业务层方法之间互相调用的事务问题。

    1. TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
    2. TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
    3. TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价
    4. TransactionDefinition.PROPAGATION_MANDATORY :如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(用的很少)

    7.3 Spring 事务中的隔离级别有哪几种?

    1. TransactionDefinition.ISOLATION_DEFAULT :使用后端数据库默认的隔离级别,MySQL 默认采用的 REPEATABLE_READ 隔离级别 Oracle 默认采用的 READ_COMMITTED 隔离级别.
    2. TransactionDefinition.ISOLATION_READ_UNCOMMITTED :未提交, 最低的隔离级别,使用这个隔离级别很少,因为它允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
    3. TransactionDefinition.ISOLATION_READ_COMMITTED : 已经提交, 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
    4. TransactionDefinition.ISOLATION_REPEATABLE_READ : 可重复读, 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
    5. TransactionDefinition.ISOLATION_SERIALIZABLE : 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

    7.4 @Transactional(rollbackFor = Exception.class)注解了解吗?

    1. 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。

    7.4.1 @Transactional

    1. 当 @Transactional 注解作用于类上时,该类的所有 public 方法将都具有该类型的事务属性
    2. 类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。

    7.4.2 @Transactional 的rollbackFor属性

    1. @Transactional 注解中如果不配置rollbackFor属性,只会在遇到RuntimeException的时候才会回滚。
    2. rollbackFor=Exception.class,可以让事务在遇到非运行时异常时也回滚

    8. JPA

    8.1 使用 JPA 在数据库中非持久化一个字段?

    1. 这个字段不被持久化,也就是不被数据库存储怎么办
    //1)使用注解:比较常用
    @Transient
    String transient4; // not persistent because of @Transient
    
    • 1
    • 2
    • 3

    参考文献

    https://javaguide.cn/
    https://blog.csdn.net/qq_42405666/article/details/107671099

  • 相关阅读:
    HarmonyOS har制作与引用
    游标简单解释
    冒泡排序
    MyEclipse控制台console不停的自动跳动控制台界面,解决方案
    求00000000000000000
    css解决uniapp使用image标签图片无法撑满全屏问题
    【最优潮流】基于人工鱼群算法的最优潮流计算(Matlab代码实现)
    流量狂飙!暴涨2000万播放成B站创作标杆
    挑战100天 AI In LeetCode Day04(热题+面试经典150题)
    1.3 矩阵
  • 原文地址:https://blog.csdn.net/qq_42974034/article/details/124885093