Author:赵志乾
Date:2019-01-27
Declaration:All Right Reserved!!!
1、BeanFactory
Spring依赖注入容器的核心是BeanFactory接口,其负责Bean的创建、管理、维护和销毁,即负责Bean的依赖项管理和生命周期管理。如果应用程序只需要使用依赖注入,则可以借用BeanFactory接口来与Spring的依赖注入容器进行交互。此时,我们需要先创建BeanFactory实现类的一个实例,并使用bean信息和依赖信息对其进行配置。之后,便可通过BeanFactory接口访问由Spring依赖注入容器所管理的Bean。
2、使用BeanFactory前置条件
上面我们提到使用Spring依赖注入容器管理Bean的前置操作包括:实例化BeanFactory接口的实现类以及对该实例进行配置。对于实例化BeanFactory接口的实现类而言,有两种方式:其一是手工编写实例化代码,其二是借助于外部(容器)工具自动实例化,比如,在Web应用程序中,Web容器会在应用程序的启动期间通过web.xml文件中指定的ContextLoaderListener类来完成Spring的ApplicationContext(其为BeanFactory的扩展)实现类的实例化和初始化操作。
BeanFactory的配置虽然可以通过编码的方式来实现,但实际项目中更倾向于通过配置文件将配置信息外部化。这些外部化的配置信息主要包括Bean信息和依赖项信息,其可以使用Properties文件或xml文件来指定,我们更倾向于使用xml文件。对于使用xml作为配置文件的项目而言,需要使用XmlBeanDefininationReader进行配置信息的读入。Bean的配置信息进入内存后,使用BeanDefinition接口的实现类实例进行表征,其会包含bean本身的信息以及其依赖项信息。
3、Bean在依赖注入容器中的标识
为了在Spring的依赖注入容器中标识一个Bean,需要给Bean指定一个ID和名称,如果没有指定,容器会依据一定规则自动生成。之后,可用bean ID或bean名称通过BeanFactory接口从Spring依赖注入容器中检索出已经装配好的Bean。
4、BeanFactory示例:
项目目录结构:
POM文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hello</groupId>
<artifactId>hello</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
</dependencies>
</project>
xml-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helloWorld" name="myHelloWorld" class="com.spring.di.HelloWorldImpl"/>
</beans>
HelloWorld.java
package com.spring.di;
public interface HelloWorld {
String sayHello();
}
HelloWorldImpl.java
package com.spring.di;
public class HelloWorldImpl implements HelloWorld {
public String sayHello() {
return "hello!";
}
}
XmlConfigBeanFactory.java
package com.spring.di;
import org.springframework.beans.factory.support.BeanDefinitionReader;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.ClassPathResource;
public class XmlConfigBeanFactory {
public static void main(String[] args){
// 实例化BeanFactory的实现类
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
// 将BeanFactory关联到Bean定义读取器
BeanDefinitionReader rdr = new XmlBeanDefinitionReader(bf);
// 加载Bean配置信息
rdr.loadBeanDefinitions(new ClassPathResource("xml-config.xml"));
// 用BeanId通过BeanFactory从Spring的DI容器中获取已经装配好的Bean
HelloWorld helloWorld = (HelloWorld) bf.getBean("helloWorld");
// 使用获取到的Bean
System.out.println(helloWorld.sayHello());
}
}
输出结果:
hello!
Process finished with exit code 0
参考资料:《Spring5 高级编程》