文章目录
目标
- 目标
- 设计
- 简易实现
springbean容器的目标是用于定义 存放 和获取bean
设计使用map来存放bean . map的key为 bean的名称, value为 bean的定义信息
- bean的定义: BeanDefinition . 用于获取这个bean的一些属性信息. 例如下图截取spring源码中, 部分的方法, 获取该bean是否是抽象的, 是否是单例的, 是否是原型的, 是否是懒加载的, 并且提供了一些set和get方法来设置bean 的属性和获取bean 的属性. 在此节中, 只实现getBean方法.
- bean的注册, 把bean放入hashmap中, map的value为存放了bean的定义信息. 在spring的源码中, BeanFactory 并没有提供注册bean的方法.提供了获取bean的方法.
但在BeanFactory的子类DefaultListableBeanFactory中, 有注册bean的方法
- bean的获取 : 在map中, 通过bean的名称, 获取bean的定义信息. 同样在DefaultListableBeanFactory类中, 可以看到获取BeanDefinition的方法.
Bean的注册信息也是用一个map存储
uml图 BeanDefinition
public class BeanDefinition {
private Object bean;
public BeanDefinition(Object bean) {
this.bean = bean;
}
public Object getBean() {
return bean;
}
}
BeanFactory
public class BeanFactory {
private Map beanDefinitionMap = new ConcurrentHashMap();
public Object getBean(String name) {
return beanDefinitionMap.get(name).getBean();
}
// 注册bean
public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
beanDefinitionMap.put(name, beanDefinition);
}
}
模拟业务类
public class UserService {
public void queryUserInfo() {
System.out.println("查询用户信息");
}
}
测试类
public class ApiTest {
@Test
public void test_BeanFactory() {
// 1. 初始化BeanFactory
BeanFactory beanFactory = new BeanFactory();
//2 . 注入bean
BeanDefinition beanDefinition = new BeanDefinition(new UserService());
beanFactory.registerBeanDefinition("userService", beanDefinition);
//3 . 获取bean
UserService userService = (UserService) beanFactory.getBean("userService");
userService.queryUserInfo();
}
}
运行结果如下