一、Spring的本质
- Spring的本质就是一个对象工厂,也可以称为Bean工厂,负责生产Bean
- 有了Bean工厂,以后我们就不需要再new对象,而是直接向工厂索取
二、Bean定义
- 工厂生产商品,需要图纸,根据图纸生产商品
- 而Bean定义,就是Bean的图纸
- 一个Bean必须先要将定义注册到Bean工厂,才能进行后续的创建
- 类对象,最适合最为图纸,可以通过反射创建Bean
三、代码实现
新建BeanDefinition类
- 提供一个关键属性,Class beanClass
- 提供get ,set ,构造方法
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类
- 提供一个Map,维护所有的Bean定义
- 提供获取Bean方法
- 提供注册Bean方法
public class BeanFactory {
/**
* 存放所有的Bean定义
*/
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();
/**
* BeanFactory的核心方法,从中获取一个Bean
*
* @param name bean的名称
* @return Object类型的对象
*/
public Object getBean(String name) throws InstantiationException, IllegalAccessException {
return beanDefinitionMap.get(name).getBeanClass().newInstance();
}
/**
* 注册Bean定义
* @param name
* @param beanDefinition
*/
public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
beanDefinitionMap.put(name, beanDefinition);
}
}
提供Bean类,UserService
public class UserService {
public void queryUserInfo(){
System.out.println("查询用户信息成功");
}
}
测试类
- 新建一个Bean工厂
- 注册Bean
- 获取Bean
public class ApiTest {
@Test
public void test_BeanFactory() throws InstantiationException, IllegalAccessException {
// 1.初始化 BeanFactory
BeanFactory beanFactory = new BeanFactory();
// 2.注册 bean
BeanDefinition beanDefinition = new BeanDefinition(UserService.class);
beanFactory.registerBeanDefinition("userService", beanDefinition);
// 3.获取 bean
UserService userService = (UserService) beanFactory.getBean("userService");
userService.queryUserInfo();
}
}
测试结果
查询用户信息成功
四、总结
Bean工厂,最重要的两个方法
- 注册Bean
- 获取Bean
Bean工厂,最重要的一个属性
- Map,存储所有的Bean定义