BeanFactory 是 IoC 底层容器;FactoryBean 是 创建 Bean 的一种方式,帮助实现复杂的初始化逻辑。
看个例子:
User.java
package constxiong;
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}
UserFactoryBean 实现 FactoryBean 接口
package constxiong;
import org.springframework.beans.factory.FactoryBean;
/**
* UserFactoryBean 实现 FactoryBean 接口,用于构造 User 的bean
* @author ConstXiong
*/
public class UserFactoryBean implements FactoryBean<User> {
@Override
public User getObject() throws Exception {
User user = new User();
user.setId(2);
user.setName("customUser");
return user;
}
@Override
public Class<?> getObjectType() {
return User.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
spring 配置文件
<?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="constxiong" class="constxiong.User">
<property name="id" value="1"/>
<property name="name" value="constxiong"/>
</bean>
<bean id="customUser" class="constxiong.UserFactoryBean"></bean>
</beans>
测试代码
package constxiong;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
/**
* 测试 BeanFactory 与 FactoryBean 的区别
* @author ConstXiong
*/
public class Test {
public static void main(String[] args) {
String xmlPath = "META-INF/spring-beanfactory-factorybean.xml";
getBeanByBeanFactory(xmlPath);
}
/**
* 通过 DefaultListableBeanFactory 获取 bean
*/
private static void getBeanByBeanFactory(String xmlPath) {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(beanFactory);
xmlReader.loadBeanDefinitions(xmlPath);
User user = beanFactory.getBean("constxiong", User.class);
System.out.println(user);
user = beanFactory.getBean("customUser", User.class);
System.out.println(user);
// 获取 UserFactoryBean 本身
UserFactoryBean userFactoryBean = beanFactory.getBean("&customUser", UserFactoryBean.class);
System.out.println(userFactoryBean);
}
}
说明:
- BeanFactory 包含 3 个方法 getObject、getObjectType、isSingleton,用于构建复杂的 bean
- 如,MyBatis 与 Spring 集成,使用了 SqlSessionFactoryBean 继承 FactoryBean,用于构建 SqlSessionFactory bean
- 得到 FactoryBean 本身这个 bean,需要在 bean name 前面加上 $
【Java学习资源】整理推荐
- Spring 依赖注入的处理过程与 DependencyDescriptor 的说明
- Spring 各种 Aware 接口回调注入
- Spring Bean 生命周期内的 Exception 复现
- Spring 内建 Bean
- Spring Bean 的别名
- Spring Bean 未指定名称的命名规则
- Bean 何时被 GC
- Spring Bean 延迟加载
- ObjectFactory 与 BeanFactory 的区别
- Bean 销毁的方式与顺序
- Bean 初始化的方式与顺序
- Bean 的实例化方式
- Bean的注册方式
- 什么是 BeanDefinition?
- Spring IoC 容器启动时做了什么?
- BeanFactory 与 FactoryBean 的区别
- BeanFactory 与 ApplicationContext 的区别
- Spring IoC 依赖注入的实现方式
- Spring IoC 依赖注入(支持哪些数据类型?)
- Spring bean 依赖查找
- Spring-IoC
- Spring 的核心特性