源码参考:github上的code4craft/tiny-spring
项目。
tiny-spring-step-2-abstract-beanfactory-and-do-bean-initilizing-in-it
文章目录
源码解析
BeanDefinition
beanDefinition中定义了bean的元信息数据,有className和Class对象信息。
BeanFactory
工厂提供注册和获取bean的方法。将工厂抽象成接口。
AbstractBeanFactory
AbstractBeanFactory实现了BeanFactory接口,重写了基本的注册和获取bean方法,同时提供初始化抽象方法doCreateBean()。
为什么要添加初始化方法?
因为在beanDefinition注册bean时,需要一个对象,这时候我们需要容器来自动创建,而不是我们手动创建一个对象来注册。
@Override
public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
Object bean = doCreateBean(beanDefinition);
beanDefinition.setBean(bean);
beanDefinitionMap.put(name, beanDefinition);
}
AutowireCapableBeanFactory
AutowireCapableBeanFactory(可自动装配的),继承了AbstractBeanFactory抽象类,实现了doCreateBean()方法。
public class AutowireCapableBeanFactory extends AbstractBeanFactory {
@Override
protected Object doCreateBean(BeanDefinition beanDefinition) {
try {
// 根据class为我们自动装配一个对象
Object bean = beanDefinition.getBeanClass().newInstance();
return bean;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
继承图
测试
定义一个bean,取名为HelloWorldService
public class HelloWorldService {
public void helloWorld(){
System.out.println("Hello World!");
}
}
1.创建beanFactory
2.创建beanDefinition,对应的beanClassName为helloWorldService 的全类名
3.注册bean
4.从beanFactory中获取bean
public class BeanFactoryTest {
@Test
public void test() {
// 1.初始化beanfactory
BeanFactory beanFactory = new AutowireCapableBeanFactory();
// 2.注入bean
BeanDefinition beanDefinition = new BeanDefinition();
beanDefinition.setBeanClassName("us.codecraft.tinyioc.HelloWorldService");
beanFactory.registerBeanDefinition("helloWorldService", beanDefinition);
// 3.获取bean
HelloWorldService helloWorldService = (HelloWorldService) beanFactory.getBean("helloWorldService");
helloWorldService.helloWorld();
}
}