Spring IoC 学习(2)

简介: 知道了IoC的好处和优势之后,本来应该有的一步是,搞清楚怎么用。因为前面我写的顺序是:是什么,为什么?下一个part肯定的就是怎么办或者怎么用?但是,按照Spring的官方的Guide,我觉得应该大家是可以写个Hello World。

前言

知道了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<String, BeanDefinition> beanDefinitionMap 
                                    = new ConcurrentHashMap<String, BeanDefinition>(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,然后经过一系列的逻辑判断之后,装进去。后面如果要拿出来,想着应该也是用相应的方法拿出来。

不信你看

@Override
public 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

以下代码说明应用

<bean class ="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<property name="properties">
<map>
    <!-- 不管原来的sex是什么,最后就是male -->
    <entry key="testBean.sex" value="male"/>
</map>
</property>

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

③ CustomEditorConfigurer

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

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

beans.xml

<!-- 实例化直接是个String,人家怎么知道你是不是Date,怎么知道怎么转换 -->
<bean id="person" class="Person">  
      <property name="birthday">  
         <value>2017-08-29</value>  
    </property>  
</bean>  
<!-- 定义属性编辑器 -->        
<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">  
    <property name="customEditors">  
        <map>  
            <entry key="java.util.Date">  
                <bean class="UtilDatePropertyEditor">  
                    <property name="format" value="yyyy-MM-dd"/>  
                </bean>  
            </entry>  
        </map>  
    </property>  
</bean> 

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

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

目录
相关文章
|
8月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
1024 26
|
8月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
监控 Java 应用服务中间件
微服务——SpringBoot使用归纳——为什么学习Spring Boot
本文主要探讨为什么学习Spring Boot。从Spring官方定位来看,Spring Boot旨在快速启动和运行项目,简化配置与编码。其优点包括:1) 良好的基因,继承了Spring框架的优点;2) 简化编码,通过starter依赖减少手动配置;3) 简化配置,采用Java Config方式替代繁琐的XML配置;4) 简化部署,内嵌Tomcat支持一键式启动;5) 简化监控,提供运行期性能参数获取功能。此外,从未来发展趋势看,微服务架构逐渐成为主流,而Spring Boot作为官方推荐技术,与Spring Cloud配合使用,将成为未来发展的重要方向。
564 0
微服务——SpringBoot使用归纳——为什么学习Spring Boot
|
12月前
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
285 1
|
12月前
|
安全 Java 数据库
Spring Boot 框架深入学习示例教程详解
本教程深入讲解Spring Boot框架,先介绍其基础概念与优势,如自动配置、独立运行等。通过搭建项目、配置数据库等步骤展示技术方案,并结合RESTful API开发实例帮助学习。内容涵盖环境搭建、核心组件应用(Spring MVC、Spring Data JPA、Spring Security)及示例项目——在线书店系统,助你掌握Spring Boot开发全流程。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
1970 3
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
363 18
|
Java Spring
Spring框架的学习与应用
总的来说,Spring框架是Java开发中的一把强大的工具。通过理解其核心概念,通过实践来学习和掌握,你可以充分利用Spring框架的强大功能,提高你的开发效率和代码质量。
316 20
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
354 69
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?

热门文章

最新文章