手写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);
}
}