手写spring-day1

手写spring-01

bean 的定义,注册,获取

1.定义简单的beandefinition容器,只定义一个Object类型存放对象

2.注册把beandefinition存放到map中

3.获取通过bean 的名字作为key从BeanFactory的map中

主要代码

/**
 * @author Asher
 * @DATE 2023/10/12
 * @since
 */
public class BeanDefinition {
    private Object bean;

    public BeanDefinition(Object bean) {
        this.bean = bean;
    }

    public Object getBean() {
        return bean;
    }
}

/**
 * @author Asher
 * @DATE 2023/10/12
 * @since
 */
public class BeanFactory {
    private Map<String, BeanDefinition> map = new HashMap<String, BeanDefinition>();


    public Object getBean(String beanName) {
        return map.get(beanName).getBean();
    }

    public void registerBeanDefinition(String beanName,BeanDefinition beanDefinition) {
        map.put(beanName,beanDefinition);
    }
}

/**
 * @author Asher
 * @DATE 2023/10/12
 * @since
 */
public class ApiTest {

    @Test
    public void test(){
        //1.bean的定义
        BeanDefinition beanDefinition = new BeanDefinition(new UserService());
        //2.注册bean
        BeanFactory beanFactory = new BeanFactory();
        beanFactory.registerBeanDefinition("userservice",beanDefinition);

        //3.获取bean
        UserService userservice = (UserService) beanFactory.getBean("userservice");
        userservice.test();
    }
}

手写spring-02

1.将之前BeanDefinition 中的Object替换成Class,不需要在new

2.获取bean时先去单例池中获取看对象是否已经创建,不存在则通过反射方式创建,并放入单例池中

结构图

src
    ├─main
    │  ├─java
    │  │  └─com
    │  │      └─samll
    │  │          └─springframework
    │  │              └─beans
    │  │                  │  BeanException.java
    │  │                  │
    │  │                  └─factory
    │  │                      │  BeanFactory.java
    │  │                      │
    │  │                      ├─congfig
    │  │                      │      BeanDefinition.java
    │  │                      │      BeanDefinitionRegistry.java
    │  │                      │      SingletonBeanRegistry.java
    │  │                      │
    │  │                      └─support
    │  │                              AbstractAutowriteCapableBeanFactory.java
    │  │                              AbstractBeanFactory.java
    │  │                              DefaultListableBeanFactory.java
    │  │                              DefaultSingltonBeanRegistry.java
    │  │
    │  └─resources
    └─test
        └─java
            └─com
                └─samll
                    └─springframework
                        └─beans
                            └─factory
                                └─support
                                    │  ApiTest.java
                                    │
                                    └─bean
                                            UserService.java

代码结构

主要逻辑

1. BeanFactory定义获取bean的方法

2.SingletonBeanRegistry 定义获取,添加单例bean的方法

3.DefaultSingltonBeanRegistry 定义单例beanMap 并实现SingletonBeanRegistry中获取,添加单例bean的方法

4.AbstractBeanFactory extends DefaultSingltonBeanRegistry implements BeanFactory 实现获取bean的方法,获取bean时先去单例池中获取看对象是否已经创建,定义了创建Bean的方法,查找BeanDefinition的方法

5.AbstractAutowriteCapableBeanFactory extends AbstractBeanFactory 实现了创建Bean的方法

通过反射创建bean,并调用SingletonBeanRegistry的添加方法把创建的对象加入到单例beanMap

6.BeanDefinitionRegistry 定义了创建BeanDefinition的方法

7.DefaultListableBeanFactory extends AbstractAutowriteCapableBeanFactory implements BeanDefinitionRegistry 实现了获取BeanDefinition添加BeanDefinition 的方法

实现方法

/**
 * @author Asher
 * @DATE 2023/10/12
 * @since
 */
public class ApiTest {

    @Test
    public void test() {
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        beanFactory.addBeanDefinitionRegistry("userservice", new BeanDefinition(UserService.class));

        UserService userservice = (UserService) beanFactory.getBean("userservice");
        System.out.println(userservice);
        UserService userservice1 = (UserService) beanFactory.getBean("userservice");
        System.out.println(userservice1);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值