《Spring 手撸专栏》第 3 章
目录结构

类关系

类分析:
- BeanFactory接口:定义一个得到bean的接口
| package main.java.com.pickle.springframework.factory; |
| |
| import main.java.com.pickle.springframework.factory.config.BeanDefinition; |
| |
| import java.util.Map; |
| import java.util.concurrent.ConcurrentHashMap; |
| |
| |
| |
| |
| |
| |
| public interface BeanFactory { |
| Object getBean(String beanName); |
| } |
| |
- SingletonBeanRegistry接口:定义一个获得单例对象的接口
| package main.java.com.pickle.springframework.factory.config; |
| |
| |
| |
| |
| |
| |
| public interface SingletonBeanRegistry { |
| Object getSingleton(String beanName); |
| } |
| |
- DefaultSingletonBeanRegistry类:SingletonBeanRegistry的实现类,还有单例对象容器,实现了单例对象的注册和获取
| package main.java.com.pickle.springframework.factory.support; |
| |
| import main.java.com.pickle.springframework.factory.config.SingletonBeanRegistry; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| |
| |
| |
| |
| |
| |
| |
| public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry { |
| |
| |
| private final Map<String, Object> singletonObjects = new HashMap<>(); |
| |
| |
| |
| |
| |
| |
| |
| @Override |
| public Object getSingleton(String beanName) { |
| return singletonObjects.get(beanName); |
| } |
| |
| |
| |
| |
| |
| |
| |
| protected void addSingleton(String beanName, Object singletonObject) { |
| singletonObjects.put(beanName, singletonObject); |
| } |
| |
| } |
| |
- AbstractBeanFactory抽象类:实现了BeanFactory的接口
| package main.java.com.pickle.springframework.factory.support; |
| |
| import main.java.com.pickle.springframework.BeansException; |
| import main.java.com.pickle.springframework.factory.BeanFactory; |
| import main.java.com.pickle.springframework.factory.config.BeanDefinition; |
| |
| |
| |
| |
| |
| |
| public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory { |
| |
| |
| |
| |
| @Override |
| public Object getBean(String beanName) { |
| |
| Object bean = getSingleton(beanName); |
| if (bean != null) { |
| return bean; |
| } |
| |
| BeanDefinition beanDefinition = getBeanDefinition(beanName); |
| bean = createBean(beanName, beanDefinition); |
| addSingleton(beanName, bean); |
| return bean; |
| } |
| |
| protected abstract BeanDefinition getBeanDefinition(String beanName) throws BeansException; |
| |
| protected abstract Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException; |
| } |
| |
- BeanDefinitionRegistry接口:定义了BeanDefinition注册方法
| package main.java.com.pickle.springframework.factory.support; |
| |
| import main.java.com.pickle.springframework.factory.config.BeanDefinition; |
| |
| |
| |
| |
| |
| |
| public interface BeanDefinitionRegistry { |
| |
| |
| |
| |
| |
| void registerBeanDefinition(String beanName, BeanDefinition beanDefinition); |
| } |
| |
- AbstractAutowireCapableBeanFactory抽象类:实现创建对象自动装入容器
| package main.java.com.pickle.springframework.factory.support; |
| |
| import main.java.com.pickle.springframework.BeansException; |
| import main.java.com.pickle.springframework.factory.config.BeanDefinition; |
| |
| |
| |
| |
| |
| |
| public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory { |
| @Override |
| protected Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException { |
| |
| Object bean; |
| try { |
| bean = beanDefinition.getBeanClass().newInstance(); |
| } catch (InstantiationException | IllegalAccessException e) { |
| throw new BeansException("Instantiation of bean failed",e); |
| } |
| addSingleton(beanName,bean); |
| return bean; |
| } |
| } |
| |
- DefaultListableBeanFactory类:Bean工厂
| package main.java.com.pickle.springframework.factory.support; |
| |
| import main.java.com.pickle.springframework.BeansException; |
| import main.java.com.pickle.springframework.factory.config.BeanDefinition; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| |
| |
| |
| |
| |
| |
| |
| public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry{ |
| private final Map<String,BeanDefinition> beanDefinitionMap = new HashMap<>(); |
| |
| @Override |
| protected BeanDefinition getBeanDefinition(String beanName) throws BeansException { |
| final 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); |
| } |
| } |
| |
| package main.java.com.pickle.springframework; |
| |
| |
| |
| |
| |
| |
| public class BeansException extends RuntimeException{ |
| public BeansException(String message) { |
| super(message); |
| } |
| public BeansException(String message, Throwable cause) { |
| super(message, cause); |
| } |
| } |
| |
测试类
| package test.java.com.pickle.springframeword.test.bean; |
| |
| import main.java.com.pickle.springframework.entity.UserService; |
| import main.java.com.pickle.springframework.factory.config.BeanDefinition; |
| import main.java.com.pickle.springframework.factory.support.DefaultListableBeanFactory; |
| import org.junit.Test; |
| |
| |
| |
| |
| |
| |
| public class UserServiceTest { |
| @Test |
| public void test_BeanFactory() { |
| |
| final DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); |
| |
| beanFactory.registerBeanDefinition("userService", new BeanDefinition(UserService.class)); |
| |
| final UserService userService = (UserService) beanFactory.getBean("userService"); |
| userService.queryUserInfo(); |
| |
| final UserService userService_singleton = (UserService) beanFactory.getBean("userService"); |
| userService_singleton.queryUserInfo(); |
| |
| System.out.println(userService == userService_singleton); |
| } |
| |
| } |
| |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架