【框架】Spring问题汇总 (on IDEA MAC)

本文汇总了Spring框架在面试、日常操作、报错等多个方面的问题,包括Bean的作用域、事务传播属性、数据库事务隔离级别、线程安全、IDEA配置、热部署、序列化、JAR操作、Spring MVC及Spring Boot的常见错误等,并提供了详细的解决办法和参考资料。
摘要由CSDN通过智能技术生成

相关问题可能也提及在【IDEA 介绍 + 配置 + 插件汇总】文中:
https://blog.csdn.net/weixin_42915286/article/details/83069223

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)

面试

——————————————————————————
Bean

<bean id="name" class="com.xxxx.xxx.xxx" scope="singleton">
    <property name="id" value=""></property>
    ...

提问:Spring Bean的作用域之间有什么区别?
Spring中,可以在<bean>元素的scope属性中设置bean的作用域,以决定这个bean是单实例还是多实例;
默认情况下,Spring只为每个在IoC容器里生命的bean创建唯一一个实例,整个IoC容器范围内都能共享该实例:所有后续getBean()调用和bean饮用都将返回这个唯一的bean实例。该作用域被称为singleton,它是所有bean的默认作用域;

  • singleton:在SpringIoC容器中仅存在一个Bean实例
  • prototype:每次调用getBean()时都会返回一个新的实例;
  • request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境;
  • session:同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean,该作用域仅适用于WebApplicationContext环境;

https://www.bilibili.com/video/av37602130/?p=8
提问:简单介绍Spring支持的常用数据库事务传播属性和事物隔离级别?

事物的传播行为:
事物的传播行为,一个方法运行在了一个开启了的事物的方法中时,当前方法是使用原来的事物还是开启一个新的事物;

事物的属性:

  • 1.propagation:用来设置事物的传播行为;
    事物的传播行为,一个方法运行在了一个开启了的事物的方法中时,当前方法是使用原来的事物还是开启一个新的事物;
    Propagation.REQUIRED:默认值,使用原来的事物;
    Propagation.REQUIRED_NEW:将原来的事物刮起,开启一个新的事物;
  • 2.isolation:用来设置事物的隔离程度;
    Isolation.REPEATABLE_READ:可重复读,MySQL默认的隔离级别;
    Isolation.REPEATABLE_COMITTED:读已提交,Oracle默认的隔离级别,开发时通常使用的隔离级别;

提问:Spring中的Bean是线程安全的吗?
Spring本身未提供Bean线程安全策略;
线程安全要从原型和单例分别说明:
原型Bean:每创建一个新对象,即线程间不存在Bean共享,自然不会有线程安全问题;
单例Bean:若单例Bean是个无状态Bean,就是线程中的操作不会对Bean成员执行查询以外的操作,那么这个单例Bean是线程安全的;
对有状态的Vean,Spring提供的Bean,一般提供了ThreadLocal去解决线程安全问题;
——————————————————————————

——————————————————————————

——————————————————————————

——————————————————————————

——————————————————————————

——————————————————————————


日常操作问题

1.Terminal中结束Spring程序
control+C
——————————————————————————
2.application.properties与application.yml之间的区别?
在线转换:http://www.toyaml.com/index.html
实质上两者是差不多的,区别在于结构。
官方给的很多demo,都是用yml文件配置的;yml文件的好处:天然的树状结构一目了然,

注意点:

  • 1.原有的key,例如spring.jpa.properties.hibernate.dialect,按“.”分割,都变成树状的配置;
  • 2.冒号后面若有值,一定要跟一个空格!!!
  • 3.把原有的application.properties删掉。然后一定要执行一下 maven -X clean install
  • 详细说明在https://blog.csdn.net/weixin_42915286/article/details/83069223 页面搜索 如何新建application.yml文件再替换application.properties?

在这里插入图片描述
区别如下:

application.properties
在这里插入图片描述
application.yml
——————————————————————————
3.热部署HOT SWAPPING:用spring-boot-devtools提供的开发者工具实现

热部署指:每次修改项目不用重新启动项目,Spring自动更新。
(另外还有修改服务器配置、使用springloaded jar包、使用收费插件Jrebel实现热部署,详见https://www.cnblogs.com/jcook/p/6910238.html)

  • 1.在POM里输入devtools依赖包
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-devtools</artifactId>
           <scope>runtime</scope>
           <optional>true</optional>
       </dependency>
  • 2.添加配置文件:配置文件中显示指定,默认值也是true,但是防止其他地方修改了默认值,所以,建议添加这个配置信息。
spring.devtools.restart.enabled=true
spring.devtools.restart.additional-paths=src/main/java

spring.devtools.restart.exclude=WEB-INF/**
  • 3.此方法是基于类加载机制来实现热加载的,因此你修改完成代码后必须重新编译当前代码,才能触发热部署,Eclipse默认就支持了自动编译,而在Intellij IDEA中默认是关闭了自动编译的,要按照如下3、4步设置开启:
    (1).IDEA开启项目自动编译,进入设置,Build,Execut, Deployment -> Compiler 勾选中左侧的Build Project automatically
    在这里插入图片描述
    (2).command + shift + a搜索命令:registry -> 勾选compiler.automake.allow.when.app.running
    在这里插入图片描述
    在这里插入图片描述
    我自己用以上方法操作后可以生效,只是反应速度比较迟缓。

参考博客:
2.https://blog.csdn.net/qq_29648651/article/details/78503853 https://blog.csdn.net/testcs_dn/article/details/78959700
3.https://www.cnblogs.com/jcook/p/6910238.html

——————————————————————————

  • 提问:如何让IDEA可自动生成serialVersionUID

Java 类进行序列化也两个主要目的,分别为:

1.把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2.在网络上传送对象的字节序列。

而某个Java类 implements Serializable后,需要添加参数serialVersionUID的语句;
serialVersionUID是一个非常重要的字段,因 Java 的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。
在进行反序列化时,JVM 会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

一般来说,定义serialVersionUID的方式有两种,分别为:

1.采用默认的1L,具体为private static final long serialVersionUID = 1L;
2.根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,例如private static final long serialVersionUID = XXXL;

这里讲的是如何让IDE生成64位的Long哈希字段;

步骤1:安装插件GenerateSerialVersionUID,成功后重启IDE
在这里插入图片描述
步骤二:Inspections - Serializable class without 'serialVersionUID',设置为Warining
在这里插入图片描述

步骤三:实体类名中一旦implements了Serializable,类名就会报错,提示自动生成serialVersionUID
在这里插入图片描述
步骤四:随机生成serialVersionUID
比如:private static final long serialVersionUID = 3450342483181838030L;

——————————————————————————

  • 提问:如何解压JAR包?压缩成JAR包?

解压缩:
$jar xvf 文件名.jar

创建指定文件名JAR包(若存在同名则会覆盖):
$jar cf 文件名.jar 文件名

创建指定文件名JAR包,且显示打包过程:
$jar cvf 文件名.jar 文件名
https://blog.csdn.net/zilaike/article/details/82147178

报错


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值