之前虽然也手写过spring,不过是写的非常非常基础的版本
这个系列主要是一个学习笔记,最近在看小博哥的渐进式手写Spring
Spring也反反复复学过好几遍了,书籍、视频、源码对主脉络其实很熟悉了,但是对Spring的理解,总感觉差临门一脚,希望通过这次的学习能对Spring有个更加清晰的认识
手写一个非常基础的Bean容器、可以用于定义、存放、获取bean,方便后续持续扩展
定义Bean:BeanDefinition,是你在查阅 Spring 源码时经常看到的一个类,例如它会包括 singleton、prototype、BeanClassName 等。但目前我们初步实现会更加简单的处理,只定义一个 Object 类型用于存放对象。
注册Bean:这个过程就相当于我们把数据存放到 HashMap 中,只不过现在 HashMap 存放的是定义了的 Bean 的对象信息。
获取Bean:最后就是获取对象,Bean 的名字就是key,Spring 容器初始化好 Bean 以后,就可以直接获取了。
├─src
├─main
│ ├─java
│ │ └─cn
│ │ └─ljc
│ │ └─springframework
│ │ BeanDefinition.java
│ │ BeanFactory.java
│ │
│ └─resources
└─test
└─java
└─springframework
└─test
│ ApiTest.java
│
└─bean
UserService.java
public class BeanDefinition {
private Object bean;
// 定义Bean
public BeanDefinition(Object bean) {
this.bean = bean;
}
// 获取bean
public Object getBean() {
return bean;
}
}
public class BeanFactory {
private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();
// 获取bean
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("查询用户信息");
}
}
@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();
}
查询用户信息
一个简单的Bean容器就完成了,已经初具雏形
代码不多,但是重在理解他的思想、设计、方案