深入Spring源码专题(6)

134 阅读2分钟

这是我参与2022首次更文挑战的第9天,活动详情查看2022首次更文挑战

BeanFactory和Bean

在Spring中,bean用于引用由容器管理的任何组件,bean配置由实现BeanDefinition接口的类的实例表示。Bean配置不仅存储有关Bean本身的信息,还存储有关它所依赖的bean信息。对于任何实现了BeanDefinitionReader接口的BeanFactory实现类来说,都可以通过使用PropertiesBeanDefinitionReader或XmlBeanDefinitionReader从配置文件中读取BeanDefinition数据。PropertiesBeanDefinitionReader从属性文件读取bean定义,而XmlBeanDefinitionReader则从XML文件中读取相关信息。

​ 因此,在BeanFactory中识别自己的Bean,为每个Bean分别一个ID,一个名称或者两者都有。一个Bean也可以在没有任何ID或名称(匿名Bean)情况下被实例化。或者作为另一个Bean的内部Bean被实例化,每个Bean至少有一个名称,但也可以有任意数量的名称(名称用逗号分隔),第一个名称后面的任何名称都认为是同一个Bean的别名。可使用BeanID或名称从BeanFactory检索一个Bean,并简历依赖关系(Bean X依赖于Bean Y)。

BeanFactory实现

//interface
public interface Mysql{
    String defineMeaningOfLife();
}

public class BookwormMysql implements Mysql{
	private Encyclopedia encyclopedia;
     
    public void setEncyclopedia(Encyclopedia encyclopedia){
        this.Encyclopedia=encyclopedia;
    }
    @Override
    public String defineMeaningOfLife(){
        return "encyclopedias";
    }
}

Spring的BeanFactory初始化并获得用于处理的MySQL Bean,代码如下所示

public class XmlConfigWithBeanFactory{
     DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
     XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader();
     reader.loadBeanDefinitions(new ClassPathResource("spring/xml-bean-factory-config.xml"));
    Mysql mysql = factory.getBean("mysql");
    sql.defineMeaningOfLife();
}

使用DefaultListableBeanFactory,它是Spring提供的两个主要BeanFactory实现之一,并且使用XmlBeanDefinitionReader从XML文件读取BeanDefinition信息,一旦创建并配置了BeanFactory实现,就可以通过使用在XML配置文件中配置的名称mysql来检索mysql bean。

<?xml version="1.0" encoding="UTF-8">
<beans xmlns="http://www.springframework.org/shema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="mysql" name="wiseworm" class="com.ozx.BookwormMysql">
</beans>