您现在的位置是:首页 >技术杂谈 >做个spring-实现Bean对象的的定义、注册、和获取网站首页技术杂谈

做个spring-实现Bean对象的的定义、注册、和获取

清晨一杯水 2024-09-18 12:01:06
简介做个spring-实现Bean对象的的定义、注册、和获取

用到的类和类的职责

接口 BeanFactory

定义 Bean 工厂接口

		方法  getBean(String Name)

BeanDefinition

定义 Bean 实例信息

接口 SingletonBeanRegistry

单例 Bean 注册表

		方法  getSingleton(String beanName)

DefaultSingletonBeanRegistry

通用的注册表实现

		属性
				singletonObjects:  Map<String, Object>
		实现方法
				getSingleton(String beanName)
		自己的方法
				addSingleton(String beanName, Object singletonObject)

抽象类 AbstractBeanFactory

实现BeanFactory 继承DefaultSingletonBeanRegistry
抽象的 Bean 工厂基类,定义模板方法

		实现方法
				getBean       实现BeanFactory的方法
		自己的抽象方法
		 		getBeanDefinition(String beanName)
				createBean(String beanName, BeanDefinition beanDefinition)

AbstractAutowireCapableBeanFactory

继承AbstractBeanFactory
实现默认bean创建的抽象bean工厂超类

		重写的方法
				createBean(String beanName, BeanDefinition beanDefinition)

接口 BeanDefinitionRegistry

Bean 定义注册接口

		方法
				registerBeanDefinition(String beanName, BeanDefinition beanDefinition)

核心实现类 DefaultListableBeanFactory

继承AbstractAutowireCapableBeanFactory实现BeanDefinitionRegistry
默认的Bean工厂实现类

		属性
				beanDefinitionMap :  Map<String, BeanDefinition>
		实现方法
				registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
		重写方法
				getBeanDefinition(String beanName)

开始做spring,实现Bean对象的的定义、注册、和获取

Bean对象的定义
BeanDefinition定义 Bean 实例信息

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接口,getBean()方法用于获取实例化Bean
BeanFactory

public interface BeanFactory {

    /**
     * 返回 Bean 的实例对象
     * @param name 要检索的bean的名称
     * @return 实例化的 Bean 对象
     * @throws BeansException 不能获取 Bean 对象,则抛出异常
     */
    Object getBean(String name) throws BeansException;

}

因为要实现单例模式
创建一个单例 Bean 注册表SingletonBeanRegistry接口

public interface SingletonBeanRegistry {

    /**
     * 返回在给定名称下注册的(原始)单例对象。
     * @param beanName 要查找的bean的名称
     * @return 返回注册的单例对象
     */
    Object getSingleton(String beanName);

    /**
     * 注册单利对象
     * @param beanName          Bean 对象名称
     * @param singletonObject   Bean 对象
     */
    void registerSingleton(String beanName, Object singletonObject);

}

创建DefaultSingletonBeanRegistry实现单例注册表接口,实现接口中的方法。
继承该类实现单例模式,singletonObjects中缓存实例化好的对象,getSingleton可直接获取该对象

   public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {

    private Map<String, Object> singletonObjects = new HashMap<>();

    @Override
    public Object getSingleton(String beanName) {
        return singletonObjects.get(beanName);
    }

    @Override
    public void registerSingleton(String beanName, Object singletonObject) {
        singletonObjects.put(beanName, singletonObject);
    }

}

创建AbstractBeanFactory抽象类,抽象的 Bean 工厂基类,定义模板方法,采用职责分离的结构设计

public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {

    @Override
    public Object getBean(String name) throws BeansException {
        Object bean = getSingleton(name);
        if (bean != null) {
            return bean;
        }

        BeanDefinition beanDefinition = getBeanDefinition(name);
        return createBean(name, beanDefinition);
    }

    protected abstract BeanDefinition getBeanDefinition(String beanName);

    protected abstract Object createBean(String beanName, BeanDefinition beanDefinition);

}

细分功能职责AbstractAutowireCapableBeanFactory抽象类继承AbstractBeanFactory实现创建对象具体功能

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory{

    @Override
    protected Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException {
        Object bean = null;
        try {
            bean = beanDefinition.getBeanClass().newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            throw new BeansException("Instantiation of bean failed", e);
        }

        registerSingleton(beanName, bean);
        return bean;
    }

}

BeanDefinitionRegistry 为Bean 定义注册接口

public interface BeanDefinitionRegistry {

    /**
     * 向注册表中注册 BeanDefinition
     *
     * @param beanName       Bean 名称
     * @param beanDefinition Bean 定义
     */
    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition);

}

核心类DefaultListableBeanFactory默认的Bean工厂实现类
继承AbstractAutowireCapableBeanFactory 具体实现了该抽象类中的getBeanDefinition方法
实现BeanDefinitionRegistry 接口中的registerBeanDefinition方法
beanDefinitionMap中缓存bean的定义

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry {

    private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();

    @Override
    protected BeanDefinition getBeanDefinition(String beanName) {
        BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);
        if (beanDefinition == null) throw new BeansException("No bean named '" + beanName + "' is defined");
        return beanDefinition;
    }

    @Override
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
        beanDefinitionMap.put(beanName, beanDefinition);
    }

}

BeansException定义 Bean 异常

public class BeansException extends RuntimeException{

    public BeansException(String msg) {
        super(msg);
    }

    public BeansException(String msg, Throwable cause) {
        super(msg, cause);
    }

}

各个类各司其责,接下来模拟测试
模拟用户 Bean 对象

public class UserService {

    public void queryUserInfo() {
        System.out.println("查询用户信息");
    }

}

测试类

public class ApiTest {

    @Test
    public void test_BeanFactory(){
        // 1.初始化 BeanFactory
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();

        // 2.注册 bean
        BeanDefinition beanDefinition = new BeanDefinition(UserService.class);
        beanFactory.registerBeanDefinition("userService", beanDefinition);

        // 3.第一次获取 bean
        UserService userService = (UserService) beanFactory.getBean("userService");
        userService.queryUserInfo();

        // 4.第二次获取 bean from Singleton
        UserService userService_singleton = (UserService) beanFactory.getBean("userService");
        userService_singleton.queryUserInfo();
    }

}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。