文章目录
本篇是继上篇java基础面试考点后的Spring系列的基础高频考点。整理成文。
什么是Spring
spring是一个轻量级的DI和AOP容器框架。
- 轻量级:spring框架本身还是应用开支都算是轻量级。整个Spring框架打包后只有2.5M的一个Jar包. 应用层面,是非侵入式的,即应用中的对象一般不依赖spring的类。
- 依赖注入(或者叫控制反转):松耦合。对象不是从容器中找它依赖的类,而是容器在实例化对象时,主动将它的依赖类注入给它。
- 面向切面:将业务和应用服务(比如监控,事务)等分离,只关心业务。
- 容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期和配置
使用Spring的好处
首先Spring是一个轻量级框架,整个Spring打包后只有几兆,它的依赖注入,AOP等特性,能够降低耦合,将事务等应用服务和业务分离。而且这些优点是以前的开发模式解决不了的,早期的jsp html和java混在一起,后来出现MVC模式,但是DAO层频繁的实例化,加重了GC。而Spring管理一个池子,在实例化时,自动注入,将对象的实例等控制权反转。另外Spring框架包含很多内容,但是它有一个特点就是保持开放,非常灵活,可以很方便的集成现有的优秀框架,比如持久化层,可以选择Hibernate ,JPA, MyBatis,JDBC等。
SpringBoot是一个微服务框架。它是基于Spring.
SpringBoot我的理解是,为了让你用更少的代码,更少的配置,来使用Spring,并方便你集成其他模块到你的Spring项目。
SpringBoot的一些特性
- 比如自动配置-
- 独立运行(内置tomcat)所以可以部署到Docker容器,方便实现微服务
- 自以为是:比如你加一个JPA的依赖,它会自动使用内存数据库,自动做很多事情。
这些特性当然使开发者可以快速方便的开发自己的应用,但是也带来了一些弊端,比如你如果想要更灵活的配置,需要花更多的成本了解它的自动配置等封装的东西。还有一些老项目,要升级SpringBoot管理,并不轻松。
Spring的组成模块
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2HK4NEsv-1581336882651)(E:\APK\博.png)]
-
核心容器(core):
最基本的Spring容器和Spring的DI所依赖的基础。你能看到BeanFactory。
-
上下文(Application Context)
建立在核心容器之上,扩展了BeanFactory。
-
AOP: 对面向切面提供了丰富的支持
-
JDBC抽象和DAO模块: JdbcTemplate
-
ORM关系对象映射
-
Spring MVC框架 : Struts ,SpringMVC
-
远程调用
核心容器(应用上下文)模块
Spring通过一个配置文件描述了Bean及Bean之间的依赖关系,利用java语言的反射功能实例化Bean并创建Bean之间的依赖关系。这些工作正是IoC容器要做的。
com.springframework.beans.factory.BeanFactory: 是一个类工厂。但它和传统的类工厂不同,传统的类工厂仅负责构造一个或几个类的实例,而BeanFactory是类的通用工厂,它可以创建并管理各种类的对象。这些可被创建和管理的对象本身没有什么特别之处,仅是一个POJO,Spring称这些被创建和管理的Java对象为Bean。
如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的身躯了。ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置的方式实现。
BeanFactory 实现举例
仅是一个POJO,Spring称这些被创建和管理的Java对象为Bean。
- 如何使用BeanFactory启动Spring IoC容器:
1.配置Bean信息
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="car" class="com.smart.Car"
init-method="myInit"
destroy-method="myDestory"
p:brand="红旗CA72"
p:maxSpeed="200"
/>
</beans>
2.初始化后就可以获取bean:
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource res = resolver.getResource("classpath:com/smart/beanfactory/beans.xml");
BeanFactory bf = new XmlBeanFactory(res);
Car car = bf.getBean("car",Car.class);
通过BeanFactory启动IoC容器时,并不会初始化配置文件中定义的Bean。初始化动作发生在第一个调用时,对于单实例(singleton)的Bean来说,BeanFactory会缓存Bean实例,所以第二次使用getBean()获取Bean时,将直接从IoC容器的缓存中获取Bean实例。
值得一提的是,在初始化BeanFactory时,必须为其提供一种日志框架,这里使用Log4J,即在类路径下提供Log4J配置文件,这样启动Spring容器才不会报错。
Spring加载流程
ContextLoadListener——》初始化加载配置文件——》进行Bean的实例化——》Bean的调用
BeanFactory和ApplicationContext有什么区别
综述:
BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但application context在此基础上还提供了其他的功能。
提供了支持国际化的文本消息
统一的资源文件读取方式
细节:
如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的身躯了。ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置的方式实现。
如何用ApplicationContext启动IoC容器:
ApplicationContext ctx =
new FileSystemXmlApplicationContext("com/smart/ context/beans.xml");
ApplicationContext启动容器和BeanFactory启动的区别:
BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例化目标Bean;而ApplicationContext在初始化应用上下文时就实例化所有单实例的Bean。因此ApplicationContext的初始化时间会比BeanFactory稍长一些,
基于注解的配置方式:
通过@Configuration,见下文。
Spring为基于类注解的配置提供了专门的ApplicationContext实现类:AnnotationConfigApplicationContext。
说说你对 Spring 的理解
非单例注入的原理?它的生命周期?循环注入的原理, aop 的实现原理,说说 aop 中的几个术语,它们是怎么相互工作的?
单例注入是通过单例beanFactory进行创建,生命周期是在创建的时候通过接口实现开启,循环注入是通过后置处理器,aop其实就是通过反射进行动态代理,pointcut,advice等。
循环注入,是指A依赖B, B依赖C,C依赖A 。Spring中解决循环依赖是通过后置增强实现。AOP是通过动态代理实现应用服务和业务的分层,主要用到jdk动态代理和cglib。
你对Spring核心组件的理解
核心组件core, 它是IOC控制反转和AOP等的基础,比如BeanFactory。它能够创建各种应用中的Bean,并维护它们之间的关系,在需要时自动注入依赖,把对象的依赖创建等控制权从程序员手中交到spring,在此基础上的Context进一步丰富其他功能。