定义 Bean 工厂接口
方法 getBean(String Name)
定义 Bean 实例信息
单例 Bean 注册表
方法 getSingleton(String beanName)
通用的注册表实现
属性
singletonObjects: Map
实现方法
getSingleton(String beanName)
自己的方法
addSingleton(String beanName, Object singletonObject)
实现BeanFactory 继承DefaultSingletonBeanRegistry
抽象的 Bean 工厂基类,定义模板方法
实现方法
getBean 实现BeanFactory的方法
自己的抽象方法
getBeanDefinition(String beanName)
createBean(String beanName, BeanDefinition beanDefinition)
继承AbstractBeanFactory
实现默认bean创建的抽象bean工厂超类
重写的方法
createBean(String beanName, BeanDefinition beanDefinition)
Bean 定义注册接口
方法
registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
继承AbstractAutowireCapableBeanFactory实现BeanDefinitionRegistry
默认的Bean工厂实现类
属性
beanDefinitionMap : Map
实现方法
registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
重写方法
getBeanDefinition(String beanName)
Bean对象的定义
BeanDefinition定义 Bean 实例信息
public class BeanDefinition {
private Class beanClass;
public BeanDefinition(Class beanClass) {
this.beanClass = beanClass;
}
public Class getBeanClass() {
return beanClass;
}
public void setBeanClass(Class beanClass) {
this.beanClass = beanClass;
}
}
基于工厂模式,我们先创建出BeanFactory接口,getBean()方法用于获取实例化Bean
BeanFactory
public interface BeanFactory {
/**
* 返回 Bean 的实例对象
* @param name 要检索的bean的名称
* @return 实例化的 Bean 对象
* @throws BeansException 不能获取 Bean 对象,则抛出异常
*/
Object getBean(String name) throws BeansException;
}
因为要实现单例模式
创建一个单例 Bean 注册表SingletonBeanRegistry接口
public interface SingletonBeanRegistry {
/**
* 返回在给定名称下注册的(原始)单例对象。
* @param beanName 要查找的bean的名称
* @return 返回注册的单例对象
*/
Object getSingleton(String beanName);
/**
* 注册单利对象
* @param beanName Bean 对象名称
* @param singletonObject Bean 对象
*/
void registerSingleton(String beanName, Object singletonObject);
}
创建DefaultSingletonBeanRegistry实现单例注册表接口,实现接口中的方法。
继承该类实现单例模式,singletonObjects中缓存实例化好的对象,getSingleton可直接获取该对象
public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {
private Map<String, Object> singletonObjects = new HashMap<>();
@Override
public Object getSingleton(String beanName) {
return singletonObjects.get(beanName);
}
@Override
public void registerSingleton(String beanName, Object singletonObject) {
singletonObjects.put(beanName, singletonObject);
}
}
创建AbstractBeanFactory抽象类,抽象的 Bean 工厂基类,定义模板方法,采用职责分离的结构设计
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {
@Override
public Object getBean(String name) throws BeansException {
Object bean = getSingleton(name);
if (bean != null) {
return bean;
}
BeanDefinition beanDefinition = getBeanDefinition(name);
return createBean(name, beanDefinition);
}
protected abstract BeanDefinition getBeanDefinition(String beanName);
protected abstract Object createBean(String beanName, BeanDefinition beanDefinition);
}
细分功能职责AbstractAutowireCapableBeanFactory抽象类继承AbstractBeanFactory实现创建对象具体功能
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory{
@Override
protected Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException {
Object bean = null;
try {
bean = beanDefinition.getBeanClass().newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new BeansException("Instantiation of bean failed", e);
}
registerSingleton(beanName, bean);
return bean;
}
}
BeanDefinitionRegistry 为Bean 定义注册接口
public interface BeanDefinitionRegistry {
/**
* 向注册表中注册 BeanDefinition
*
* @param beanName Bean 名称
* @param beanDefinition Bean 定义
*/
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition);
}
核心类DefaultListableBeanFactory默认的Bean工厂实现类
继承AbstractAutowireCapableBeanFactory 具体实现了该抽象类中的getBeanDefinition方法
实现BeanDefinitionRegistry 接口中的registerBeanDefinition方法
beanDefinitionMap中缓存bean的定义
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry {
private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();
@Override
protected BeanDefinition getBeanDefinition(String beanName) {
BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);
if (beanDefinition == null) throw new BeansException("No bean named '" + beanName + "' is defined");
return beanDefinition;
}
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
beanDefinitionMap.put(beanName, beanDefinition);
}
}
BeansException定义 Bean 异常
public class BeansException extends RuntimeException{
public BeansException(String msg) {
super(msg);
}
public BeansException(String msg, Throwable cause) {
super(msg, cause);
}
}
各个类各司其责,接下来模拟测试
模拟用户 Bean 对象
public class UserService {
public void queryUserInfo() {
System.out.println("查询用户信息");
}
}
测试类
public class ApiTest {
@Test
public void test_BeanFactory(){
// 1.初始化 BeanFactory
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
// 2.注册 bean
BeanDefinition beanDefinition = new BeanDefinition(UserService.class);
beanFactory.registerBeanDefinition("userService", beanDefinition);
// 3.第一次获取 bean
UserService userService = (UserService) beanFactory.getBean("userService");
userService.queryUserInfo();
// 4.第二次获取 bean from Singleton
UserService userService_singleton = (UserService) beanFactory.getBean("userService");
userService_singleton.queryUserInfo();
}
}