Spring常见问题

一. 问题背景

复习完了spring后,对一些面试时问的spring常见问题总结一下。

此笔记仅供自己参考,如有错误请指正

参考自:Spring常见面试题总结(超详细回答)

二. Spring常见问题

2.1 Spring是什么

它是一个轻量式的IOC容器和AOP容器开源框架。其目的是为了简化企业级应用程序开发,使开发人员只需关注业务需求。常见的配置方式有3种:基于xml的配置;基于注解的配置;基于Java的配置

其主要的模块有以下几个:

  • Spring Core:核心模块,提供IOC服务
  • Spring Context:提供框架式的Bean访问方式,以及企业功能(JNDI,定时任务等)
  • Spring AOP:AOP服务
  • Spring DAO:对JDBC的抽象,简化了数据访问异常的处理
  • Spring ORM:对现有ORM框架的支持(ORM:对象关系映射,即将Java对象映射到数据库中)
  • Spring Web:提供了面向web的基本特性,如多方上传文件
  • Spring MVC:提供面向Web应用的Model-View-Controller实现

2.2 Spring的优良特性

  1. 非侵入式:基于Spring开发的应用程序中的对象可以不依赖Spring的API,即Java对象不需要继承Spring或者实现Spring的接口,不需要改变原有代码的结构。
  2. 依赖注入:Dependency Injection,简称DI。它是IOC(Inversion Of Control,反转控制)最经典的实现
  3. 面向切面编程:Aspect Oriented Programming,简称AOP
  4. 容器:Spring是一个容器,因为它包含并管理应用对象的生命周期
  5. 组件化:Spring实现了使用简单组件配置组成一个复杂的应用。在Spring中可以使用java注解和xml组合这些对象

2.3 Spring的IOC理解

应用程序中的组件获取资源时,传统的方式组件主动去容器中获取所需的资源,这种模式下,开发人员往往需要知道在具体的容器中特定资源的获取方式,大大增加了学习成本,同时降低了开发效率。

IOC,Inversion Of Control,反转控制。反转控制的思想颠覆了传统的方式:反转了资源的获取方向——改由容器主动将资源推荐给需要的组件,开发人员不需要知道容器是如何创建对象的,只需要提供接收资源的方式即可。降低了学习成本,提高了开发效率。这种行为也称为被动的查找形式。

2.4 Spring的DI理解

DI,Dependency Injection,依赖注入。依赖注入是指组件以一些预定义好的方式(比如setter方法、构造器)接收来自容器的资源注入。

IOC与DI的关系:IOC是一种思想,反转控制的思想;而DI是IOC的一种具体实现

2.5 Spring的AOP理解

AOP,Aspect Oriented Programming,面向切面编程。它是OOP(面向对象编程)的扩充。AOP主要的编程对象是切面,切面是由若干个横切关注点组成的。而横切关注点是从各个方法中抽取出来的同一类非核心业务。总之,切面模块化横切关注点。在应用AOP编程时,我们仍然需要定义公共功能,此外还可以明确定义这个功能应用到哪里,以什么方式应用,并且不必修改受影响的类

2.6 IOC容器在Spring中的实现

  1. 在通过IOC容器读取Bean的实例之前,首先需要将IOC容器实例化。

  2. Spring提供了2种IOC容器的实现方式:

    (1)BeanFactory:IOC容器的基本实现,面向Spring内部,不提供给开发人员使用。BeanFactory可以理解成定义了各种Bean的工厂。它包含了各种Bean的定义,以便收到客户端请求后将对应的Bean实例化。BeanFactory还包含了Bean生命周期的控制,调用客户端的初始化方法(init-methods)和销毁方法(destruction-methods)
    (2)ApplicationContext:它是BeanFactory的子接口,提供了更多高级特性,提供给开发人员使用。几乎所有场合都是使用ApplicationContext而不是底层的BeanFactory。

2.7 BeanFactory和ApplicationContext的区别

上面IOC容器在Spring中的实现涉及到了BeanFactory和ApplicationContext。两者的区别如下:

BeanFactory:

  1. 包含了各种Bean的定义,以便接收客户端请求后将对应的Bean实例化
  2. 包含Bean生命周期的控制,调用客户端的初始化方法(init-method)以及销毁方法(destruction-method)

ApplicationContext:
除了包含BeanFactory的功能,还提供了许多高级特性,比如:

  • 提供支持国际化的文本消息
  • 统一的资源文件读取方式
  • 在监听器中注册Bean的事件

2.7.1ApplicationContext常见的实现方式

  1. ClassPathXmlApplicationContext:读取类路径下的对应配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("xxx.xml");
  1. FileSystemXmlApplicationContext:读取文件系统路径下的对应配置文件
ApplicationContext context = new FileSystemXmlApplicationContext("xxx.xml");
  1. XmlWebApplicationContext:由web应用的XML文件读取上下文

  2. AnnotationConfigApplicationContext:基于Java配置启动容器

2.7.2 容器结构

在这里插入图片描述

2.8 Spring配置到应用开发中有哪些方式

2.8.1 基于XML的配置

在spring框架中,我们常用xml文件来配置依赖和服务。这些配置文件是由一个<beans>标签组成,在<beans>标签里面包含着许多<bean>标签以及其他配置选项。Spring的XML配置方式是使用被Spring命名空间所支持的一些列组件来实现的,如context,bean,tx,aop,jdbc,mvc。

2.8.2 基于注解的配置

只需要在方法上、类上或者字段声明上使用注解即可。注解注入会被容器在XML注入之前处理,所以后者会覆盖前者对同一属性的处理结果。

注解装配在Spring中默认是关闭的,需要在xml文件中配置如下才能打开:

<beans>
  <context:annotation-config/>
</beans>

<context:annotation-config/>标签完成后,我们可以使用注解向属性、方法、构造方法中自动装配变量。

常用的注解类型有如下:

  1. @Required:该注解应用于设置方法(setter方法)
  2. @Autowired:该注解应用于设置方法、非设置方法、构造方法和变量。@Required有的,@Autowired都有。
  3. @Qualifier:该注解和@Autowired注解搭配使用,用于当匹配到多个相同类型的Bean时,通过@Qualifier指定Bean的id去配置哪个Bean

2.8.3 基于Java的配置

使用@Configuration和@Bean来实现

  1. @Configuration:被该注解标注的类是作为Bean定义的资源。即该类包含许多Bean的定义
  2. @Bean:被该注解标注的方法将会实例化、配置和初始化一个新的对象,这个对象讲由Spring的IOC容器管理。该注解起到的作用与<bean>的作用是一样的。

例子:

@Configuration 
public class AppConfig{ 
 @Bean 
 public MyService myService() { 
 return new MyServiceImpl(); 
 } 
}

相当于以下在xml文件中配置:

<beans> 
 <bean id="myService" class="com.somnus.services.MyServiceImpl"/> 
</beans>

上述配置方式的实例化方式如下:利用AnnotationConfigApplicationContext类进行实例化:

public static void main(String[] args) { 
 ApplicationContext ctx = new
AnnotationConfigApplicationContext(AppConfig.class); 
 MyService myService = ctx.getBean(MyService.class); 
 myService.doStuff();

2.9 Spring bean的生命周期

Spring bean生命周期的源码分析(超级详细)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值