1. 谈谈对IOC和AOP的理解
IOC就是控制反转嘛,将我们所需要创建的对象交给Spring进行统一的管理。IOC实际上就是一个map通过扫描@Controller ,@Service @Compent 这些注解然后根据类的全限定名通过反射放到map里。
AOP就是面向切面编程,就是对功能进行一个增强处理,比如日志,事务。他底层使用动态代理实现的,动态代理分为jdk动态代理和CGLIB动态代理
2. JDK动态代理和CGLIB动态代理区别
JDK动态代理需要实现接口 CGLIB动态代理不需要实现接口
JDK动态代理通过反射来实现的CGLIB代理通过字节码来实现的
3. BeanFactory 和 ApplicationContext有什么区别?
BeanFactory就是Bean工厂主要用来管理Bean的生命周期BeanFactory采用延迟加载的方式加载bean
ApplicationContext继承了BeanFactory提供了除了BeanFactory外的所有功能还提供了一些其他功能比如国际化,获取系统环境变量等功能。ApplicationContrext采用预加载的方式加载Bean
4.依赖注入的方式有哪些?
有构造器注入,sett注入,注解注入
5. 将一个类声明为Spring的bean 的注解有哪些?
@Component:通用的组件注解,适用于所有层次。
@Controller:适用于 Spring MVC 的控制层,处理请求和视图。
@Service:适用于业务逻辑类,标识服务层的组件
@Configuration:标识配置类,用于定义 bean 和配置 Spring 容器。
@Bean:用于方法上,定义返回值为 Spring bean。
6.Spring框架中的单例bean是线程安全的吗
在单例bean中是非线程安全的单例bean每个线程共享同一个bean,可以将bean中定义成一个不可变的成员变量,或者将单例bean转为原型bean或者使用ThreaLocal来将变量存储起来。
7.Bean的生命周期
Bean的生命周期主要分为实例化,给属性赋值,初始化,使用Bean和销毁bean
实例化就是为bean分配内存空间,在给属性进行赋值,在进行初始化:在这一过程主要是实现某一个xxxAware接口就调用对应的Set方法比如说实现BeanNameAware接口就调用setBeanName,或者实现BeanFactoryAware接口就调用SetBeanFactoryAware方法,在依赖注入和Aware回调后Spring容器就会进行前置处理就会调用beanPostProcessor的brfore方法,然后就进行初始化回调判断是否实现InitializingBean接口,然后就执行后置方法,就开始然后再就是使用Bean,最后就是销毁bean。
8. 如何简短地回答Spring是如何解决循环依赖的
在Spring中通过三级缓存来解决循环依赖,假如a和b发生循环依赖,a实例化后就会放到缓存中,当a注入b的bean,b进行实例化需要注入A的bean这时就会从缓存中获取A实例化后的bean,当b的bean创建完成后,a从缓存中获取b的bean完成属性注入和初始化。
三级缓存有啥好处
1.提高数据的响应速度
2.减少系统负载
3.提升应用性能
一级缓存主要缓存已经实例化的bean,二级缓存主要缓存还未完全实例化的bean,三级缓存主要用来存储bean工厂的引用
9.Spring⽀持的⼏种bean的作⽤域
1.单例(Singleton):每个容器只有一个bean的实例
2.原型(Prototype):每次注入都会创建新的实例
3.request:每个 HTTP 会话创建一个 bean 实例,且该 bean 在会话结束后被销毁。
4.session:每个 HTTP 会话创建一个 bean 实例,且该 bean 在会话结束后被销毁。
10.autowired和resource注解的区别
autowired是根据属性注入(byType) resource是根据名称注入(byName)如果没找到byName才会去找byType
11.Spring事务的实现⽅式和原理以及隔离级别?
spring事务分为编程式事务和声明式事务
编程式事务就是手动控制事务的提交和回滚
声明式事务就是使用@Transactional注解来控制事务的提交和回滚
事务隔离级别分为
1.读已提交:只允许读取已提交的数据
2.读未提交:允许读取未提交的数据
3.可重复读:同一个事务两次读取的结果保持一致性
4.串行化:保证事务的一致性和完整性
12.Spring事务什么时候会失效?
1.没有使用public修饰的方法
2.异常为被抛出或者未被捕获:Spring 事务只在 RuntimeException
或 Error
抛出时回滚。如果方法中抛出了 checked exception
,事务不会回滚,除非在 @Transactional
注解中显式配置 rollbackFor
参数。
3.使用final修饰也会失效
4.没有被spring管理也会失效
5.数据库存储引擎不支持事务
13.SpringMVC的底层原理
首先用户发送请求给前端控制器之请求调用HandlerMapping 返回一个handler执行链给前端控制器,然后将handler执行链交给处理器适配器他会根据handler执行链找到对应的一个Controller返回一个modelAndview 给前端控制器,前端控制器收到modelAndView就会请求视图解析器进行解析返回一个view视图给前端控制器然后在进行渲染返回给用户。
14.Spring和SpringMVC和SpringBoot区别
Spring 他核心包括IOC和AOP,IOC就是用来管理bean将需要手动创建的对象交给spring创建。AOP就是面向切面编程对已有的功能进行增强处理,比如说日志,事务等AOP底层是通过动态代理实现的
SpringMVC是spring对web框架的一个解决方案。提供了一个前端控制器用来接收前端的请求然后通过一套路由策略来返回view视图给前端
SpringBoot就是让程序员更加快速开发Spring+SpringMVC的应用简化了一些xml配置
15. SpringBoot自动配置原理
核心注解就是@SpringbootApplication下面的@EnableautoConfiguretion这个注解就是自动配置的核心注解,他下面有个@import注解用来导入一个类,这个类会扫描类路径下的所有包,查找类路径下所有具有Spring.factories文件的jar包将扫描到的响应类组件注册进Spring容器中
16. 会不会自定义Starter 大概实现步骤
自定义starter首先写一个@Configuration的配置类将bean定义在里面然后创建一个spring.factories文件将配置类放在该文件中springboot就会按照约定来加载该配置。
17.Springboot的核心注解
@SpringbootApplication他是Springboot 的核心注解主要由下面三个注解组成
@SpringBootConfiguration:主要由Configuration组成用来加载配置类
@EnableAutoConfiguration:就是他是一个自动配置的核心类,他里面有一个improt注解导入了一个class类用来加载spring.factories文件下的配置类
@ComponentScan:组件扫描
18.过滤器和拦截器的区别
过滤器底层通过函数回调来实现的拦截器通过反射来实现的
过滤器能过滤所有请求拦截器只能拦截controller请求
过滤器在servlet之前进行过滤,拦截器在controller之前servlet之后进行拦截的