1、Spring的IOC容器
IOC的概念:控制反转,把对象的创建过程与使用统一交给springbean管理
IOC主要实现技术:反射、解析xml、bean工厂
优点:降低了代码耦合度,提高了程序的可维护性
2、什么是AOP
面向切面编程,将与业务逻辑无关的,且又通用的代码封装起来。便于减少代码冗余,提高程序的维护性
3、AOP包含的几个概念
1、Jointpoint(连接点):具体的切面点
2、Advice(通知): 在连接点进行的具体操作,分为前置、后置、异常、最终、环绕五种情况。
3、目标对象:被AOP框架进行增强处理的对象,也被称为被增强的对象。
4、AOP代理:AOP框架创建的对象,简单的说,代理就是对目标对象的加强
4、Spring的主要组成部分
- spring core:提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)功能。
- spring beans:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean。
- spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法。
- spring jdbc:提供了一个JDBC的抽象层,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析, 用于简化JDBC。
- spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。
- spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。
- spring test:主要为测试提供支持的,支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。
5、DI注入的三种方式:
1、构造器注入 2、set注入 3、接口注入(已被spring弃用)
6、Spring常用注解
@Component, @Controller, @Repository, @Service
@Autowired和@Resource之间的区别
- @Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。
- @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。
7、Springmvc的执行流程
1)用户发送请求至前端控制器DispatcherServlet
2)DispatcherServlet收到请求调用HandlerMapping映射器
3)HandlerMapping找到具体的处理器,生成对象及拦截器返给DispatcherServlet
4)DispatcherServlet调用HandleAdapter适配器
5)HandleAdapter经过适配调用具体的Controller
6)Controller执行完成返回ModelAndView
7)适配器将执行结果返回给DispatcherServlet
8)DispatcherServlet再将结果传给ViweReslover视图解析器
9)ViweReslover解析后返回具体的View
10)DispatcherServlet根据View渲染视图
11)完成响应
请求-----前端控制器----映射器----适配器----controller----modelAndView----适配器----
前端控制器----视图解析器----视图----渲染----响应
8、什么是Springboot
开箱即用的框架,减少配置代码,
所有的配置写在yml文件中,在main方法中通过@springbootApplication启动项目
@SpringBootConfiguration:它组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:具有打开自动配置的功能,也可以关闭某个自动配置的选项。
@ComponentScan:用于Spring组件扫描。
9、Springboot启动流程
1、@SpringBootApplication注解
@SpringBootConfiguration:标注当前类是配置类,启动时会将这个类中声明的Bean注入到Spring容器中
@EnableAutoConfiguration:开启自动配置,也springboot的核心注解
@ComponentScan:扫描所在类的package,加载符合条件的组件(类中含有@Component等相关bean注解)
2、run()方法
1、创建定时器stopWatch并启动 2、获取并运行listeners 3、打印banner
4、创建上下文ApplicationContext 5、预处理上下文 6、刷新上下文(添加后置处理器)
7、listeners发布finish 8、定时器stopWatch停止计时 9、打印启动日志
10、spring、springmvc、springboot的区别
Spring是一个ioc容器,用来管理bean,使用依赖注入实现控制反转,方便整合各种框架提供的AOP,可以将业务重复代码抽成切面,自动注入给方法执行,比如日志等操作;
Springmvc是spring对web框架的一个解决方案,提供了前端控制器servlet,handler处理器,用来接受请求和响应数据
Springboot是spring提供的快速开发工具包,简化了配置,采用注解化方式启动项目
11、Spring中bean的创建过程?SpringBean的生命周期
简单来说:主要分四个阶段:实例化 -》属性赋值 -》初始化 -》销毁
1、解析类得到BeanDefinition
2、如果有多个构造方法,则要推断构造方法
3、确定好构造方法,进行实例化得到一个对象
4、对象中加了@Autowrired注解的属性进行属性值填充
5、回调Aware方法,例如:BeanNameAware,BeanFactoryAware
6、调用BeanPostProcessor初始化前的方法
7、调用初始化方法
8、调用BeanPostProcessor初始化后的方法,会使用到AOP
9、如是使用的是单列Bean,会把bean放入单例池中
10、使用bean
11、Spring容器关闭时,调用DisposableBean的destory()方法
12、SpringBean是线程安全的吗?不安全的解决方案
springBean默认作用域是sington,是线程不安全的
spring的作用域:
1、sington 2、prototype:为每个Bean请求创建实例
3、request:为每个request请求创建一个实例
4、session 5、global-session:全局作用域
线程安全问题:
prototype:每次都生成一个新的对象,不存在线程安全问题
sington:对于大部分bean都是无状态的,不需要保证线程安全,所以在MVC开发中不存在线程安全问题
无状态:表示这个实例没有属性值,不存在线程可见性问题,比如:controller,service,dao
有状态:可以存数据,有变量值存在,比如:pojo
解决方案:
1、可以将bean的作用域改为prototype
2、使用ThreadLocal,为每个线程存一个副本变量,每个线程只操作自己的副本变量
13、Spring用到了哪些设计模式?
1、单例模式:springbean 2、工厂模式:beanFactory
3、适配器模式:HandlerAdater 4、代理模式:AOP
5、策略模式:访问Resources下的Mapper接口
14、Spring事务什么时候会失效?
1、bean不受Spring容器管理
2、方法修饰符不是public
3、自身调用问题,只有被代理方法去调用其它方法,事务才能失效。普通方法,调用代理方法,事务不会生效(方法上有@Transactional属于被代理方法)
4、rollbackFor指定的异常和抛出的异常不同
源码级别(待深入理解):
SpringBoot自动配置原理
SpringMVC底层执行流程
Spring事务的传播机制
Bean的创建过程底层实现
SpringIOC的启动流程及底层实现
Spring如何处理循环依赖问题
AOP的底层实现