-
IOC 理论概要 ioc 控制反转通知 注入bean的容器 一个现场安全的concurrentHashMap (singletonObiects )
-
创建bean的方法(看项目代码)
a.基于class
b.构造函数
c.静态工厂方法创建bean
d.自定义(FactoryBean 普通的借口用于修饰与BeanFactory 有很大差别) -
依赖注入(看项目代码)
a.set 注入
b.构造函数注入
c.自动注入 autoAwre
d.look-up method //单列模式注入 -
Bean 基本特性
生命周期 创建(factory-method) 初始化( init-method) 销毁(destory-method)
作用范围 scope=‘prototype/singleton’ 多例/单例
default-lazy-init 懒加载 (容器启动速度快点,非懒加载 启动慢 但是可以检查程序错误后者应用多 -
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
}
}
}
- Beanfactory 和 ApplicationContext区别
ApplicationContext 它由Beanfatcory 接口派生而来所有由Beanfatcory所有的功能还包括 1.MeassageSource 提供国际化消息 b. 资源访问 如url 和文件 c.时间传播等 ApplicationListener接口等bean d.载入多个(继承关系)上下文,每一个上下文专注摸个层次(让某个功能的小弟去干活)
(boss领导级别一样统筹分配 )不是直接创建bean 或者执行方法,而且让实现累去操作
Beanfatcory:读取配置直接去操作生成bean(反射生成)