Spring核心面试必备知识点汇总整理

IOC和DI的含义

Inversion of control 控制反转 不是一种技术,而是一种设计理念。意味着将设计好的对象交给容器起来进行管理和控制,而不是传统的在对象内部进行直接的控制。原来是应用程序本身是老大,需要什么资源都是主动出击,比如new xxx 的方式来获取,有了IOC之后就变成被动的了,被动等待容器来创建并注入其需要的资源对象。

Dependency Injection 依赖注入 组件之间的依赖关系由程序运行时动态决定,由容器动态地将某个依赖关系注入到组件之中,比如某类需要操作数据库的connection对象 有了依赖注入,只需要告诉spring需要connection对象,在程序运行的过程中会在合适的时机动态地将这个connection对象注入到该类中,这就是依赖注入。

 

BeanFactory和ApplicationContext的区别

相同点:

  1. 都是接口 BeanFactory是最底层的接口 ApplicationContext是由BeanFactory派生而来,具备了BeanFactory的所有的功能

区别:

  1. ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,提供的更加丰富的功能:
  • MessageSource 国际化的资源访问
  • 资源访问 比如URL和文件
  • 事件传播
  • 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层  
  1. BeanFactory 采用的是延迟加载,第一次getBean的时候才会初始化Bean
  2. 而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误

 

ApplicationContext的常见实现方式

  • ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
  • ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath*:beans.xml");
  • ServletContext servletContext = request.getSession().getServletContext();      

ApplicationContext ctx  = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);

  • ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);

 

Spring的三种配置方式

  1. 基于xml的配置

使用被spring命名空间所支持的一系列的标签所支持 包括contexts beans jdbc tx aop mvc等

  1. 基于Java的配置

由@Configuration和@Bean注解配合实现 @Bean注解会去实例化、配置和初始化一个对象,将这个对象交给IOC容器来进行管理

@Configuration表示这个类作为bean定义的配置资源

  1. 基于注解的配置

可以用注解的方式来替代XML方式的bean描述,可以将bean描述转移到组件类的内部,只需要在相关类上、方法上或者字段声明上使用注解即可。注解注入将会被容器在XML注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。

注解装配在Spring中是默认关闭的。所以需要在Spring文件中配置一下才能使用基于注解的装配模式。

<context:annotation-config/>

 

Spring Bean的生命周期

  1. 实例化一个bean
  2. 按照spring上下文对实例化的bean进行配置
  3. 如果这个bean实现了BeanNameAware接口 调用setBeanName方法来设置beanName
  4. 如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以)
  5. 如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文
  6. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术
  7. 如果关联了InitializingBean接口 则调用afterPropertiesSet() 方法(ps:调用了BeanPostProcessor.postProcessBeforeInitialization方法之后调用该方法)
  8. 如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法
  9. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法
  10. 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法
  11. 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法

 

Spring Bean的作用域

  • Singleton:在spring的容器中只存在一个bean实例 bean以单例的形式存在
  • Prototype:每次从容器中调用bean时 都会返回一个新的实例 即相当于做new xxxBean的实例化动作
  • Request:每次的Http请求都会去创建一个bean 仅仅用于webApplicationContext环境
  • Session:同一个http session共享一个bean 不同的http session使用不同的bean,仅仅用于webApplicationContext环境
  • GlobalSession;同一个全局session共享bean ,用于porlet仅仅用于WebApplicationContext环境

 

Spring的五种自动装配模式

  • byName模式:在使用byName模式进行自动装配时,Spring会尝试用每个属性去上下文中适配同名的bean,例如有一个TestInject bean,该bean中有一个私有属性 OmsGoodsVo 并且 我们在ApplicationContext中也定义了名为 OmsGoodsVo这个bean,那么在TestInject初始化时OmsGoodsVo这个bean将会被自动分配给TestInject中的OmsGoodsVo属性。
  • byType模式:在使用byType模式进行自动装配时,Spring会尝试在Spring上下文中取寻找相同类型的bean去分配给目标bean的对应属性。
  • 构造函数模式:该模式和byType模式有异曲同工之妙,该模式通过bean的构造器进行注入而不是通过setter ,在该模式下Spring总是会尝试进行构造器最大入参的适配,例如TestInjectbean有两个构造器分别是TestInject1(String,Integer) 和TestInject2(String) 如果在ApplicationContext上下文中同时存在一个String bean和 Integer bean,那么Spring总是会去使用TestInject1去进行注入。
  • 默认模式:Spring 将自动在构造函数模式和byType模式之间进行选择,选择的依据是如果bean存在一个默认的无参数构造函数则使用byType模式进行构造,否则用构造函数模式。
  • 无:不使用任何模式,这是Spring的默认设置

 

@Autowired @Qualifier等注解的区别

  1. AutoWired 自动注入的工作原理 先按照类型去容器中找对应的bean applicationContext.getBean(BookService.class); 如果按照类型找到多个 再将属性的名称作为组件的ID去容器中查询 applicationContext.getBean(bookDao);

AutoWired可以设置required true/false

  1. @Qualifier("personDao") 这个注解和@Autowired一起使用表示按名称进行查找
  2. @Primary 让spring在首选指定也可以继续使用@Qualifier进行明确指定需要装配的bean
  3. @Required注解用于setter方法,表明这个属性是必要的,不可少的,必须注入值
  4. @Resource(JSR250-Java规范的注解)可以和@AutoWire一样实现自动装配的功能 默认是按照组件名称进行装配的 @Resource(name="bookDao2")
  5. @Inject (JSR330-Java规范的注解)需要导入javax.inject的包 但是没有required=false的功能自动装配:

 

FileSystemSource和ClassPathSource的区别

在FileSystemResource 中需要给出spring-config.xml文件在你项目中的相对路径或者绝对路径。在ClassPathResource中spring会在ClassPath中自动搜寻配置文件,所以要把ClassPathResource 文件放在ClassPath下。

如果将spring-config.xml保存在了src文件夹下的话,只需给出配置文件的名称即可,因为src文件夹是默认。

简而言之,ClassPathResource在环境变量中读取配置文件,FileSystemResource在配置文件中读取配置文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章