这里
Spring
Spring是一个轻量级Java开源框架,两个核心特性是DI和AOP
Spring采取了以下4种关键策略
亲呕生少代
-
基于POJO的轻量级和最小侵入性编程;
-
通过DI和面向接口实现松耦合;
-
基于切面和惯例进行声明式编程;
-
通过切面和模板减少样板式代码。
Spring的优点
- 方便解耦,简化开发。Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理
- AOP编程的支持。Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
- 方便集成各种优秀框架
Spring的缺点
- Spring依赖反射,反射影响性能
Spring由哪些模块组成
- spring core:提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)功能。
- spring beans:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean。
- spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。
- spring jdbc:提供了一个JDBC的抽象层,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析, 用于简化JDBC。
Spring 框架中都用到了哪些设计模式?
-
工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
-
单例模式:Bean默认为单例模式。
-
代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
-
模板方法:用来解决代码重复的问题。比如:RestTemplate, JmsTemplate, JpaTemplate。
-
观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被动更新,如Spring中listener的实现–ApplicationListener。
控制反转(IOC)
控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对对象组件控制权的转移,从程序代码本身转移到了外部容器。
Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。)
控制反转(IoC)有什么作用
- 管理对象的创建和依赖关系的维护。对象的创建并不是一件简单的事,在对象关系比较复杂时,如果依赖关系需要程序猿来维护的话,那是相当头疼的
-
解耦,由容器去维护具体的对象
-
托管了类的整个生命周期,比如我们需要在类的产生过程中做一些处理,最直接的例子就是代理,如果有容器程序可以把这部分处理交给容器,应用程序则无需去关心类是如何完成代理的
Spring IoC 的实现机制:
Spring 中的 IoC 的实现原理就是工厂模式加反射机制
BeanFactory 和 ApplicationContext有什么区别
- 加载方式:BeanFactroy时懒加载,只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化、ApplicationContext是在容器启动时,一次性创建了所有的Bean
Spring的DI:
组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。组件不做定位查询,只提供普通的Java方法,让容器去决定依赖关系。
有哪些不同类型的依赖注入实现方式
- 构造器注入:容器通过调用一个类的构造器来实现的,该构造器有一系列参数,每个参数都必须注入。
- Setter方法注入是容器通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法来实现的依赖注入。
面向切面编程(AOP)
通过面向切面编程减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。常用于权限认证、日志等。
Spring AOP中的动态代理
- JDK动态代理
只提供接口的代理,不支持类的代理 - CGLIB动态代理
如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类
Spring AOP里面的几个名词
- 切面(Aspect):切面是通知和切点的结合。
- 切点(Pointcut):切点的定义会匹配通知所要织入的一个或多个连接点
- 连接点(Join point):一个连接点总是代表一个方法的执行
- 通知(Advice):切面的工作被称为通知。
- 织入(Weaving):织入是把切面应用到目标对象并创建新的代理对象的过程。
Spring通知有哪些类型?
- 前置通知
- 后置通知
- 返回通知
- 异常通知
- 环绕通知
Spring Beans
解释Spring支持的几种bean的作用域
通过scope属性来定义作用域:常用的有singleton(默认)和prototype
Spring框架中的单例bean是线程安全的吗?
很多个线程会共享这个bean,是对同一块内存进行操作。
- 如果bean是无状态(有状态就是有数据存储功能(比如dao 类)),spring的单例bean是线程安全的,
- 如果bean是有状态(无状态就是不会保存数据(比如比如 view model 对象)),spring的单例bean是线程不安全的。
- 有状态的话通过原型模式就可以保证线程安全
Spring如何处理线程并发问题?
只有无状态的Bean才可以在多线程环境下共享
采用ThreadLocal进行处理或者进行加锁,解决线程安全问题。
ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。
Spring中bean的生命周期
bean 是由 Spring IoC 容器实例化、组装和管理的对象。
Spring中bean的生命周期:主要由实例化、属性赋值、初始化、销毁这 4 个大阶段。
-
Spring对bean进行实例化:
- 通过反射来进行实例化
-
Spring为 bean 设置相关属性和依赖:
- 解析自动装配
-
初始化:
- 检查aware的相关接口并设置依赖
- 检查是否实现InitializingBean接口
- BeanPostProcessor进行前后置处理进行属性填充和代理封装
-
销毁
- destroyMethod和DisposableBean进行销毁
Spring注解
@Autowired自动装配
在启动spring IoC时,容器就会自动装载了一个后置处理器。当容器扫描到@Autowied、@Resource时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的属性;
如果查询的结果不止一个,会抛出异常,需要配合@Qualifier注解根据名称来查找;
@Autowired和@Resource之间的区别
@Autowired默认按类型装配、可以和@Qualifier结合使用按名字装配
@Resource 默认是按照名称进行装配
Spring的源注解
- @Component:泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
- @Controller:标注控制层组件
- @Service:标注业务层组件
- @Repository:标注DAO层组件
Spring事务
Spring事务的本质其实就是数据库对事务的支持
Spring支持的事务管理类型/Spring事务实现方式有哪些
Spring支持两种类型的事务管理:
- 编程式事务管理:通过编程的方式管理事务
- 声明式事务管理:将业务代码和事务管理分离,只需用注解和XML配置来管理事务。
spring 的事务隔离级别
和数据库的隔离级别是一致的
Spring MVC
通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
Spring MVC的主要组件
- 前端控制器 DispatcherServlet
- 处理器映射器HandlerMapping(根据请求的URL来查找Handler)
- 处理器Handler
- 处理器适配器HandlerAdapter
- 视图解析器 ViewResolver(进行视图的解析,根据视图逻辑名解析成真正的视图(view))
- 视图View
请描述Spring MVC的工作流程
- 用户发送请求至前端控制器DispatcherServlet;
- DispatcherServlet解析用户访问的 URL
- 并调用处理器映射器获取handler(controller)
- DispatcherServlet 调用处理器适配器和视图解析器进行返回视图
- DispatcherServlet 对视图进行渲染返回给客户端
SpringBoot
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简化了繁重的配置,提供了各种启动器,开发者能快速上手。
Spring Boot 有哪些优点?
- 容易上手,提升开发效率
- 没有代码生成,也不需要XML配置。
- 避免大量的 Maven 导入和各种版本冲突。
Spring Boot的启动流程
- 启动入口
- @SpringBootApplication + psvm(main方法)+ new SpringApplication().run(XXXX.class, args)
- @SpringBootApplication 注解由@Configuration(注解类),@EnableAutoConfiguration(将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器),@ComponentScan(自动扫描并加载符合条件的组件)组成
- 进行实例化
-
设置初始化器(Initializer)
-
设置监听器(Listener)
-
- 启动方法
-
创建应用上下文
-
ApplicationContext前置处理
-
ApplicationContext刷新
-
ApplicationContext后置处理
-
Spring Boot Starter是什么
可以理解为一个可拔插式的插件
你想使用Reids插件,那么可以导入spring-boot-starter-redis依赖
spring-boot-starter-parent 有什么用
引入和定义starter相关的东西
spring boot 核心配置文件
bootstrap.properties 和application.properties
application :由ApplicatonContext 加载,用于 spring boot 项目的自动化配置。
bootstrap :在 Spring Cloud 中会用到
Spring Boot 打成的 jar 和普通的 jar 有什么区别
Spring Boot 打成的 jar是可执行 jar,不可以作为普通的 jar 被其他项目依赖