Spring知识总览

1.1 IOC

IOC是控制反转,是一种思想

DI是依赖注入,是控制翻转的一种实现

Spring的IOC容器是用来存放对象(bean)的,Spring传统的xml配置方式,容器的大致加载过程为:

  • 1、加载xml配置文件

  • 2、解析xml文件(BeanDefinitionReder接口的xml解析的实现类)

  • 3、封装BeanDefinition(对xml或者其他配置文件进行解析,拿到bean的组成信息,例如名称,方法,属性等)

  • 4、实例化配置文件中注册的bean(通过反射,通过bean定义的scop属性值例如singleton-默认方式单例,rototype,request,session,确定bean的存在方式,但是Spring中并不是直接实例化,而是通过第5点的Bean工程来管理,从而达到可扩展的目的,保证可扩展,Spring做了很多工作,这部分比较重要)

  • 5、bean存在容器中(通过反射。BeanFactory是容器根接口,AbtsratAutowireCapableBeanFactory继承自BeanFactory,DafaultListableBeanFactory继承自AbstratAutowireCapableBeanFactory。这三个类在Spring中大量出现和使用)

从反射到bean容器,为了保证扩展性,需要做很多增强处理,增强处理的接口是BeanFactoryPostProcessor和BeanPostProcessor,这两个接口有大量的实现。PostProcessor命名常被称作增强器。可以理解为BeanPostProcessor是为了对bean信息进行增强和修改,BeanFactoryPostProcessor是对beanDefibition进行增强和修改。BeanPostProcessor有两个方法,一个前置处理方法,一个后置处理方法

例如PlaceholderConfigurerSupport的父类PropertyResourceConfigurer实现了BeanFactoryPostProcessor。那么PlaceholderConfigurerSupport可以动态修改bean的定义信息

(1)面试题:能详细描述下bean的生命周期么?(重要)

BeanFactor接口定义了Bean生命周期先后顺序,解释如下:

 * <p>Bean factory implementations should support the standard bean lifecycle interfaces
* as far as possible. The full set of initialization methods and their standard order is:
* <ol>
* <li>BeanNameAware's {@code setBeanName}
* <li>BeanClassLoaderAware's {@code setBeanClassLoader}
* <li>BeanFactoryAware's {@code setBeanFactory}
* <li>EnvironmentAware's {@code setEnvironment}
* <li>EmbeddedValueResolverAware's {@code setEmbeddedValueResolver}
* <li>ResourceLoaderAware's {@code setResourceLoader}
* (only applicable when running in an application context)
* <li>ApplicationEventPublisherAware's {@code setApplicationEventPublisher}
* (only applicable when running in an application context)
* <li>MessageSourceAware's {@code setMessageSource}
* (only applicable when running in an application context)
* <li>ApplicationContextAware's {@code setApplicationContext}
* (only applicable when running in an application context)
* <li>ServletContextAware's {@code setServletContext}
* (only applicable when running in a web application context)
* <li>{@code postProcessBeforeInitialization} methods of BeanPostProcessors
* <li>InitializingBean's {@code afterPropertiesSet}
* <li>a custom init-method definition
* <li>{@code postProcessAfterInitialization} methods of BeanPostProcessors
* </ol>

(2)面试题:Aware接口到底有什么作用?

通过一种回调的方式,可以拿到Spring的各种组件。比如我创建的A对象,原来只能拿到A对象拿到A对象相应的信息,但是我想通过A对象,拿到Spring容器的其他各种对象,那么可以借助这个借口实现。

Aware借口介绍如下,Aere有很多实现类和实现接口。

package org.springframework.beans.factory;

/**
* A marker superinterface indicating that a bean is eligible to be notified by the
* Spring container of a particular framework object through a callback-style method.
* The actual method signature is determined by individual subinterfaces but should
* typically consist of just one void-returning method that accepts a single argument.
*
* <p>Note that merely implementing {@link Aware} provides no default functionality.
* Rather, processing must be done explicitly, for example in a
* {@link org.springframework.beans.factory.config.BeanPostProcessor}.
* Refer to {@link org.springframework.context.support.ApplicationContextAwareProcessor}
* for an example of processing specific {@code *Aware} interface callbacks.
*
* @author Chris Beams
* @author Juergen Hoeller
* @since 3.1
*/
public interface Aware { }

例如我们想通过我们创建的A对象拿到beanName。那么我们可以在A的实体类上实现BeanAware接口,实现接口方法,在我们实例化A对象后,我们可以通过A实例,拿到beanNanem

import org.springframework.beans.factory.BeanNameAware;

public class A implements BeanNameAware {

    private String beanName;

    @Override
public void setBeanName(String name) {
this.beanName = name;
} public String getBeanName() {
return beanName;
} }
  • 6、我们可以通过容器的对象get我们想要的bean

容器底层是用map结构来支持的,所以我们可以通过容器get出我们想要的对象bean。Spring中大致存在(String,Object),(Class, Object),(String, ObjectFactory),(String,BeanDefinition)几种类型的map

(3)面试题:Spring内置对象和Spring普通对象有什么区别?

内置对象是Spring提前初始化的,是容器需要的对象,比如beanFactory等,并不是我们通过配置文件注册的bean。Spring普通对象是我们通过xml或者配置类注册进Spring容器的我们需要的对象。

