Spring
什么是Spring框架?
Spring是一种轻量级框架,它是很多模块的集合,能够提高开发人员的开发效率。
怎么解决Spring循环依赖?
这三级缓存分别指:
singletonFactories : 单例对象工厂的cache
earlySingletonObjects :提前暴光的单例对象的Cache
singletonObjects:单例对象的cache
先到一级缓存中查询,没有就到二级,二级没有到三级。
列举一些重要的Spring模块?
Spring Core:基础,可以说Spring其他所有的功能都依赖于该类库。主要提供IOC和DI功能。
Spring AOP:提供面向切面的编程实现。
Spring JDBC:Java数据库连接。
Spring ORM:用于支持Mybatis等ORM工具。
Spring Web:为创建Web应用程序提供支持。
Spring Test:提供了对JUnit和TestNG测试的支持。
怎么理解Spring中的IOC容器?(强调创建对象)
IOC读作“控制反转”,是一种设计思想,作用是将原本再程序中手动创建对象的控制权交给Spring容器来管理。在没有Spring之前,我们需要在程序中手动创建对象,而有了SpringIOC后,我们可以用RestController,Service,Bean,Repository等注解来告诉Spring容器它需要创建哪些对象,再通过DI依赖注入将它们注入到需要使用的地方。
怎么理解Spring中的依赖注入(DI)?(强调Bean与Bean之间依赖关系)
通过@Autowired,@Resources注解注入由Spring容器创建好的对象。
怎么理解Spring中的AOP?
AOP称为面向切面编程,思想是在不改变的代码的情况下,动态的在某个方法之前或者之后干点事情。AOP的实现在于代理模式,Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理,JDK动态代理通过实现InvocationHandler接口调用invoke()方法反射来调用目标类中的代码,CGLIB通过生成目标类的一个子类对象来实现的。通常用于权限认证,日志,全局异常处理。
Spring通知类型有哪些?
前置通知:目标方法执行前执行
后置通知:目标方法执行后执行
环绕通知:也是在目标方法执行前执行,但可以控制是否调用目标方法执行(与前置的区别)
抛出异常后通知:在目标方法抛出异常后执行
最终:在目标方法执行后,无论是否抛出异常都会执行(与后置的区别)
@Value注解的作用是什么?
作用是给变量赋值。
三种用法:@Value(“8080”),@Value( p o r t ) , @ V a l u e ( {port}),@Value( port),@Value({port:8080}) 设置默认值,读不到就用后面设置的默认值
Spring 中 bean 的作用域有几种类型
bean的类型通常有两种:
单例:整个容器只有一个实例
原生:每次获取都会创建一个实例
添加作用域的两种方法:
<bean scope="">
@Scope(scopeName="")
Spring中的bean生命周期?
1.Bean容器找到配置文件中Spring Bean的定义。
2.Bean容器利用Java Reflection API创建一个Bean的实例。
3.如果涉及到一些属性值,利用set()方法设置一些属性值。
4.如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。
5.如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
6.如果Bean实现了BeanFactoryAware接口,调用setBeanClassFacotory()方法,传入ClassLoader对象的实例。
7.与上面的类似,如果实现了其他*Aware接口,就调用相应的方法。
8.如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessBeforeInitialization()方法。
9.如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。
10.如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。
11.如果有和加载这个Bean的Spring容器相关的BeanPostProcess对象,执行postProcessAfterInitialization()方法。
12.当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy()方法。
13.当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。
@Component 和 @Bean 有什么区别?
@Component、@Service和@Repository注解表明类会作为一个组件类,通过类路径自动扫描后自动装配到Spring容器中。
@Bean注解告诉Spring方法会返回一个对象,这个对象要注册为Bean。
相同点:目的都是为了将bean注册到Spring容器中。
不同点:@Component加到类上,@Bean是加在方法上,方法的名称作为id,方法的返回值作为值
Spring 依赖注入方式有哪些?
1.构造器注入
2.set方法注入
3.注解注入
在 Spring 中如何操作数据库?
1.JdbcTemplate
2.SpringdataJPA
Spring 中的 Bean 是线程安全的吗?
首先,什么是线程安全?
在多个线程共享同一个资源的情况下,如果都能始终表现正确的话就是线程安全的,否则就是不安全的。
那么怎么保证线程安全?
用锁来保证多线程下资源的线程安全。
如果Bean是单例类型的,那么 Spring 中的 Bean就不是线程安全的,因为多个线程共享同一个单例实例Bean,可以用ThreadLocal保存需要使用的变量。
如果是原生类型的,那么 Spring 中的 Bean就是线程安全的。
Spring 有哪些优点?
轻量级,IOC,AOP,事务管理,容器和MVC框架
Spring、SpringMVC、SpringBoot、SpringCloud 的区别是什么
Spring:提供基础服务,IOC,AOP,事务
SpringMVC:Spring提供对Web的一个支持(封装了Servlet的框架)
SpringBoot:SpringBoot是快速搭建Spring应用的一种方式,拥有起步依赖和自动装配的特性,大大简化了开发,融入了约定大于配置的思想
SpringCloud:基于SpringBoot的微服务解决方案
Spring 中使用的设计模式有哪些
你了解设计模式吗?设计模式有什么用?
了解,设计模式针对特定问题提供了很多最佳实践方案。
你知道的设计模式有哪些?
设计模式共有23种,分为三类
创建型:工厂模式,单例模式,建造者模式。
结构型:代理模式,适配器模式,装饰者模式。
行为型:模板模式,观察者模式,责任链模式。
你项目中用过设计模式吗?你熟悉的框架中用了哪些设计模式?
Spring:
1.单例模式(Spring下默认的bean均为单例)
2.工厂模式(Spring使用工厂模式通过FactoryBean创建Bean对象)
3.代理模式(Spring AOP就是基于动态代理实现的)
4.适配器模式(Spring AOP中通知使用了适配器模式)
5.模板模式(JDBCTemplate,RedisTemplate等使用了模板模式)
6.观察者模式(ApplicationListenner监听,当一个对象状态改变时,其他依赖它的对象也要及时更新)
7.包装器模式(Wrapper,动态的给一个对象添加一些额外的职责,例如连接多个数据库需要用到包装器模式动态切换数据源)
MVC:
责任链模式(拦截器执行和请求的处理)
说说自己对于Spring MVC的了解?
MVC是一种设计模式,Spring MVC是一款很优秀的MVC框架。Spring MVC下我们一般把后端项目分为Service层(处理业务)、Dao层(数据库操作)、Entity层(实体类)、Controller层(控制层,返回数据给前台页面)。
简述一下 Spring MVC 的执行流程?
1.DisPatchServlet:首先所有的请求都要经过前端控制器进行分发。
2.HandlerMapping:然后分发到HandlerMapping,从中遍历出请求对象中对应接口的Handler对象。
3.HandlerExecutionChain:包含拦截器和要请求的Handler对象。
4.HandlerAdapter:用来调用Controller方法。
5.执行拦截器前置方法。
6.调用HandlerAdapter对象执行Controller方法,并返回ModelAndView对象,这里面包含了视图名称。
7.执行拦截器后置方法。
8.ViewResolve:视图解析器,根据ModelAndView对象获取视图名称,根据视图名称获取视图解析对象,渲染视图。
9.执行拦截器视图解析完成后方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fSOBGzjH-1672021422387)(D:/DOWNLOAD/TXT/SpringMVC.png)]
Spring MVC 的常用注解有哪些?
@Controller(定义了一个控制器类,包扫描)
@RestController(@Controller+@ResponseBody)
@RequestMapping(处理请求地址映射)
@ResponseBody(返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用)
@RequestBody(读取request请求的body部分的数据, 解析后, 把相应的数据绑定到请求处理方法的参数上.)
@RequestParam(将请求参数区数据映射到参数上)
@Pathvariable(取出uri模板中的变量作为参数,如/user/{id})
@Autowire(按照类型(byType)装配依赖对象),Resources(ByName自动注入)
@CookieValue(用来获取Cookie中的值)
@SessionAttributes(将值放到session作用域中)
拦截器的使用场景有哪些?
日志,事务,权限验证,登录拦截,全局异常等
什么是RestFUL的风格?
Rest是一种新的架构模式。
资源的定位:URL
资源的操作:METHOD
PUT:添加
POST:修改
GET:查询
DELETE:删除
Spring容器和SpirngMVC容器有什么关系 ?
Spring容器是父容器,SpringMVC是子容器,子容器可以访问父容器,而父容器不能访问子容器。
Spring管理的Bean有:Service,Dao,数据源,事务,整合第三方框架,代理。
SpringMVC管理的Bean有:Controller,视图解析器,拦截器,JSON转换器,静态资源转换。
Spring MVC 中如何在后端代码中实现页面跳转?
1.直接返回视图名,视图解析器会自动添加前缀和后缀。
2.转发,return “forward:ok.jsp”。
3.重定向,return “redirect:ok.jsp”。
SpirngMVC对异常的处理方式有哪些?
1.全局异常
2.@Controlleradvice,@RestControlleradvice
3.@ExceptionHandler
autowired 和resource区别是什么?
1.相同点
都可以完成自己注入。
如果存在多个实例,默认注入的是bean的名字变量的名称。
2.不同点
autowired默认按照类型注入的,resource默认按照名称注入。
存在多个Bean的情况下,指定注入哪个Bean由@Resource通过name属性指定。
存在多个Bean的情况下,指定注入哪个Bean需要Qualifier指定。
存在多个Bean的情况下,可以用@Primary指定优先级。
Spring 有几种实现事务的方式?
1.编程式事务,我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
2.声明式事务,@Transactional
什么是Spring事务?事务有哪几个特性?
数据库操作的最小工作单元
事务特性(4种):
原子性 (atomicity):强调事务的不可再分.
一致性 (consistency):事务执行的前后状态保持一致.
隔离性 (isolation):事务和事务之间的隔离级别
持久性(durability) :事务一旦提交,对数据的修改是永久性的
Spring 的 JdbcTemplate 对象和 JDBC 有什么区别?
JDBC(Java DateBase Connectivity)又称为java数据库连接,是一个执行SQL语句的Java Api。
JDBCTemplate是对JDBC的封装,大大简化了数据库的操作。
Spring 事务隔离级别有哪些?
读未提交:脏读,不可重复读,幻读有可能发生。
读已提交:不可重复读,幻读有可能发生。
可重复读:幻读有可能发生。
串行化:花费较高但是比较可靠的事务隔离级别,避免出现上述的读问题。
由于隔离级别不同产生的问题:
脏读:读到了另一个事务没有提交的数据
不可重复读:在同一个事务中多次读取的数据不一致,读到了另一个事务已经提交的数据
幻读:一个事务在做批量修改,另一个事务在做添加
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f7gf2UNB-1672021422388)(SpringMVC.assets/image-20210810210807492.png)]
Spring事务中有哪几种事务传播行为?
在TransactionDefinition接口中定义了八个表示事务传播行为的常量。
支持当前事务的情况:
PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)。
不支持当前事务的情况:
PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。
其他情况:
UIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)。
不支持当前事务的情况:
PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。
其他情况:
PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。