1,Spring面试基础

1)Spring框架相关组件

Spring Core:核心类库,提供IOC服务; Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等); Spring AOP:AOP服务; Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; Spring ORM:对现有的ORM框架的支持; Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; Spring MVC:提供面向Web应用的Model-View-Controller实现。

2)什么是IOC和DI

IOC就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源。
DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

3)SpringBean的配置方式

基于XML的配置
基于注解的配置(@Component、@Repository、@Controller @Service)、

在Spring的配置文件中 定义注解扫描的范围

这样 在com.itcast包下的所有标注了 @Component、@Repository、@Controller注解的类,会被注册到容器中

基于Java类+配置注解的方式(@Configuration @Bean)。

4)IOC容器Bean的常见属性

id标签是bean的唯一标识,IoC容器中bean的id标签不能重复,否则报错。
name是bean的别名,可以定义多个
class属性是bean常用属性,为bean的全限定类名,指向classpath下类定义所在位置
factory-method属性factory-method工厂方法属性,通过该属性,我们可以调用一个指定的静态工厂方法,创建bean实例。
scope属性 bean的作用范围
init-method和destory-method属性 Bean的初始化和销毁时执行的方法
autowire属性 表示bean的自动装配方式 可选值: no:默认,不进行自动装配 .byName .byType

5)IOC容器Bean的作用域

singleton:表示整个IOC容器共享一个Bean,也就是说每次说每次通过getBean获取的bean都是同一个。
prototype:每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。

request:每次HTTP请求将会生成各自的bean实例
session:每次会话请求对应一个bean实例
global-session:全局作用域

singleton和prototype经常使用,其他的很少使用

6)IOC依赖注入方式

构造器注入、setter方法注入、根据注解注入

7)IOC容器中重要的类

IOC容器的顶级接口 BeanFactory , 仅提供了最基本的容器方法
ApplicationContext接口 则扩展了BeanFactory,提供了很多功能,使我们常用的容器
BeanFacotry的实现类 XmlBeanFactory
ApplicationContext的实现类:
ClassPathXmlApplicationContext:可以加载类路径下的配置文件,实现容器的实例化。
FileSystemXmlApplicationContext:可以加载磁盘任意路径下的配置文件,实现容器的实例化。(必须有访问权限)
AnnotationConfigApplicationContext :扫描配置注解,根据注解配置实现容器的实例化。

8)Spring的常用注解

@ComponentScan 组件扫描, 会扫描指定包下的 @Component @Controller @Service @Repository @Controller 标注当前类为容器的对象,代表控制组件 @Service 标注当前类为容器的对象,代表服务组件 @Repository 标注当前类为容器的对象,代表持久组件

9)Autowired和Resource注解区别

1、 @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。

2、 @Autowired默认按类型装配(这个注解是属于spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以搭配@Qualifier注解进行使用

3、@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

2,Spring面试重点

1)IOC容器初始化流程

1,创建配置

基于xml 或 基于注解 配置Spring Bean

2,配置解析

读取xml内容,并得到一个Document对象 解析Document对象,遍历bean标签的节点 将每一个Bean标签封装成一个BeanDefinition对象

3,注册bean定义到容器中

将bean的定义对象 存储到容器中的map集合中 map集合: 在容器的核心实现类 DefaultListableBeanFactory中, ConcurrentHashMap 以 bean标签中配置的id作为key 以 beanDefinition对象作为value存储到map集合中

4,初始化所有单例对象

完成注册后,查看所有注册bean定义 如果是非抽象 、 并且不是懒加载的单例对象会被立刻创建 创建出来的单例对象会存储到singletonObjects map集合中 也是一个ConcurrentHashMap

2)IOC容器getBean流程

在容器内容很多地方被使用到,主要作用是获取对象

  1. 判断单例map集合中 是否已经创建该对象

    有返回 没有下一流程

  2. 判断是否存在父容器,且父容器是否包含该对象

    包含: 调用父容器的getBean 没有下一流程

  3. 准备尝试创建对象,beanDefinitionMap中获取bean定义

    没有 抛出NoSuchBeanDefinition 有下一流程

  4. 判断bean定义的scope属性

    单例 调用createBean创建对象 加入单例map集合 多例 调用createBean创建对象 其他

  5. createBean创建对象

    获取要创建bean的class 判断是否使用工厂方法创建对象 调用工厂方法创建对象 运行到这里说明是使用构造器创建 根据构造器参数的个数、类型 确定到底使用哪个构造器创建 使用JDK反射方法创建对象

  6. 依赖注入

    调用populateBean方法进行依赖注入

3)SpringBean的循环依赖和覆盖问题

循环依赖

  • 如果对象都是多例对象 会报循环依赖异常
  • 如果是单例对象:
  • 如果是通过构造器依赖的属性, 会报循环依赖异常
  • 如果是通过属性依赖产生的循环依赖, 默认允许循环依赖
  • 设置allowCircularReferences为false 会报循环依赖异常

同名bean的覆盖问题

默认情况: 同一个配置文件中出现id相同的bean会报错 不同的配置文件出现id相同的bean 后加载的bean会将先加载的bean覆盖掉 称为bean的覆盖 bean的覆盖不会报错,但可能影响我们的项目 , 可以通过属性设置 不允许bean的覆盖 allowBeanDefinitionOverriding设置为false

4)Spring管理Bean的生命周期

1.bean对象的实例化 2.封装属性,也就是设置properties中的属性值 3.如果bean实现了BeanNameAware,则执行setBeanName方法,也就是bean中的id值 4.如果实现BeanFactoryAware或者ApplicationContextAware ,需要设置setBeanFactory或者上下文对象setApplicationContext 5.如果存在类实现BeanPostProcessor后处理bean,执行postProcessBeforeInitialization,可以在初始化之前执行一些方法 6.如果bean实现了InitializingBean,则执行afterPropertiesSet,执行属性设置之后的操作 7.调用执行指定的初始化方法 8.如果存在类实现BeanPostProcessor则执行postProcessAfterInitialization,执行初始化之后的操作 9.执行自身的业务方法 10.如果bean实现了DisposableBean,则执行spring的的销毁方法 11.调用执行自定义的销毁方法。

5)SpringAOP面试点

谈谈你对AOP的理解

Aspect Orieted Programming ,中文叫“面向切面编程”或“面向方面编程” 是一种编程模式,将分布在多个类中的功能封装到一个类中,这些功能称为cross-cutting concerns(横切关注点),如日志、事务、缓存权限、安全等
不是替代OOP,而是对其的补充

项目中AOP的实际应用场景?

比较常用的 事务、权限、异常、 用户行为日志、 性能监控、缓存等等 AOP

AOP的具体使用方式?

定义切面类 我们使用注解的方式 @Aspect @Component 定义切入点表达式 可以通过 扫描包的方式 也 可以通过指定注解的方式 定义通知: 通知分5种 前置、后置、异常、最终、环绕通知

例: 以用户行为日志举例AOP的使用
日志效果

6)Spring事物面试点

1,Spring事物的配置方式

注解方式配置 基于AOP的tx标签配置

2,Spring事物的隔离级别

Spring 默认使用数据库的隔离级别 ISOLATION_READ_UNCOMMITTED:读未提交 ISOLATION_READ_COMMITTED:读已提交 ISOLATION_REPEATABLE_READ:可重复读 ISOLATION_SERIALIZABLE:串行化

3,Spring事物的失效场景


7)Spring使用的设计模式