(4)面试题:BeanFactory和FactorBean的区别?

  • 都是用来创建对象的
  • 当使用BeanFactory创建对象时,必须遵循完整的创建过程,这个过程是由Spring来管理控制的
  • 而使用FactoryBean来创建bean,只需要调用getObject就可以返回具体对象。整个对象的创建过程是由用户自己来控制的,更加灵活。不主动调用getObject,该对象并未提前创建。不遵循Bean的生命周期
import com.dtsre.dashboard.Student;
import org.springframework.beans.factory.FactoryBean; public class StudentFactoryBeanTest implements FactoryBean<Student> {
@Override
public Student getObject() throws Exception {
return new Student();
} @Override
public Class<?> getObjectType() {
return Student.class;
}
}

把该FactoryBean的实例StudentFactoryBeanTest注册到Spring容器中,之后通过拿到容器context,拿到StudentFactoryBeanTest(getBean(StudentFactoryBeanTest)),只有geeBean操作后,Student对象才会被创建

1.2 Spring中重要接口概览

Spring源码知识概览的更多相关文章

  1. Spring源码知识

    bean的生命周期: 实例化:在堆空间中申请内存,使用反射来实现:(createBeanInstance) 自定义属性赋值(setter).容器对象属性赋值(invokeAwareMethods) 前 ...

  2. spring源码概览

    阅读spring源码需要具备的基本技能: 1,设计模式(工厂模式,单例模式,代理模式,模板模式,观察者模式,装饰器模式,适配器模式) 2,数据结构和算法(栈,队列,树以及一些基本的算法) 3,反射(如 ...

  3. 【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  4. 【Spring源码分析】Bean加载流程概览(转)

    转载自:https://www.cnblogs.com/xrq730/p/6285358.html 代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. ...

  5. Spring源码分析:Bean加载流程概览及配置文件读取

    很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...

  6. Spring源码分析(十九)容器的功能扩展概览

    摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 经过前面几章的分析,相信大家已经对 Spring 中的容器功能有了简单 ...

  7. 【spring源码系列】之【xml解析】

    1. 读源码的方法 java程序员都知道读源码的重要性,尤其是spring的源码,代码设计不仅优雅,而且功能越来越强大,几乎可以与很多开源框架整合,让应用更易于专注业务领域开发.但是能把spring的 ...

  8. spring源码分析之spring-core总结篇

    1.spring-core概览 spring-core是spring框架的基石,它为spring框架提供了基础的支持. spring-core从源码上看,分为6个package,分别是asm,cgli ...

  9. Spring源码情操陶冶-AnnotationConfigBeanDefinitionParser注解配置解析器

    本文承接前文Spring源码情操陶冶-自定义节点的解析,分析spring中的context:annotation-config节点如何被解析 源码概览 对BeanDefinitionParser接口的 ...

随机推荐

  1. mybatis里的mapper,@Mapper参数,Mapper.xml文件 sql语句Select+where语句

    提示:有不清楚的可以试着看一下我最后的连接,是跟这些内容相关的 Mapper文件,特殊符号: 转义符号 原符号 中文意思 &It; < 小于号 > > 大于号 & & ...

  2. Go map相关

    map Go语言中的map是一种无序的,基于key-value的数据解构,在Go语言中map是引用类型,因此必须初始化后才能使用. 以下示例将展示如何声明一个map类型,以及如何简单使用. 需要注意的 ...

  3. Python练习题 021:递归方法求阶乘

    [Python练习题 021] 利用递归方法求5!. ---------------------------------------------- 首先得弄清楚:5! 指的是"5的阶乘&qu ...

  4. sipp3.6对freeswitch进行压力测试

    一.安装sipp 1.下载地址: https://github-production-release-asset-2e65be.s3.amazonaws.com/13161657/99df6100-9 ...

  5. 用< 100行代码向EPUB或Web服务器添加视频回放

    下载source - 32.3 KB 下载latest version from GituHub 介绍 在我 在关于CodeProject的前一篇文章中,我展示了一个简单的EPUB查看器 Androi ...

  6. TP5上传图片到七牛云,并且删除七牛云的图片

    一,通过composer 下载七牛云 sdk composer require qiniu/php-sdk 二,手动下载七牛云sdk 1,https://developer.qiniu.com/kod ...

  7. 54.Qt-将界面程序封装成动态库DLL

    1.生成dll 然后选择创建共享库: 创建好后,修改pro文件,改为下面两句(这样就可以创建界面了):  然后修改sharedlib.h: #ifndef SHAREDLIB_H #define SH ...

  8. LR Optimization-Based Estimator Design for Vision-Aided Inertial Navigation

    Abstract 我们设计了一个 hybrid 估计器, 组合了两种算法, sliding-window EKF 和 EKF-SLAM. 我们的结果表示, hybrid算法比单一的好. 1. Intr ...

  9. python 使用pyinstaller打包程序

    使用pyinstaller 打包.py脚本,在其他计算机可以直接运行,不需要python环境 安装pyinstaller库 pip install pystaller 打包程序 pyinstaller ...

  10. selenium环境配置学习笔记

    一 为什么进行自动化测试 缩短测试周期 避免人为出错 测试信息存储 轻易获取覆盖率 二 web/ui自动化条件和适用范围 手工测试已经完成,后期在不影响进度的前提下逐渐实现自动化 项目周期长,重复性工 ...