Spring的IoC容器是Spring框架的核心和基础,提供了依赖注入、AOP等功能。在这里,我们可以通过简单的代码来实现一个Spring IoC容器,以加深对IoC容器的理解。
首先,在这个简单的IoC容器中,我们需要一个BeanFactory接口,负责装载Bean的定义,实例化,获取实例等功能:
public interface BeanFactory {
Object getBean(String name);
void registerBeanDefinition(BeanDefinition beanDefinition) throws Exception;
}
然后,我们可以实现一个基于HashMap的BeanFactoryImpl类,用来保存Bean定义和实例:
public class BeanFactoryImpl implements BeanFactory {
// 存放Bean名称和BeanDefinition的映射关系
private final Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();
// 存放Bean实例的缓存Map
private final Map<String, Object> singletonMap = new HashMap<>();
@Override
public Object getBean(String name) {
// 先尝试从缓存中获取Bean实例
Object bean = singletonMap.get(name);
if (bean != null) {
return bean;
}
// 如果缓存中没有,则创建Bean实例并缓存
BeanDefinition beanDefinition = beanDefinitionMap.get(name);
if (beanDefinition == null) {
throw new RuntimeException("No BeanDefinition found for bean name '" + name + "'");
}
Class<?> beanClass = beanDefinition.getBeanClass();
try {
// 创建Bean实例
bean = beanClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException("Unable to instantiate bean class: " + beanClass.getName(), e);
}
// 将Bean实例放到缓存中
singletonMap.put(name, bean);
return bean;
}
@Override
public void registerBeanDefinition(BeanDefinition beanDefinition) throws Exception {
// 将Bean定义放到Bean工厂中
String name = beanDefinition.getBeanName();
if (beanDefinitionMap.containsKey(name)) {
throw new Exception("Duplicate bean definition for bean name '" + name + "'");
}
beanDefinitionMap.put(name, beanDefinition);
}
}
接下来,我们需要定义BeanDefinition,即Bean的定义信息,包括Bean名称、Bean的类定义、Bean属性等:
public class BeanDefinition {
private String beanName;
private Class<?> beanClass;
public BeanDefinition(String beanName, Class<?> beanClass) {
this.beanName = beanName;
this.beanClass = beanClass;
}
public String getBeanName() {
return beanName;
}
public void setBeanName(String beanName) {
this.beanName = beanName;
}
public Class<?> getBeanClass() {
return beanClass;
}
public void setBeanClass(Class<?> beanClass) {
this.beanClass = beanClass;
}
}
最后,我们可以使用这个简单的IoC容器来创建并获取Bean实例:
// 创建Bean工厂
BeanFactory factory = new BeanFactoryImpl();
// 定义Bean的类定义
BeanDefinition beanDefinition = new BeanDefinition("user", User.class);
// 将Bean定义注册到Bean工厂
factory.registerBeanDefinition(beanDefinition);
// 从Bean工厂中获取Bean实例
User user = (User) factory.getBean("user");