一、spring框架的好处
1.控制反转:
srping通过控制反转把new对象的权限从开发者手中交到了spring框架,实现了松散耦合
2面向切面的编程:spring支持面向切面编程(aop),并且应用业务逻辑和系统服务分开
3MVc框架:三层架构的设计 model模型 view视图 controller控制器 分层设计 实现了系统业务组件之间的解耦,有利于系统的可扩展性,可维护性 提高开发效率
4事务管理:spring提供一个持续的事务管理接口,可扩展到上至本地事务至全局事务(JTA)
5异常处理:spring提供方便的api把具体技术相关的异常(比如由JDBC,hibernate(海伯内特) or JDO抛出的) 为一致的unchecked(昂柴克特)异常
6非侵入性设计:spring是一种非侵入式框架,它可以使应用程序代码对框架的依赖最小化
二、什么是springIOC
srping包含并管理应用中对象的生命周期和配置的容器
三、什么是依赖注入?可以通过多少种方式完成依赖注入
依赖注入是指程序运行过程中,如果需要调用另一个对象协助时,无需在代码中常见被调用者,而是依赖于外部的注入。spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理
构造器注入,返回客户端使用的时候一定是完整的
setter注入:可选的注入方式,好处是在有变更的情况下,可以重新注入
Autowired注入,注解注入
四.什么是Bean
springIOC容器管理的对象称为Bean,Bean是一个由springIOC容器实例化、组装和管理的对象
总结
1bean是对象,一个或者多个不限定
2bean托管在spring中一个叫ioc的容器中
3我们的程序是由一个个bean组成的
五 什么是factorybean
FactoryBean是一个spring所提供的一种较灵活的创建bean的方式,可以通过实现FactoryBean接口中的getObject
方法来返回一个对象,这个对象就是最终的bean对象
六 区分BeanFactory和ApplicationContext
BeanFactory 使用懒加载,使用语法显式提供资源对象 不支持国际化 不支持基于依赖的注解
ApplicationContext 使用即时加载 自己创建和管理资源对象 支持国际化 支持基于依赖的注解
七spring提供了哪些配置方式
基于xml配置
基于注解配置
基于Java ApI配置
八将一个类声明为spring的bean的注解有哪些
@Autowired 自动装配bean
@Component 通用的注解 可标注任意类为spring组件
@Repository 对应持久层dao层 用于数据库相关操作
@Service 对应业务层,主要涉及一些复杂的业务逻辑
@Controller 对应spring MVC控制层 主要用户接受用关乎请求并调用Service层返回数据给前端页面
九Bean一共有几个作用域
singleton:默认是单例。一个ioc容器内部仅此一个,常用
prototyp:原型,多实例,常用
request:每个请求都会有一个bean实例 作用域在Spring web应用中
session:一个http session有一个bean实例 作用域在spring web应用中
application:整个servletcontest生命周期中,只有一个bean。作用域在spring web应用中
websocket:一个websocket生命周期内一个bean实例.作用域在spring web应用中
十.spring中的bean生命周期
实例化(new 一个bean)
属性注入
初始化(完成已经放入单例池的bean)
使用
销毁
十一.什么是spring的内部bean
只有将bean用作另一个bean的属性时,才能将bean声明为内部bean。为了定义bean,spring的基于XML的配置元数据在《property》或《constructor-arg》中提供了《bean》元素的使用。内部bean总是匿名的,他们总是作为原型
十二、什么是spring装配
当bean在spring容器中组合在一起时。
spring自动装配的不同模式
no-默认模式。表示没有自动装配
byname-根据bean的名称注入对象依赖项
bytype -根据类型注入对象依赖项
构造函数-通过调用类的构造函数注入依赖项。他有大量的参数
十三、什么是AOP
通过代理的方式,在调用想要的对象方法时候,进行拦截处理,执行切入的逻辑,然后再调用真正的方法实现
切面、连接点、通知、切点、引入、目标对象、aop代理、织入
代理大体可以分为:动态代理和静态代理
十四、什么是循环依赖
循环依赖就是循环引用,俗称“套娃”。比如Bean A需要引用Bean B,Bean B需要引用Bean A,形成循环关系。
spring bean发生循环依赖有三种形式
互相依赖
三者或三者以上循环依赖
自我依赖
十五、spring怎么解决循环依赖
关键就是提前暴露未完全创建完毕的bean
Spring设计了三级缓存解决循环依赖的问题,分别是
一级缓存:singletonObjects,储存所有以创建完毕的单例(完整的Bean)(完整的可以使用的bean)
二级缓存: earlySingletonObjects,储存所有仅完成实例化,是还未进行属性注入和初始化的bean(提前暴露半成品的bean)
三级缓存:singletonFactories,存储能建立这个Bean的一个工厂,通过工厂能获取这个Bean,延迟化Bean的生成,工厂生成的Bean会塞入二级缓存(lamda表达式)(bean工厂)
spring无法解决循环依赖的情况
多实例bean通过setter注入的的时候
构造器注入bean的情况下
单例的代理bean通过setter注入
设置@DependsOn(底盆四昂)注解的bean
十六、spring中的单例bean的线程安全问题
在spring中无状态的bean适合用单例模式(不变模式),这样可以共享实例提高性能。有状态的bean在多线程环境下不安全,适合用prototype原型模式
spring使用ThreadLocal解决线程安全问题。如果你的Bean有多种状态的话(比如View Model对象),就需要自动保证线程安全
十七、spring框架用到了那些设计模式
工厂模式:spring通过工厂实现BeanFactory、ApplicationContext创建Bean对象
单例模式:Spring创建的Bean 都是单例的
适配器模式:spring MVC中用到了适配器模式适配Controller
代理模式:AOP面向切面编程实现
模板方法模式:spring中 jdbcTEplate、hibernateTemplate等易Template(摊破雷特)结尾的对数据库操作的类
包装器模式:我们的项目需要连接多个数据库。这种模式然我们跟驴客户的需求能够动态切换不同的数据源
观察者模式:spring事件驱动模型就是观察者模式很经典的一个应用
十八、spring事务有几个隔离级别
默认的事务隔离级别,已连接数据库的事务隔离级别为准、读未提交、读已提交、可重复读、序列化
十九、spring有哪几种事务转播行为
一共七种
(默认)如果当前存在事务,则用当前事务,如果没有事务则新起一个事务
支持当前事务,如果不存在,则以非事务方式执行
支持当前事务,如果不存在,则抛出异常
(常见)一个新事务,如果存在当前事务,则挂起当前事务
不支持当前事务,始终以非事务方式执行
不支持当前事务,如果当前存在事务,则抛出异常
如果当前事务存在,则在嵌套事务中执行,内存事务依赖外层事务,如果外层失败,则会回滚内层,内层失败不影响外层
二十、springMVC的工作原理
1、客户端(浏览器)发送请求,直接请求到DispatcherServlet(前端控制器)(迪斯拍着色我赖特)
2去找适配器中的@RequesMApping的url
3、返回映射器执行链
4然后调用处理器,也就是具体的方法
5返回方法定义的返回类型 (最后都会返回modelandview)
6
DispatcherServlet请求视图解析器
7 找到视图解析器渲染返回给前端页面的数据
二十一、@Controller注解有什么用
@Controller注解标记一个类为Spring Web MVC控制器Controller。Spring MVC会扫描到该注解得类,然后扫描这个类下面带有@RequestMapping注解的方法,对位个方法生成一个对相应的处理器对象
二十二、RequesMapping注解有什么用
配置处理器的Http请求方法 ,url等信息,将请求和方法进行映射
二十三、RestController和Controller有什么区别
@REstController。在Controller基础上,增加了@RESponseBody注解,更加适合前后端分类的架构下,提供Resful API,返回例如JSON数据格式
二十四、@RequestMapping和@GETMapping的不同之处在哪里
@RequestMapping:可注释在类和方法上;GetMapping只可以注释在方法上
二十五、@RequestParam(派让
)和PathVariable(盘丝外瑞宝)两个注解的区别
RequesMapping注解的参数从请求携带的参数中获取
@PathVariable注解从请求的URL中获取
二十六、返回JSON格式使用什么注解
使用@ResponseBody注解,或者使用包含了@ResponesBody注解的@ResponseController注解
二十七、spring事务失效场景
不是pulic类型
未被spring管理
方法用final修饰
手动抛了异常
数据库不支持事务
二十八、springboot启动流程
初始化springapplication
1、判断容器类型 完成一些容器的初始化工作
2、实例化MAETA-INFspring。factories中以配置的ApplicationContextInitializer(里斯呢)初始类器
3实例化MATA-INF、spring。facories中一配置的ApplicattionListener初始化监听器类
执行run方法
1、启动监听器
2、将jdk maven等一些配置的信息 加载封装到configgurableEnviroment(康菲个内卜因我了门特)对象中
3、初始化应用上下文对象,创建DefaultListtableBeanFactory对象(ioc容器)
4、prepareContext
设置环境信息
监听ioc容器 获取ioc里的bean
5、refresh(瑞赛施)(很多事情)
二十九、springboot自动配置
EnableAutoConfigguration自动配置的核心注解
EnableAutoConfigguration中的selectImports 重要
自动配置怎么做到的:
他会加载 (meta-inf)mental info下的string。factory中配置的那些类,把那些类加载到容器中
spi机制
三十、@Autowired和@Resouece
@Autowierd (spring定义的)
先根据Bean类型去找 如果找不到或找到多个 则根据名字去找 找不到则报错
@Resouece (jdk定义的)
根据Bean名字去找 找不到则根据类型去找 根据Bean类型找不到或找到多个会报错
可以指定bean name
三十一、 @transaction注解是如何开启事务的
通过动态代理(aop)实现的、
三十二、springboot跨域问题
可以通过WebMvcConfigurer重写里面的addCorsMApping方法里添加允许跨域的相关请求
三十三、拦截器和过滤器的区别
1、实现原理不同
过滤器基于函数回调
拦截器基于java动态代理实现的
2、过滤器依赖于servlet容器 拦截器不依赖servlet容器
3拦截器可以获取ioc容器中的各个bean,在拦截器中注入service,可以调用业务逻辑
过滤器实在ioc容器初始化bean之前调用
三十四、JDK动态代理和CGLIb区别
JDK是基于接口的来实现的
CGLIB是通过继承来实现的