工厂模式
用户只关心结果,不需要关心制作的过程。
原型模式
复制对象
代理模式
找关系,帮忙做事情。
单例模式
独一无二
策略模式
封装内部逻辑,选择性调用。折扣计算
模板模式
定义一个骨架,把一些步骤延迟到子类中实现
适配器模式
解决兼容问题。如:usb转换头,苹果数据线头转换成安卓。
装饰器模式
原始对象不变,增加处理能力。 如:房子装修,安装门,安装窗户,都还是房子
观察者模式
监听某个行为,做出某个回应。
适配器模式
在实现上:通过继承的方式。
解释上:
把一个类的接口变成客户端所能接受的另一种接口,从而使2个不能匹配而无法使用的类,在一起使用
装饰器模式
在实现上:通过组合+静态代理的模式
解释上,把一个类通过组合的方式,让它自身不变,功能增加。
//ioc容器
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
具体方法 org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException {
...
BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
//已经存在ioc容器了
if (existingDefinition != null) {
//验证是否支持允许覆盖
if (!isAllowBeanDefinitionOverriding()) {
//不允许 抛出异常
throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
}
//允许的话,判断存在的权限是否小于需要添加的权限
else if (existingDefinition.getRole() < beanDefinition.getRole()) {
...
this.beanDefinitionMap.put(beanName, beanDefinition);
}
else {
//判断工厂的bean创建阶段是否已经开始了。
if (hasBeanCreationStarted()) {//工厂的bean创建阶段已经开始了
// 无法再修改启动时集合元素(用于稳定迭代)
synchronized (this.beanDefinitionMap) {
//保存ioc容器
this.beanDefinitionMap.put(beanName, beanDefinition);
//新建一个修改后的存储BeanName集合
List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
//复制beanDefinitionNames集合内容到新建的BeanName集合
updatedDefinitions.addAll(this.beanDefinitionNames);
//保存需要添加的beanName到修改后的集合
updatedDefinitions.add(beanName);
//重新赋值到beanDefinitionNames集合
this.beanDefinitionNames = updatedDefinitions;
//单例ioc容器中是否存在需要添加的bean
if (this.manualSingletonNames.contains(beanName)) {
//存在话
//创建一个Set集合,复制manualSingletonNames的内容
Set<String> updatedSingletons = new LinkedHashSet<>(this.manualSingletonNames);
//把BeanName从中移除掉
updatedSingletons.remove(beanName);
//再重新赋值到单例Ioc容器中
this.manualSingletonNames = updatedSingletons;
}
}
}
else {//没有开始的话,就直接保存
// Still in startup registration phase
//保存到ioc容器中
this.beanDefinitionMap.put(beanName, beanDefinition);
//保存到ioc-Names容器中
this.beanDefinitionNames.add(beanName);
//从单例Ioc容器中删除
this.manualSingletonNames.remove(beanName);
}
this.frozenBeanDefinitionNames = null;
}
//如果普通Bean已经存在了,或者 在单例Bean已经存在了
if (existingDefinition != null || containsSingleton(beanName)) {
//重新刷新Bean信息
resetBeanDefinition(beanName);
}
}