博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring IoC 学习(2)
阅读量:6963 次
发布时间:2019-06-27

本文共 3714 字,大约阅读时间需要 12 分钟。

前言

知道了IoC的好处和优势之后,本来应该有的一步是,搞清楚怎么用。因为前面我写的顺序是:是什么,为什么?下一个part肯定的就是怎么办或者怎么用?但是,按照Spring的官方的Guide,我觉得应该大家是可以写个Hello World。网上这类的教程也很多,加上其实我这次学习Spring是想更加深入的学习,因此,重点就不放在这个部分了。主要放在学习背后的故事。

这小节的内容就是学习IoC的容器。

两种容器

概述

整个IoC容器可以分为两个阶段,容器启动阶段和实例化阶段。

image.png | center | 390x261

容器启动阶段

①就是把xml文件里面的配置信息弄到BeanDefinition中。那就必须来看一下BeanDefinition

private volatile Object beanClass;private String scope;private boolean abstractFlag;private boolean lazyInit;private int autowireMode;private int dependencyCheck;private String[] dependsOn;...

这个里面的东西也是相当的多,但是总的来说就是记录一些bean的信息,方便与后面的实例化。

② 读完配置文件之后,是得到了很多BeanDefinition。然后通过BeanDefinitionRegistry将这些bean注册到beanFactory中。下面看一看具体的实现类DefaultListableBeanFactory里面是如何注册的。

/** Map of bean definition objects, keyed by bean name */    private final Map
beanDefinitionMap = new ConcurrentHashMap
(64);//... codes ...//---------------------------------------------------------------------// Implementation of BeanDefinitionRegistry interface//---------------------------------------------------------------------public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException {// ...codes... this.beanDefinitionMap.put(beanName, beanDefinition);// ...codes...

上面的代码虽然省略了很多很多的逻辑,但是实际重要的部分是我体现的那部分,首先,DefaultListableBeanFactory中先是new了一个final的ConcurrentHashMap,用来装BeanDefinition,然后经过一系列的逻辑判断之后,装进去。后面如果要拿出来,想着应该也是用相应的方法拿出来。

不信你看

@Overridepublic BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {    BeanDefinition bd = this.beanDefinitionMap.get(beanName);    if (bd == null) {        if (this.logger.isTraceEnabled()) {            this.logger.trace("No bean named '" + beanName + "' found in " + this);        }        throw new NoSuchBeanDefinitionException(beanName);    }    return bd;}

到了这一步,按理,我们的第一步,即容器启动阶段就结束了。然而

image.png | center | 180x216

Spring还给我们提供了接口,干什么呢?如果你想搞些事情呢?那我不能让你搞,岂不是很不好。开源框架嘛,拓展性非常重要。

接口--BeanFactoryPostProcessor就是做这个工作的,其中有几个Spring自带的,挺有用的BeanFactoryPostProcessor。

① PropertyPlaceHolderConfigurer

diagram.svg | center | 952x400

从这个类图上就可以看到,PropertyPlaceholderConfigurer间接实现了BeanFactoryPostprocessor。是Spring自带的搞事情实现类。

【主要功能】

为什么叫PropertyPlaceHolderConfigurer,PlaceHolder就叫做占位符,所以这个Configurer主要的功能特点,就是占位符相关的。例如,以下我们这种常见的应用。

image.png | left | 265x172

很常见吧,我们不直接写值,而是写占位符,然后在其他地方我们再去写值。当然,要用它,必须要把它加上

image.png | center | 651x200

② PropertyOverrideConfigurer

diagram啊啊.svg | center | 671x318

以下代码说明应用

可以用来覆盖原来初始化的值。不过其实我有一个问题,为什么要多此一举。要不就是只有一种可能,那个配置文件,我们没法改,那我们就在这个地方做一个修改。这么想想的话,还是有些作用的。

③ CustomEditorConfigurer

这家伙的中文名叫自定义属性编辑器,又一个中文字面全看懂,不知道干啥用的典例。

image.png | center | 166x220

Class Person{    Date birthday;    // setter getter 等默认有【懒】}

beans.xml

2017-08-29

自己定义的日期类型编辑器

import java.beans.PropertyEditorSupport;  import java.text.ParseException;  import java.text.SimpleDateFormat;  import java.util.Date;    /**  * java.util.Date属性编辑器   * @author Administrator  *  */  public class UtilDatePropertyEditor extends PropertyEditorSupport {        private String format="yyyy-MM-dd";            @Override      public void setAsText(String text) throws IllegalArgumentException {          SimpleDateFormat sdf = new SimpleDateFormat(format);          try {              Date d = sdf.parse(text);              this.setValue(d);          } catch (ParseException e) {              e.printStackTrace();          }      }        public void setFormat(String format) {          this.format = format;      }    }

Bean实例化阶段

本来是要把Bean实例化阶段也写完的,但是鉴于现在为止,整个的篇幅已经比较长,再写下去,怕是有人要烦了。【我才不会说是我累了】

image.png | center | 255x255

转载地址:http://oizsl.baihongyu.com/

你可能感兴趣的文章
PHP发送HEAD方法请求
查看>>
OracleHelper[.Net 连接Oracle数据库的封装类]
查看>>
.net微信公众号开发——消息与事件
查看>>
动态网站维护基本命令
查看>>
透视表提取不反复记录(2)-每一个物品的全部分类
查看>>
基于jQuery/CSS3实现拼图效果的相册插件
查看>>
【问题解决】小数点前面不显示0的问题
查看>>
ios学习笔记(二)第一个应用程序--Hello World
查看>>
Maven学习总结(四)——Maven核心概念——转载
查看>>
怎么用CIFilter给图片加上各种各样的滤镜_2
查看>>
android:关于主工程和library project
查看>>
CodeForces 2A Winner
查看>>
Window环境配置Mongodb
查看>>
制作和unity调用动态链接库dll文件
查看>>
exsi6.0远程修改密码
查看>>
Header和Cookie相关内容
查看>>
20个可能你不知道Linux网路工具
查看>>
Android 关于listView 显示不全的问题
查看>>
构造函数创建私有变量(防继承)
查看>>
scrum 开发方式学习笔记
查看>>