自己实现spring容器创建

Posted liufei-yes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己实现spring容器创建相关的知识,希望对你有一定的参考价值。

场景:对账户信息进行操作

步骤

  1. 首先,持久化层操作
public interface AccountDao {
    void saveAccount();
}

新增一个账户信息,持久化层操作实现类

public class AccountDaoImpl implements AccountDao {
    @Override
    public void saveAccount() {
        System.out.println("保存账户成功");
    }
}
  1. 业务层操作
public interface AccountService {
    void saveAccount();
}

业务层操作实现类

public class AccountServiceImpl implements AccountService {
    private AccountDao accountDao = (AccountDao) BeanFactory.getBean("accountDao");
    @Override
    public void saveAccount() {
        accountDao.saveAccount();
    }
}

这里,我们通过自己定义对BeanFactory来创建bean
3. 创建配置文件

accountService=com.lf.test.service.impl.AccountServiceImpl
accountDao=com.lf.test.dao.impl.AccountDaoImpl
  1. BeanFactory实现
/**
 *
 * 一个创建Bean对象的工厂
 *
 * JavaBean:使用java编写的可重用组件
 *
 * 创建Service和Dao对象
 *
 * 第一步:需要配置文件来配置我们的service和dao
 *          * 配置内容:唯一标识 -> 全限定类名(key -> value)
 *
 * 第二步:读取配置文件中配置的内容,反射创建对象
 *
 * 配置文件可以是xml也可以是properties
 *
 */
public class BeanFactory {
    // 定义一个properties
    private static Properties properties;
    // 定义一个map,存放要创建的对象,称为容器
    private static Map<String, Object> beans;
    // 使用静态代码块为Properties对象赋值
    static {
        try {
            // 实例化对象
            properties = new Properties();
            // 获取properties文件的流对象
            InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            properties.load(in);
            beans = new HashMap<>();
            // 取出配置文件中所有的bean
            Enumeration keys = properties.keys();
            // 遍历keys
            while (keys.hasMoreElements()) {
                String key = keys.nextElement().toString();
                String beanPath = properties.getProperty(key);
                Object value = Class.forName(beanPath).newInstance();
                beans.put(key, value);
            }
        } catch (Exception e) {
            throw new ExceptionInInitializerError("初始化properties失败");
        }
    }
    // 根据bean的名称,获取值
    public static Object getBean(String beanName) {
        return beans.get(beanName);
    }
}
  1. 测试
public class TestClient {
    public static void main(String[] args) {
        AccountService accountService = (AccountService) BeanFactory.getBean("accountService");
        accountService.saveAccount();
    }
}

结果:
技术图片

以上是关于自己实现spring容器创建的主要内容,如果未能解决你的问题,请参考以下文章

spring IOC 分析及实现

Spring IOC容器的初体验

spring5源码分析系列——spring核心容器体系结构

Spring容器的理解

#yyds干货盘点# Spring核心原理之IoC容器初体验

spring教程:简单实现(转)