关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

Spring 简单实现IoC

发布时间:2023-06-30 19:01:01

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实例的缓存Mapprivate final Map<String, Object> singletonMap = new HashMap<>();@Overridepublic 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;}@Overridepublic 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");

/template/Home/leiyu/PC/Static