1.Spring框架基本理解
关键词:核心思想IOC/AOP、作用(解耦、简化),简单描述框架组成
- Spring是一个企业级、轻量级开源的分层架构
- 核心思想:IOC(控制反转)和AOP(面向切面编程)
- 1.为Java应用程序开发提供组件管理服务;2.用于组件之间的解耦 3.简化第三方JavaEE中间技术的使用
- Spring框架包括:IOC容器、Validation数据校验、AOP面向切面编程、Transaction事务管理、SpringJDBC、Spring MVC框架、以及第三方JavaEE中间技术集成
2.Spring框架有哪些模块组成?
关键词:官方文档描述,由7各模块组成
Spring Framework根据官方文档的描述,主要包括以下常用5各模块
1.Core:核心模块
包括:IOC Container(IOC容器),Events(事件通知机制)、Resources(资源加载机制), iln8(国际化),Validation(数据校验)、Data Binding(数据绑定)、Type Conversion(数据转换),sqEL(Spring表达式),Aop(面向切面编程);
2.Testing:测试模块
包括:Mock Objects(测试模拟对象),TestContext Framework(测试框架),Spring MVC Test(用于测试SpringMVC),WebTestClient(用于测试WebClient、Restful、Webflux等);
3.Data Access:数据访问模块
包括:Transaction(事务管理),DAO Support(Data Access Object DAO 模式封装),JDBC(Spring 对于JDBC的操作封装),O/R Mapping (Spring 对于对象关系映射框架的封装,例如Hibernate等框架)等;
4.Web Servlet:基于Servlet的Web应用开发
包括:Spring MVC(Spring 基于MVC模式设计封装的Web框架),WebSocket(Spring 集成WebSocket,WebSocket是一个服务器与客户端双向通信的技术)等;
5.Integration 企业级系统集成模块(不同系统之间的交互集成)
包括:Remoting(Spring 用于在分布式系统中进行远程服务调用的通讯框架),JMS,(Spring集成各类java消息中间件、java消息服务[Java Message Service],例如ActiveMq等),Java Email(邮件发送),Tasks Scheduling(任务调用);
3.Spring IOC的理解
关键词:IOC名词解释,作用是解耦,使用IOC容器管理项目之间的耦合关系
IOC(控制反转)是Spring框架核心思想之一,作用于解耦。IOC是指将创建Bean的权利交给Spring框架管理。Spring框架通过配置类和注解的方式,创建Bean并管理各个Bean之间的依赖关系,从而形成解耦。
控制:指创建对象(实例化、管理)的权利
反转:控制权交给外部环境来管理(Spring框架、IOC容器)
4.SpringIOC容器理解
关键词:IOC容器作用、存储形式、初始化过程
- IOC通常被理解为IOC Container容器,IOC容器实质就是Map ,键指的是bean的id,值指的是bean对象。IOC对象负责创建和管理Bean对象和Bean的生命周期。通过注解或者配置类,管理bean的每个对象,以及根据bean之间依赖关系,完成bean注入。
- IOC容器是属于spring core 模块,用来创建和管理Bean,默认使用单例方式将bean存储到一个ConcurrentHashMap类型的Map集合。
- IOC容器使用ConcurrentHashMap集合存储了BeanDefinition对象,该对象封装了Spring对一个Bean的所有配置信息,包括:类名,属性,构造方法参数,依赖,是否延迟加载,是否是单例等配置信息;
5.Spring DI的理解
关键词:名词解释
DI(依赖注入),指应用程序在运行时,每一个bean对象都依赖IOC注入当前bean对象所需要的另一个bean对象。
6.什么是spring的bean?
Bean代表IOC容器管理的对象
通过配置文件或注解,告诉IOC容器我们管理那些对象
7.将一个类声明的注解有哪些?
@Component:通用Bean的注解,可标注任意类
@Repository:数据访问层的注解
@Service:业务层注解
@Controller:控制层注解
8.@Component和@Bean的区别是什么?
@Component注解在类上,@Bean注解在方法上
@Component是通过类路径扫描来实现自动扫描并完成装配Bean到SpringIOC容器中
@Bean通过注解方式告诉IOC容器,该方法返回是一个实例bean。
9.@Autowired和@Resource的区别?
@Autowired是Spring提供的,@Resource是jdk提供的
@Autowired默认注入方式是byType(按类型注入)@Resource默认注入是按照ByName(按名称注入)
10.Spring框架中的常见注入方式?
关键词:整体介绍三种注入方式,分别介绍每个注入的细节
Spring IOC有三种注入方式:构造注入、Setter注入、属性注入
构造注入:使用构造方法注入bean
Setter注入:使用Setter方法注入bean
属性注入:使用成员属性注入bean,不推荐。原因:使用私有成员属性变量,依靠反射实现,破坏封装,只能依靠IOC容器实现注入,不严谨
11.Spring中常见的ApplicationContext实现类有哪些?
关键词:分别介绍每种实现类或子接口
- ClassPathXmlApplicationContext:根据项目类路径下配置文件加载bean
- FileSystemApplicationContext:根据当前磁盘下绝对路径下的配置文件加载bean
- AnnotationConfigApplicationContext:根据读取注解加载bean
- WebApplicationContext:web容器下按照配置文件加载bean
12.BeanFactory和ApplicationContext有什么区别?
关键词 :两者之间的关系、区别与不同、Bean的创建加载方法
两者之间的关系:BeanFactory和ApplicationContext是spring的两大核心接口,两者都可做spring容器
两者区别与不同:BeanFactory是Spring最底层的接口,定义IOC最基本功能,包括:定义、加载、实例化、依赖、生命周期等。
Application是BeanFactory的子接口,具备BeanFactory所具有的功能,其次还继承其他框架接口:MessageSource(支持国际化)、资源文件访问、同时可加载多个配置文件、监听器可管理Bean的生命周期。
Bean的创建加载方法:
BeanFactory延迟加载
Application通过容器启动加载
13.Spring框架Bean的作用域
Singleton:只创建一次对象,单例是spring的bean默认作用域
prototype:每次获取bean,spring会创建一次新的bean实例
request:每一次Http请求,spring会创建一次新的bean实例
session:不同Http会话,spring会创建不同的bean实例;
14.Spring框架中的线程安全
- 对singleton作用域bean,只会创建一次新对象,所有线程会共享同一个单例bean,存在资源竞争,因此是存在线程不安全
- 对propotype作用域bean,每次都会创建新对象,不会存在线程共享问题,所以线程安全
如何解决线程不安全:
1.在类中避免定义可变成员变量
2.在类中定义ThreadLocal成员变量,将可变成员变量保存在ThreaadLocal中。
15.bean生命周期
实例化、初始化、操作使用、销毁
Spring容器启动时,会加载xml配置文件获取bean信息,并将bean的信息封装成一个BeanDefition,此刻可以对BeanDefition进行动态处理,也就是bean工厂后处理,BeanFactory分为两个接口,一个是BeanFactoryPostProcess,另一个是BeanFactoryRegisterPostProcess,通过BeanFactory后处理对BeanDefinition进行注册或修改之后,保存到一个数据结构为BeanDefitionMap中,
实例化:对bean保存后的bean信息进行实例化,只是创建bean对象,并未进行属性赋值,此刻的bean是“半成品”
初始化:对半成品的bean对象进行 属性赋值、Aware接口方法的回调、执行BeanPostProcess的before,接口初始化(或者接口初始化),BeanPoSTProcess的after。此刻生成的bean是“完整的”
操作使用:将完整bean存放在SingletonObject集合中,供应用程序所使用。
销毁:接口销毁或属性销毁。
16.如何解决循环依赖
循环依赖:指两个或多个bean之间的相互依赖关系,形成闭环。
用三级缓存缓存解决循环依赖问题:
一级缓存:实例化和初始化完成的bean对象
二级缓存:缓存半成品bean对象,但该对象被引用了
三级缓存:缓存半成品bean对象,但该对象未被引用
17. Spring框架都有哪些注解
用于声明Bean的注解
@Component:通用bean的注解,可以是任意类
@Repository:数据访问层注解
@Service:业务层注解
@Controller:控制层注解
用于注入的注解:
@Autowired:按类型自动注入
@Qualifier:按名称自动注入
用于声明配置、扫描、启用特性的注解
@Configration:声明配置类
18.Spring框架中使用的设计模式
- 工厂模式:使用用工厂模式,通过BeanFactory和ApplicationContext,创建对象
- 单例模式:bean默认单例模式,使用单例模式设计
- 策略模式:Resource实现类,针对不同资源文件,实现不同方式的资源获取策略
- 代理模式:spring的AOP的实现动态代理
- 模版模式:spring提供JDBCTemplate、RediesTemplate等模版,将相同操作的步骤封装
- 适配器模式:spring的AOP的增强和通知使用适配器模式,Spring MVC也使用适配器模式controller
19.Spring框架中AOP的理解
AOP(面向切面编程):将那些与业务无关,却为业务模块所共用调用逻辑(如:事务处理、日志管理、权限控制等)封装抽成一个可重用的模块,该模块称为切面,减少代码的可重复性,降低代码见得耦合度,可利于未来代码的可扩展性和可维护性。
SpringAOP动态代理:
- 若被代理类实现接口,springAop使用JDK,基于接口的方式,创建对象
- 若被代理类未实现接口,SpringAOP使用cglib,基于继承方式,生成被代理的子类来做代理。
20.Spring AOP和AspectJ有什么区别?
增强方式:
- Spring AOP:运行时增强
- AspectJ:编译时增强
实现方式:
- Spring AOP:基于动态代理
- AspectJ:基于字节码操作
功能和复杂性:
- AspectJ:功能强大但相对复杂
- SpringAOP:更简单易用
性能:
- 切面代码较少,两者性能差异不大
- 切面代码较多时,AspectJ性能优于Spring AOP
21.Spring AOP有哪些通知类型?
- 前置通知 :实现MethodBeforeAdvice接口,在目标方法调用前,执行通知;
- 后置通知:实现AfterReturnAdvice接口,在目标方法成功完成后执行通知;
- 异常通知:实现ThrowsAdvice接口,在方法抛出异常时,执行通知;
- 环绕通知:实现MethodInterceptor接口,是一个包围目标方法通知。环绕通知可以在方法调用前后,完成自定义行为。
22. Spring事务中有哪几种事务隔离级别?
标签:容器,面试题,Spring,Bean,bean,注解,IOC From: https://blog.csdn.net/fada_da_da/article/details/142327478默认隔离级别(TRANSACTIONDefition.ISOLATION_DEFAULT):使用当前数据库的默认隔离级别,Mysql默认采用的是可重复读,Oracle默认采用读已提交
读未提交(TransactionDefinition.ISOLATION_READ_UNCOMMITTED):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复度
读已提交(TransactionDefition.ISOLATION_READ_COMMITTED):允许读取并发实物已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
可重复读(TransactionDefition.ISOLATION_REPEATABLE_READ):对同一字段的多次读取结果都是一致的,除非数据是本身事务自己所修改的,可以阻止脏读和不可重复读,但幻读仍有可能发生
串行化(TransactionDefition.ISOLATION_SERIALIZABLE):该级别可以防止脏读、不可重复读以及幻读。这将严重影响程序性能。通常情况下也不会用到该级别。