2020java面试-Spring基础


本篇是继上篇java基础面试考点后的Spring系列的基础高频考点。整理成文。

什么是Spring

spring是一个轻量级DIAOP容器框架。

  • 轻量级: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进一步丰富其他功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值