Spring 面试中给你的挖坑

Spring面试题 面试官给你挖的坑:

Spring是什么?
Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置

上一章说了IOC和DI 的注入和底层原理

Spring的AOP

AOP称为面向切面,作为面向对象的一种补充 用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”,减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理

说到权限认证

就不得不说Spring Security ,一个能够为基于Spring的企业应用系统提供声明式的安全訪问控制解决方式的安全框架(简单说是对访问权限进行控制嘛),应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分 相比较的Shiro 都可以完成认证,授权,加密。
Spring Security作为Spring全家桶 对Spring的框架可以无缝集成,使用Spring作为基础,配合Security做权限更加方便。
Shiro依赖性低,可独立运行,Security更依赖Spring容器

日志框架

JUL:JDK中的日志记录工具,也常称为JDKLog、jdk-logging。
log4j1:一个具体的日志实现框架。
log4j2:一个具体的日志实现框架,是LOG4J1的下一个版本。
LogBack:一个具体的日志实现框架,但其性能更好。
jck:一个日志门面,提供统一的日志记录接口,也常称为commons-logging。
slf4j:一个日志门面,与JCL一样提供统一的日志记录接口,可以方便地切换看具体的实现框架。
jul、log4j1、log4j2、logback是日志实现框架,而jck、slf4j是日志实现门面
起码了解3种以上 你面试中可以做到有话可说

log4j

必懂Log4J 是 Apache 的一个日志开源框架,有多个分级(DEBUG/INFO/WARN/ERROR)记录级别,可以很好地将不同日志级别的日志分开记录,极大地方便了日志的查看
配置log4j的配置文件, 其他框架都是xml做配置文件,log4
j可以是用properties作为配置文件 在代码根目录下面新建***log4j.properties***

 <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.0.2</version>
        </dependency>
#日志输出的地址: 可以任意配置, logs/存储在当前项目中   D:/logs
log4j.log.dir=logs/ 
#日志的等级:  
#log4j.log.level=ALL,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF
log4j.log.level=DEBUG
#log4j.log.target=CONSOLE,FILE,DATABASE,EMAIL,SOCKET
log4j.log.target=CONSOLE,FILE
log4j.log.encoding=UTF-8
log4j.log.layout=org.apache.log4j.PatternLayout
log4j.log.layout.pattern=[%d %r] [%-5p] [%t] [%l] [%m]%n

日志等等级: 指的是我们定义日志的级别, DEBUG是最详细的, INFO表示提示信息, WARN:表示警告信息, ERROR:记录错误信息, 这里这几个等级知识一个对应关系,在我们使用的时候,可以根据日志的重要级别,采用不同的级别记录,这样我们的日志就可以分类管理,
比如info值打印正常的信息
debug打印调试的信息
warn打印异常信息
还需了解 日志规划 方式保存

Spring事务

事务的特性: 原子性 ,一致性,隔离性,持久性
Spring事务的配置方式:编程式事务管理使用TransactionTemplate,声明式事务管理 建立在AOP之上
事务的隔离级别
1.脏读,脏读发生在一个事务读取了被另一个事务改写但尚未提交的数据时。如果这些改变在稍后被回滚了,那么第一个事务读取的数据就会是无效的。
2.不可重复读
不可重复读发生在一个事务执行相同的查询两次或两次以上,但每次查询结果都不相同时。这通常是由于另一个并发事务在两次查询之间更新了数据。
不可重复读重点在修改。
3.幻读
幻读和不可重复读相似。当一个事务(T1)读取几行记录后,另一个并发事务(T2)插入了一些记录时,幻读就发生了。在后来的查询中,第一个事务(T1)就会发现一些原来没有的额外记录。
事务超时
为了使一个应用程序很好地执行,它的事务不能运行太长时间。因此,声明式事务的下一个特性就是它的超时。
假设事务的运行时间变得格外的长,由于事务可能涉及对数据库的锁定,所以长时间运行的事务会不必要地占用数据库资源。这时就可以声明一个事务在特定秒数后自动回滚,不必等它自己结束。由于超时时钟在一个事务启动的时候开始的,因此,只有对于那些具有可能启动一个新事务的传播行为)的方法来说,声明事务超时才有意义。

回滚规则
在默认设置下,事务只在出现运行时异常时回滚,而在出现受检查异常时不回滚(这一行为和EJB中的回滚行为是一致的)。
不过,可以声明在出现特定受检查异常时像运行时异常一样回滚。同样,也可以声明一个事务在出现特定的异常时不回滚,即使特定的异常是运行时异常。

AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表

(1)AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。

(2)Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
JDK动态代理和CGLIB动态代理必懂
JDK动态代理只提供接口的代理,不支持类的代理
如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。,是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的

Spring 的作用域

一个有5个作用域
分别为singleton(单例)、prototype(原型)、request、session和global session

Spring框架中的Beans是单例 还是多例 是不是线程安全的

回答:单例 某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话,就需要自行保证线程安全。最简单的解决办法就是将多态bean的作用域由“singleton”变更为“prototype

面试总结:

其实也不必为眼前的不幸而悲伤 回想来到上海的第一次面试 路程4小时面试20分钟 有多绝望不言 如果有面试不乐意的小伙伴们 大可相信自己 每次一次面试都是对自己的一个提升

总结一哈最进的学习安排吧 :

进一步了解 Spring底层 跟Springboot 实际场景 应用RabbitMQ 实际场景 进步了解
比你优秀的人都来的会比你早,加班还比你晚 一起加油吧 少年
@1538063309
yur

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值