IOC容器的依赖注入
2016-04-28 18:24
507 查看
依赖注入的过程是用户第一次向IOC容器索要Bean时触发的,例外--在BeanDefinition通过lazy-init完成对Bean的 预初始化。在IOC容器接口BeanFactory中,有一个getBean的接口定义,这个接口的实现就是触发依赖注入发生的地方。DefaultListableBeanFactory的基类AbstractBeanFactory的getBean
protected <T> T doGetBean(final String name,final Class<T> requiredType,final Object[] args,boolean typeCheckOnly)
Object bean;
...
}}
AbstractAutowireCapableBeanFactory中实现了createBean,createBean不但生成了需要的Bean,还对Bean的初始化进行了处理。
Object exposedObject=bean;
try{
populateBean(beanName,mdb,instanceWrapper);
exposedObject=initalizeBean(beanName,exposedObject,mdb);}catch(Throwable ex){
...}
...
}
//createBeanInstance生成Bean所包含的java对象,可以通过工厂方法生成,也可通过容器的autowire生成。
protected BeanWrapper createBeanInstance(String beanName,RootBeanDefinition mdb,Object[] args){
//确认需要创建的Bean实例的类可以实例化
Class beanClass=resolveBeanClass(mdb,beanName);
//使用工厂方法对Bean实例化
if(mdb.getFactoryMethodName()!=null){
return instantiateUsingFactoryMethod(neamName,mdb,args);
}
if(mdb.resolveConstructorOrFactoryMethod()!=null){
if(mdb.constructorArgumentResolved){return autowireConstructor(beanName,mdb,null,args);}else{
return instantiateBean(beanName,mdb);}
}
使用构造函数对Bean实例化
Constructor[] cons=deteminConstructorsFromBeanPostProcessors(beanClass,beanName);
if(cons!=null){
return autowireConstructor(beanName,mdb,cons,args);}
return instantiateBean(beanName,mdb);
}
//populateBean,BeanWraper完成Bean的属性值注入,
}
public Object getBean(String name) throws BeanException{ return doGetBean(name,null,null,false); public <T> T getBean(String name,calss<T> requiredType)throws BeansExceptio { return doGetBean(name,requiredType,null,false);} <span style="font-size:24px;"></span><pre name="code" class="java">public Object getBean(String name,Object... args) throws BeanException{ return doGetBean(name,null,args,false); public <T> T getBean(String name,calss<T> requiredType,Object[] args)throws BeansException{ return doGetBean(name,requiredType,args,false);}//这里是实际取得Bean的地方,也是触发依赖注入的地方
protected <T> T doGetBean(final String name,final Class<T> requiredType,final Object[] args,boolean typeCheckOnly)
throws BeanException{final String beanName=transformedBeanName(name);
Object bean;
...
}}
AbstractAutowireCapableBeanFactory中实现了createBean,createBean不但生成了需要的Bean,还对Bean的初始化进行了处理。
protected Object createBean(final String beanName,final RootBeanDefinition mbd,final Object[] args) throws BeanCreateException{ AccessControlContext acc=AccessController.getContext(); return AccessController.doPrivileged(new PrivilegedAction<Object>(){ public Object run(){ if(logger.idDebugEnabled()){ logger.debug("beanName"+beanName);} //判断需要创建的Bean是否可实例化,是否可通过类加载器载入 resolveBeanClass(mbd,beanName); try{mbd.prepareMethodOverrides();}catch(BeanDefinitionValidationException ex){ throw new BeanDefinitionValidationStoreException(mbd.getResourceDescription(),beanName,"Validation of method overrides failed",ex);} //如果配置了PostProcessor,返回一个proxy try{Object bean=resolveBeforeInstantiation(beanName,mdb); if(bean!=null){return bean;} }catch(Throwable ex){ throw new BeanCreationException(mdb.getResourceDescription(),beanName,"BeanPostProcessor before instantiation of bean failed",ex); //创建Bean的调用 Object beanInstance=doCreateBean(beanName,mdb,args);return beanInstance;}},acc}); //doCreateBean中Bean是怎样生成的 protect ObjectdoCreateBean(final String beanName,final RootBeanDefinition mdb,final Object[] args){ //BeanWrapper用来持有创建出来的Bean对象的 BeanWrapper instanceWrapper=null; //如果是Singleton,先把缓存中的同名Bean清除 if(mdb.isSingleton()){ instanceWrapper=this.factoryBeanInstanceCache.remove(beanName);} //创建Bean,由createBean完成 if(instanceWrapper==null){ instanceWrapper=createBeanInstance(beanName,mdb,args); } final Object bean=(instanceWrapper!=null?instanceWrapper.getWrapperInstance():null); Class beanType=<span style="font-size:24px;"></span><pre name="code" class="java">(instanceWrapper!=null?instanceWrapper.getWrapperClass():null); synchronized(mdb.postProcessingLock){ if(!mdb.postProcessed){applyMergedBeanDefinitionPostProcessors(mdb,beanType,beanName); mdb.postProcessed=true;} } boolean earlySingletonExposure=(mdb.isSingleton()&&this.allowCircularReferences&&isSingletonCurrentlyIncreation(beanName)) if(earlySingletonExposure){ if(logger.isDebugEnabled){} addSingletonFactory(beanName,new ObjectFactory(){ public Object getObject() throws BeansException{ return getEarlyBeanReference(beanName,mdb,bean);}}); }//对Bean的初始化,依赖注入在这里发生,exposedObject在初始化处理后会返回作为依赖注入完成后的Bean
Object exposedObject=bean;
try{
populateBean(beanName,mdb,instanceWrapper);
exposedObject=initalizeBean(beanName,exposedObject,mdb);}catch(Throwable ex){
...}
...
}
//createBeanInstance生成Bean所包含的java对象,可以通过工厂方法生成,也可通过容器的autowire生成。
protected BeanWrapper createBeanInstance(String beanName,RootBeanDefinition mdb,Object[] args){
//确认需要创建的Bean实例的类可以实例化
Class beanClass=resolveBeanClass(mdb,beanName);
//使用工厂方法对Bean实例化
if(mdb.getFactoryMethodName()!=null){
return instantiateUsingFactoryMethod(neamName,mdb,args);
}
if(mdb.resolveConstructorOrFactoryMethod()!=null){
if(mdb.constructorArgumentResolved){return autowireConstructor(beanName,mdb,null,args);}else{
return instantiateBean(beanName,mdb);}
}
使用构造函数对Bean实例化
Constructor[] cons=deteminConstructorsFromBeanPostProcessors(beanClass,beanName);
if(cons!=null){
return autowireConstructor(beanName,mdb,cons,args);}
return instantiateBean(beanName,mdb);
}
//populateBean,BeanWraper完成Bean的属性值注入,
}
相关文章推荐
- C#OOP之八 继承 接口和抽象类
- SSE技术简介
- ListView circleImageView Item test
- [BS] 小知识点总结-01
- iOS8之后,新的注册通知方式,解决注册通知失败问题
- spi为例的时序讲解
- Mac系统Git生成ssh公钥
- Ibatis 后台打印完整的sql语句
- 1107. Social Clusters
- Light OJ:1328 A Gift from the Setter(数学)
- IOS-TextField控件详解
- Android官方Training阅读笔记 ---- Building a Dynamic UI with Fragments(Building a Flexible UI) (二)
- 1106. Lowest Price in Supply Chain
- maven 学习---Maven安装配置
- 10条建议分享:帮助你成为与硅谷工程师一样优秀的程序员
- 集合框架(List集合的特有遍历功能)
- Proguard
- nefu1109(状态压缩dp)
- React简介
- struts2拦截器(二) 自定义拦截器