Spring核心组件之Bean

Spring核心组件之Bean


Bean的类层次结构

Bean的顶层接口是BeanFactory,在源码的位置是

/spring-framework/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java

Bean的类层次结构
DefaultListableBeanFactory实现了所有的接口。但是为什么需要定义这么多的接口?为了区分在spring的内部对象的传递和转化过程中,对对象的数据访问所做的限制。ListableBeanFactory表示这些bean是可列表的,HierarchicalBeanFactory表示这些bean是有继承关系的,AutowireCapableBeanFactory定义这些bean的自动装配规则。

Bean的定义类层次

核心是RootBeanDefinition,在源码的位置是

/spring-framework/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java

Bean的定义类层次

当spring成功的解析了一个

<bean></bean>

中定义的节点后,在spring的内部被转化成BeanDefinition对象。以后所有的操作都是基于这个对象的

Bean的解析过程

Bean的解析过程

Bean的解析主要是对spring的配置文件的解析。

Bean的地位

Bean在spring中的作用就像OOP对于java的作用,没有bean就没有spring存在的意义。

spring解决了一个重要的问题,把对象之间的依赖关系转用配置文件来管理,也就是依赖注入机制。依赖注入在spring的IOC容器中进行管理,而IOC容器的主要操作对象就是bean。

源代码

下面是BeanFactory的源码,在BeanFactory里只对IOC容器的基本行为作了定义,至于如何产生具体的bean,由BeanFactory的实现类具体来实现。

public interface BeanFactory {

    /**
     * 这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,  如果需要得到工厂本身,需要转义
     */
    String FACTORY_BEAN_PREFIX = "&";

    //这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就是一个大的抽象工厂。
    Object getBean(String name) throws BeansException;

    //这里根据bean的名字和Class类型来得到bean实例,如果根据名字取得的bean实例的Class类型和需要的不同的话,它会抛出异常
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    Object getBean(String name, Object... args) throws BeansException;

    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

    //这里提供对bean的检索,看看是否在IOC容器有这个名字的bean
    boolean containsBean(String name);

     //这里根据bean名字得到bean实例,并同时判断这个bean是不是单例
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

    //判断给定名字的bean是不是Prototype
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

    //判断给定名字的bean是否与给定的类型相匹配
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

    //这里对得到bean实例的Class类型  
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;

    //这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来 
    String[] getAliases(String name);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值