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. 解决pycharm py文件运行后停止按钮变成了灰色的问题

  2. Mysql安装(解压版)

    文章首推 刷网课请点击这里 刷二级请点击这里 论文查重请点击这里 WIFI破解详细教程 今日主题:Mysql安装(解压版) 环境 系统:windows10 版本:mysql5.7.29 安装过程 1. ...

  3. Noip 2013 真题练习

    Day1 T1 转圈游戏 Link 一句话题意: 让你求 \({x + m \times 10^k} \bmod n\) 的结果. 直接套上快速幂的板子. code #include<iostr ...

  4. 「Redis」字符串

    原文链接:https://www.changxuan.top/?p=1109 简介 Redis 中自定义的字符串结构. 字符串是 Redis 中最常用的一种数据类型,在 Redis 中专门封装了一个字 ...

  5. mapbox处理中文标注不能换行问题

    mapbox的换行侧率是根据空格进行的,因为中文中没有设置空格,因此换行不起作用. 解决方法:在node_modules\ol-mapbox-style\util.js  60行添加下列代码: let ...

  6. day37 Pyhton 网络编程04

    # tcp协议和udp协议的选择问题 # tcp # 大量的连续的数据 传递文件\发送邮件 # 文件的传递 # 下载电影 # udp # 短消息类 社交软件 # qq 微信 # 在线播放视频 快会丢帧 ...

  7. ES6的7个实用技巧

    Hack #1 交换元素 利用数组解构来实现值的互换 let a = 'world', b = 'hello' [a, b] = [b, a] console.log(a) // -> hell ...

  8. centos初步配置

    设置PS1 编辑sudo vi /etc/profile,PS1的值用于控制主提示符格式,含义如下 参数 描述 /d 代表日期,格式为weekday month date,例如:"Mon A ...

  9. 【C语言编程入门】Do you know 函数?不知道了吧,我来告诉你!

    ☆ 函数 在前面我们已经讲过了一些简单的函数,如程序的主函数main().标准输出函数printf().在C语言中,大多数功能都是依靠函数来实现的.But,你知道什么是函数吗?我猜你肯定不知道. 那么 ...

  10. spring boot:使用分布式事务seata(druid 1.1.23 / seata 1.3.0 / mybatis / spring boot 2.3.2)

    一,什么是seata? Seata:Simpe Extensible Autonomous Transcaction Architecture, 是阿里中间件开源的分布式事务解决方案. 前身是阿里的F ...