文章目录
- BeanDefinition
- beanDefinition类
- 单例对象
- 单例对象注册(SingletonBeanRegistry)
- DefaultSingletonBeanRegistry
- 模板方法 BeanFactory
- BeanFactory接口
- AbstractBeanFactory 抽象工厂模板 (getBean)
- AbstractAutowireCapableBeanFactory (createBean 创建bean)
- DefaultListableBeanFactory (getBeanDefinition) 获得bean定义
BeanDefinition
beanDefinition类
beanDefinition的作用主要是保存一个对象的类信息.
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;}
}
单例对象
单例对象注册(SingletonBeanRegistry)
public interface SingletonBeanRegistry {Object getSingleton(String beanName);
}
DefaultSingletonBeanRegistry
单例对象保存的具体类,存入到map中,同时拥有get add单例的方法
public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {private Map<String, Object> singletonObjects = new HashMap<>();@Overridepublic Object getSingleton(String beanName) {return singletonObjects.get(beanName);}protected void addSingleton(String beanName, Object singletonObject){singletonObjects.put(beanName, singletonObject);}}
模板方法 BeanFactory
BeanFactory接口
定义了一个bean工厂拥有的基本方法
其中第一个代表无参生成bean,第二个代表有参生成bean
public interface BeanFactory {public Object getBean(String name);public Object getBean(String name,Object ...args);}
AbstractBeanFactory 抽象工厂模板 (getBean)
继承单例 获得单例的全部方法,实现BeanFactory接口
然后定义模板方法和两个抽象方法让子类实现.
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {@Overridepublic Object getBean(String name) throws BeansException {// 首先从单例对象的map中去获取.Object bean = getSingleton(name);if(bean != null) return bean;// 去执行子方法的逻辑获取beanDefinitionBeanDefinition beanDefinition = getBeanDefinition(name);return createBean(name,beanDefinition,null);}@Overridepublic Object getBean(String name, Object... args) {// 首先从单例对象的map中去获取.Object bean = getSingleton(name);if(bean != null) return bean;// 去执行子方法的逻辑获取beanDefinitionBeanDefinition beanDefinition = getBeanDefinition(name);return createBean(name,beanDefinition,args);}protected abstract BeanDefinition getBeanDefinition(String beanName);protected abstract Object createBean(String beanName,BeanDefinition beanDefinition,Object[] args) throws BeansException;
}
AbstractAutowireCapableBeanFactory (createBean 创建bean)
继承上一个抽象类实现其中模板定义的一个方法 (createBean)
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory {private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();@Overrideprotected Object createBean(String beanName, BeanDefinition beanDefinition, Object[] args) throws BeansException {Object bean = null;try {bean = createBeanInstance(beanDefinition,beanName,args);}catch (Exception e){e.printStackTrace();}addSingleton(beanName,bean);return bean;}protected Object createBeanInstance(BeanDefinition beanDefinition, String beanName, Object[] args) throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException {Constructor constructorToUse = null;Class<?> beanClass = beanDefinition.getBeanClass();Constructor<?>[] declaredConstructors = beanClass.getDeclaredConstructors();for (Constructor ctor : declaredConstructors) {if (null != args && ctor.getParameterTypes().length == args.length) {constructorToUse = ctor;break;}}return instantiationStrategy.instantiate(beanDefinition, beanName, constructorToUse, args);}
}
DefaultListableBeanFactory (getBeanDefinition) 获得bean定义
实现模板方法中bean定义的收集.
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry {private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();@Overridepublic BeanDefinition getBeanDefinition(String beanName) {BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);if (beanDefinition == null) throw new RuntimeException("发生了异常");return beanDefinition;}// 注册bean.@Overridepublic void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {beanDefinitionMap.put(beanName, beanDefinition);}
}