Spring基础特性总结一--核心组件Bean的使用

本文详细介绍了Spring框架的核心组件Bean,包括Bean的定义、创建、解析以及使用。讲解了BeanDefinition接口,Bean的创建涉及BeanFactory,特别是DefaultListableBeanFactory。还探讨了依赖注入的三种方式:set方法、构造器和接口注入。最后,讨论了复杂Bean配置中的Bean关系、集合类型属性赋值以及Bean的获取方法。
摘要由CSDN通过智能技术生成

文章内容

0.Spring整体特性
1.Bean组件的介绍
2.Bean的定义、创建、解析
3.Bean的使用

0.Spring整体特性

这里写图片描述

Spring的整体架构可划分为两部分:核心组件和特性功能;
其中核心组件功能包括Core、Bean、Context,Core在Spring框架中用于提供基础操作的工具组件;Bean则用于封装Object来进行一系列操作和管理;Context是一个Bean关系的集合,也叫Ioc容器;

特性功能包括AOP、JDBC、Transaction等,主要是基于Spring三大核心组件之上实现的机制;

1.Bean组件的介绍

Bean作为Spring框架中最重要的组件,正是由于Bean的定义和实现才使得Spring可以实现Bean的自动创建和注入,简化了日常开发过程中对依赖关系的维护,都交由Spring来完成;

Bean是对Object的封装,使得Object的创建、销毁、具体操作都可以通过统一的接口来完成;

2.Bean的定义、创建、解析

2.1.Bean的定义

这里写图片描述

定义接口:org.springframework.beans.factory.config.BeanDefinition

这里写图片描述

从接口包含的方法可以看出,Bean封装了Object的类名、依赖、构造函数以及相关的配置信息(模式和作用域等);

2.2.Bean的创建

Spring Bean 的创建时典型的工厂模式,顶级接口是BeanFactory;
非顶级的BeanFactory,如ListableBeanFactory、HierarchicalBeanFactory、AutowireCapableBeanFactory;
这里写图片描述

需要说明的是,这些非顶级的接口定义了新生成的Bean的不同方便的特性;例如,如果这个Bean是由实现了ListableBeanFactory接口的BeanFactory生成的,那么他是可列表的,如果这个BeanFactory还实现了AutowireCapableBeanFactory,那么这个Bean将有自己的装配规则;而在默认情况下,BeanFactory的最终实现类为DefaultListableBeanFactory,而它实现了所有接口,所以通过默认的BeanFactory产生的Bean具有Bean的几乎所有特性

默认BeanFactory实现:org.springframework.beans.factory.support.DefaultListableBeanFactory

这里写图片描述

分析其中通过类类型获取Bean的方法:
(Assert是一个可以借鉴的设计,文章最后介绍)

public <T> T getBean(Class<T> requiredType) throws BeansException {
    //字段验证
    Assert.notNull(requiredType, "Required type must not be null");
    //获取Bean的名称
    String[] beanNames = getBeanNamesForType(requiredType);
    if (beanNames.length > 1) {
        ArrayList<String> autowireCandidates = new ArrayList<String>();
        for (String beanName : beanNames) {
            if (getBeanDefinition(beanName).isAutowireCandidate()) {
                autowireCandidates.add(beanName);
            }
        }
        if (autowireCandidates.size() > 0) {
            beanNames = autowireCandidates.toArray(new String[autowireCandidates.size()]);
        }
    }
    if (beanNames.length == 1) {
        return getBean(beanNames[0], requiredType);
    }
    else if (beanNames.length == 0 && getParentBeanFactory() != null) {
        return getParentBeanFactory().getBean(requiredType);
    }
    else {
        throw new NoSuchBeanDefinitionException(requiredType, "expected single bean but found " +
                beanNames.length + ": " + StringUtils.arrayToCommaDelimitedString(beanNames));
    }
}


//逐层向上分析
//AbstractBeanFactory::---->getBean()--->doGetBean()--->getSingleton()--->默认Singleton模式,通过返回的实例是否为null判断是否获取Prototype实
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值