文章目录
1.什么是Spring框架?Spring框架有哪些主要模块?
- Spring是一种轻量级框架,用于提高开发人员的开发效率以及系统的可维护性
- Spring的主要模块
1.Spring Core: 核心类库,提供IOC服务;
2.Spring Context: 提供框架式的Bean访问方式,u以及企业级功能(JNDI、定时任务等);
3.Spring AOP: AOP服务;
4.Spring DAO: 对JDBC的抽象,简化了数据访问异常的处理;
5.Spring ORM: 对现有的ORM框架的支持;
6.Spring Web: 提供了基本的面向web的综合特性,例如多方面文件上传;
7Spring MVC: 提供面向Web应用的Model-View-Controller实现.
2.Spring的优点?
- 轻量:Spring是轻量的,版本大约2MB
- 控制反转:Spring通过控制反转实现了松散耦合,对象给出他们的依赖,而不是创建或查找依赖的对象们
- 面向切面编程(AOP):Spring支持面向切面编程,并且把应用业务逻辑和系统服务分开。
- 容器:Spring包含并管理应用中对象的生命周期和配置。
- MVC框架:Spring的Web框架是个精心设计的框架,是Web框架的一个很好的替代品。
- 事物管理:Spring提供一个持续的事物管理接口,可以扩展到上至本地事物,下至全局事物(JTA).
- 异常处理:Spring提供方便的API把具体技术相关的异常转换为一致的unchecked异常.
3.Spring的AOP理解
-
AOP:面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装一个可用的模块,这个模块被成为切面
- 减少系统中的重复代码
- 降低了模块间的耦合度
- 提高了系统的可维护性
- 可用于权限认证,日志,事物代理
-
AOP实现的关键在于代理模式:动态、静态代理
-
静态代理的代表为AspectJ;
- 静态代理就是AOP框架会在编译阶段生成AOP代理类,因此也成为编译时增强
- 他会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。
-
动态代理的代表为Spring AOP
- 动态代理就是AOP框架不回去修改字节码
- 每次运行时在内存中临时为方法生成一个AOP对象,
- 动态代理实现方式:JDK动态代理、GGLI动态代理
-
4.Spring的IOC理解
IOC就是控制反转,是指创建对象的控制权的转移,之前创建对象的主动权和时机是由自己把控的,而现在这种权利转移到Spring容器中
- 由容器根据配置文件去创建和管理各个实例之间的依赖关系
- 对象与对象之间松散耦合,也利于功能的复用
Spring的IOC有三种注入方式:
- 构造器注入
- setter方式注入
- 根据注解注入
IOC让相互协作的组件保持松散的耦合
IOC优点
- 第一,资源集中管理,实现资源的可配置和容管理
- 第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度
5.BeanFactory和ApplicationCIntext有什么区别?
-
BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
-
BeanFactory:是Spring里面最底层的接口,包含了各种
- 读取bean配置文档
- Bean的定义
- 实例化
- 管理bean的加载
- 控制bean的生命周期
- 维护bean之间的依赖关系
-
ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:
1.继承MessageSource,因此支持国际化。
2.统一的资源文件访问方式。
3.提供在监听器中注册bean的事件。
4.同时加载多个配置文件。
5.载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。
6.Spring Bean的生命周期
- SpringBean的声明周期只有四个:实例化、属性赋值、初始化、销毁
- 实例化
- 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean的时候,或者需要初始化bean的时候需要注入一个尚未初始化的依赖时,容器会调用createBean进行实例化
- 对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。
- 属性赋值
- 实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成依赖注入。
- 初始化
- Constructor > BeanPostProcessor.postProcessBeforeInitialization() > @PostConstruct > InitializingBean > init-method > BeanPostProcessor.postProcessAfterInitialization() > 容器初始化完成
- 销毁
- DisposableBean:当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;
- destroy-method:最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法
7.Spring支持集中bean的作用域
Spring的容器中的bean可以分为5个范围
- singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。
- prototype:为每一个bean请求提供一个实例。
- request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收
- session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效
- global-session:全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。
8.Spring框架中都用到了哪些设计模式?
- 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
- 单例模式:Bean默认为单例模式。
- 代理模式 :Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
- 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
- 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。
9.SpringBoot的优缺点
- 独立运行Spring项目
- 内嵌servlet容器
- 提防starter简化Maven配置
- 自动装配Spring
- 准生产的应用监控
- 无代码生产和xml配置
10.Spring starter
spring-boot-starter: Spring Boot的核心启动器,包含了自动配置、日志和YAML
spring-boot-starter-aop: 支持AOP面向切面编程的功能,包括spring-aop和AspecJ
spring-boot-starter-cache: 支持Spring的Cache抽象
spring-boot-starter-artermis: 通过Apache Artemis支持JMS(Java Message Service)的API
spring-boot-starter-data-jpa: 支持JPA
spring-boot-starter-data-solr: 支持Apache Solr搜索平台,包括spring-data-solr
spring-boot-starter-freemarker: 支持FreeMarker模板引擎
spring-boot-starter-jdbc: 支持JDBC数据库
spring-boot-starter-Redis: 支持Redis键值储存数据库,包括spring-redis
spring-boot-starter-security: 支持spring-security
spring-boot-starter-thymeleaf: 支持Thymeleaf模板引擎,包括与Spring的集成
spring-boot-starter-web: 支持全栈式web开发,包括tomcat和Spring-WebMVC
spring-boot-starter-log4j: 支持Log4J日志框架
spring-boot-starter-logging: 引入Spring Boot默认的日志框架Logback
11.Spring循环依赖,Spring允许循环依赖吗?
- 循环依赖其实就是循环引用,也就是两个或者两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。
- Spring中循环依赖场景有
- 构造器的循环依赖
- field属性的循环依赖
- 不要使用基于构造函数的依赖注入,可以通过以下方式解决:
- 在字段上使用@Autowired注解,让Spring决定在合适的时机注入必要时再加上@Lazy
- 用基于setter方法的依赖注入。
12.BeanFactory和factoryBean的区别
区别
- BeanFactory是个Factory,也就是IOC容器或对象工厂,在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。
- FactoryBean是个Bean。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似