spring ioc

  1. IOC 理论概要 ioc 控制反转通知 注入bean的容器 一个现场安全的concurrentHashMap (singletonObiects )
    在这里插入图片描述

  2. 创建bean的方法(看项目代码)
    a.基于class
    b.构造函数
    c.静态工厂方法创建bean
    d.自定义(FactoryBean 普通的借口用于修饰与BeanFactory 有很大差别)

  3. 依赖注入(看项目代码)
    a.set 注入
    b.构造函数注入
    c.自动注入 autoAwre
    d.look-up method //单列模式注入

  4. Bean 基本特性
    生命周期 创建(factory-method) 初始化( init-method) 销毁(destory-method)
    作用范围 scope=‘prototype/singleton’ 多例/单例
    default-lazy-init 懒加载 (容器启动速度快点,非懒加载 启动慢 但是可以检查程序错误后者应用多

  5. bean 构建过程
    a.benDefinition (bean 定义) ioc 实现中 xml 描述的bean 信息最后都保存在 benDefinition中
    xml 里的bean和 benDefinition 是一一对应的
    在这里插入图片描述
    在这里插入图片描述
    BeanMetadataElement:xml 元素信息
    AttributeAccessor:属性信息

b. bean 里面的id 和name 作为一个key 方便我们注册到ben注册中心去(BeanDefinitionRegistry)

c.beanDefinitionReder(bean定义读取器)
beanDefinition 中存储xml bean信息 而BeanDefinitionRegistry 基于id和name 把保存 bean 的定义
解析来学习xml bean(读取) -> beanDefinition(创建) -> BeanDefinitionRegistry(注册)

public class BeanDefinitionReaderExample {
public static void main(String[] args) {
//new 一个bean 注册中心
BeanDefinitionRegistry registry =new SimpleBeanDefinitionRegistry();
//new xmlbean资源读取器
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(registry);
//new 本地资源加载
DefaultResourceLoader loader = new DefaultResourceLoader();
//加载
Resource resource = loader.getResource(“spring.xml”);
//加载构建beand 定义名称
reader.loadBeanDefinitions(resource);
//获取所有创建bean多名称
String[] registryNames = registry.getBeanDefinitionNames();
//System.out.println(Arrays.toString(registryNames));

    //System.out.println(Arrays.toString(registry.getAliases("fineSpring")));
   // System.out.println(registry.getBeanDefinition("fineSpring"));
    //todo 无法根据别名获取(name)
   // System.out.println(registry.getBeanDefinition("fineSpringName"));
}

}
在这里插入图片描述d. Beanfatcory (bean 工厂)

bean 创建
public class BeanFactoryExample {
public static void main(String[] args) {
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.setResourceLoader(new DefaultResourceLoader());
reader.loadBeanDefinitions(“spring.xml”);
System.out.println(factory.getBean(“fineSpring”));
}
}

流程 从下往上读
at com.king.spring.FineSpring.(FineSpring.java:17)
.BeanUtils.instantiateClass(BeanUtils.java:172)
SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87) AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1262)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireAbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
//AbstractAutowireCapableBeanFactory 真正创建beand
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapable
//单列缓存中(DefaultSingletonBeanRegistry)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.jav

  • locked <0x4fb> (a java.util.concurrent.ConcurrentHashMap)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)

源码解读
AbstractBeanFactory.getBean{
AbstractBeanFactory.doGetBean{
final String beanName = transformedBeanName(name);//获取beanName
Object sharedInstance = getSingleton(beanName); //根据双重检查锁 获取是否是单列
if(存在){
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); //判断检测是否是 factoryBean
}else{
BeanFactory parentBeanFactory = getParentBeanFactory();
//去父类寻找 类似于双亲委派
}
//以上都不满足
if (mbd.isSingleton()) {单列模式
sharedInstance = getSingleton(beanName,ObjectFactory) //不存在就创建 双重检测模式创建
return createBean(beanName, mbd, args);//AbstractAutowireCapableBeanFactory
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);//判断检测是否是 factoryBean
}else if (mbd.isPrototype()) { //多例模式
Object prototypeInstance = null;
try {
beforePrototypeCreation(beanName); //加锁 防止多创建
prototypeInstance = createBean(beanName, mbd, args);//AbstractAutowireCapableBeanFactory
}
finally {
afterPrototypeCreation(beanName);//解锁
}
bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);判断检测是否是 factoryBean
}
}
}
在这里插入图片描述

  1. Beanfactory 和 ApplicationContext区别

在这里插入图片描述

ApplicationContext 它由Beanfatcory 接口派生而来所有由Beanfatcory所有的功能还包括 1.MeassageSource 提供国际化消息 b. 资源访问 如url 和文件 c.时间传播等 ApplicationListener接口等bean d.载入多个(继承关系)上下文,每一个上下文专注摸个层次(让某个功能的小弟去干活)
(boss领导级别一样统筹分配 )不是直接创建bean 或者执行方法,而且让实现累去操作

Beanfatcory:读取配置直接去操作生成bean(反射生成)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值