- 浏览: 712727 次
- 性别:
- 来自: 重庆
文章分类
最新评论
-
superchangme:
show it,you are you:authenticat ...
认证 (authentication) 和授权 (authorization) 的区别 -
深度交流社区:
说的很清楚,学习了
认证 (authentication) 和授权 (authorization) 的区别 -
mazhi4562qq:
你好, 可以请教个关于activiti定时边界事件的问题么?我 ...
Activiti定时任务示例 -
落叶萧萧:
Spring MVC HelloWorld入门例子 -
daniaowansui:
什么垃圾东西?
使用Sping AOP记录操作日志和错误日志
最近自己写一个Ioc容器。
基本上全部采用直接方式支持Ioc,
至于XML,能不用就不用,那个烦死人的东西。
其中遇见很多问题,还是一步一步解决了不少。
其实多多看看spring3的源码是很有帮助的,呵呵。
这个方法应该是spring ioc里面一个很重要的方法了。在org.springframework.beans.factory.support.AbstractBeanFactory这个类中
可能没有研究过Spring源码的同学不知道这个方法。
其实你每次使用getBean(String beanName) 和 getBean(Class clazz)还有getBean(String beanName,Clazz clazz)这些方法的时候,最终都是回到了doGetBean这个方法。
看doGetBean()方法定义就知道这是一个泛型方法,所以咯。使用getBean(Class clazz)这个方法的时候就不用强制转型咯。
有大部分我都还没有研究进去,不过不急,慢慢看。。。。
基本上全部采用直接方式支持Ioc,
至于XML,能不用就不用,那个烦死人的东西。
其中遇见很多问题,还是一步一步解决了不少。
其实多多看看spring3的源码是很有帮助的,呵呵。
这个方法应该是spring ioc里面一个很重要的方法了。在org.springframework.beans.factory.support.AbstractBeanFactory这个类中
/** * Return an instance, which may be shared or independent, of the specified bean. * @param name the name of the bean to retrieve * @param requiredType the required type of the bean to retrieve * @param args arguments to use if creating a prototype using explicit arguments to a * static factory method. It is invalid to use a non-null args value in any other case. * @param typeCheckOnly whether the instance is obtained for a type check, * not for actual use * @return an instance of the bean * @throws BeansException if the bean could not be created */ @SuppressWarnings("unchecked") protected <T> T doGetBean( final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { final String beanName = transformedBeanName(name); Object bean; // Eagerly check singleton cache for manually registered singletons. Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { if (logger.isDebugEnabled()) { if (isSingletonCurrentlyInCreation(beanName)) { logger.debug("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference"); } else { logger.debug("Returning cached instance of singleton bean '" + beanName + "'"); } } bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); } else { // Fail if we're already creating this bean instance: // We're assumably within a circular reference. if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); } // Check if bean definition exists in this factory. BeanFactory parentBeanFactory = getParentBeanFactory(); if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { // Not found -> check parent. String nameToLookup = originalBeanName(name); if (args != null) { // Delegation to parent with explicit args. return (T) parentBeanFactory.getBean(nameToLookup, args); } else { // No args -> delegate to standard getBean method. return parentBeanFactory.getBean(nameToLookup, requiredType); } } if (!typeCheckOnly) { markBeanAsCreated(beanName); } final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); checkMergedBeanDefinition(mbd, beanName, args); // Guarantee initialization of beans that the current bean depends on. String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dependsOnBean : dependsOn) { getBean(dependsOnBean); registerDependentBean(dependsOnBean, beanName); } } // Create bean instance. if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() { public Object getObject() throws BeansException { try { return createBean(beanName, mbd, args); } catch (BeansException ex) { // Explicitly remove instance from singleton cache: It might have been put there // eagerly by the creation process, to allow for circular reference resolution. // Also remove any beans that received a temporary reference to the bean. destroySingleton(beanName); throw ex; } } }); bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } else if (mbd.isPrototype()) { // It's a prototype -> create a new instance. Object prototypeInstance = null; try { beforePrototypeCreation(beanName); prototypeInstance = createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); } else { String scopeName = mbd.getScope(); final Scope scope = this.scopes.get(scopeName); if (scope == null) { throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'"); } try { Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() { public Object getObject() throws BeansException { beforePrototypeCreation(beanName); try { return createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } } }); bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); } catch (IllegalStateException ex) { throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active for the current thread; " + "consider defining a scoped proxy for this bean if you intend to refer to it from a singleton", ex); } } } // Check if required type matches the type of the actual bean instance. if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) { try { return getTypeConverter().convertIfNecessary(bean, requiredType); } catch (TypeMismatchException ex) { if (logger.isDebugEnabled()) { logger.debug("Failed to convert bean '" + name + "' to required type [" + ClassUtils.getQualifiedName(requiredType) + "]", ex); } throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } } return (T) bean; }
可能没有研究过Spring源码的同学不知道这个方法。
其实你每次使用getBean(String beanName) 和 getBean(Class clazz)还有getBean(String beanName,Clazz clazz)这些方法的时候,最终都是回到了doGetBean这个方法。
public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); } public <T> T getBean(String name, Class<T> requiredType) throws BeansException { return doGetBean(name, requiredType, null, false); } public Object getBean(String name, Object... args) throws BeansException { return doGetBean(name, null, args, false); } public <T> T getBean(Class<T> requiredType) throws BeansException { Assert.notNull(requiredType, "Required type must not be null"); String[] beanNames = getBeanNamesForType(requiredType); if (beanNames.length > 1) { ArrayList<String> autowireCandidates = new ArrayList<String>(); for (String beanName : beanNames) { if (getBeanDefinition(beanName).isAutowireCandidate()) { autowireCandidates.add(beanName); } } if (autowireCandidates.size() > 0) { beanNames = autowireCandidates.toArray(new String[autowireCandidates.size()]); } } if (beanNames.length == 1) { return getBean(beanNames[0], requiredType); } else if (beanNames.length == 0 && getParentBeanFactory() != null) { return getParentBeanFactory().getBean(requiredType); } else { throw new NoSuchBeanDefinitionException(requiredType, "expected single bean but found " + beanNames.length + ": " + StringUtils.arrayToCommaDelimitedString(beanNames)); } }
看doGetBean()方法定义就知道这是一个泛型方法,所以咯。使用getBean(Class clazz)这个方法的时候就不用强制转型咯。
有大部分我都还没有研究进去,不过不急,慢慢看。。。。
发表评论
-
你真的会数钱吗?
2014-04-15 16:22 1571摘要:货币,记账相关的领域模型,使用值对象 快年底了,假如 ... -
基于Pushlet和ExtJS3的Web即时通讯应用
2013-07-09 17:01 0前段时间学习了Pushlet,再加上网上也搜索了一下这方面的一 ... -
@MatrixVariable的使用
2013-07-08 16:03 15929在Spring3.2 后,一个@MatrixVariable出 ... -
SpringMVC中form:select的使用
2013-07-08 15:40 63068最近使用Spring MVC的多,发下在Spring MVC下 ... -
Hibernate Transformers之三种结果转换说明
2013-06-06 22:57 13557在hibernate使用的过程中.我们通常需要对结果进行解释. ... -
Pushlet白皮书中文版下载
2013-04-23 11:36 1807最近研究Pushlet的比较多,确实觉得资料文档比较少呀。 分 ... -
Pushlet二次开发重点
2013-04-22 16:16 45251 Pushlet自带事件源分析 Pushl ... -
Maven+SVN+jenkins在linux的环境搭建
2013-03-20 17:14 4602就来工作上用到了这几个东西来做项目的持续集成管理 以前看《M ... -
Linux下的端口被占用解决办法
2013-03-20 17:02 1637在重启tomcat的时候,报错: java.net.Bin ... -
项目启动报错: Acquisition Attempt Failed!!!
2013-03-20 16:58 6330项目启动报错: Acquisition Attempt Fai ... -
Struts2标签调用静态方法
2012-12-14 16:13 2016这几天使用工作流的时候,很多地方在页面需要调用静态方法获取内容 ... -
Activiti获取历史任务信息
2012-12-06 22:42 15553在项目中的工作流操作中,需要用到工作流的流程历史信息列表显示, ... -
JSP页面调用Spring容器注入的Bean
2012-12-04 15:55 3246首先在jsp中导入: <jsp:directive.pa ... -
Activiti结合Spring自动部署流程资源
2012-12-03 15:01 12471Activiti 整合spring的时候,提供了一个自动部署的 ... -
无限级菜单数据库设计
2012-11-14 14:59 10041第一种方案: 表为两张,一张分类表,一张信息表。 表1: ... -
Hadoop:java.io.IOException: Tmp directory
2012-08-30 11:16 2819今天在机器上搭建Hadoop测试,第一次运行: bin/had ... -
Spring MVC HelloWorld入门例子
2012-07-05 21:36 61732本例子为你讲解在spring3中如何使用基于注解的mvc框架. ... -
jBPM4之请假流程例子
2012-05-28 15:33 2122最近项目需要工作流,所以就准备采用jBPM4作为工作流引擎, ... -
Hibernate:no row with the given identifier exists
2012-05-05 10:10 2311ObjectNotFoundException: no ... -
使用Sping AOP记录操作日志和错误日志
2012-04-20 22:59 8873使用AOP进行日志记录 我们应该首先思考使用哪一种类型的通知 ...
相关推荐
Spring源代码解析(一):IOC容器 Spring源代码解析(二):IoC容器在Web容器中的启动 Spring源代码解析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源...
个人觉得spring3.2的源代码比较好编译,没啥脾气,像我之前下载的spring的最新版本源代码,还有spring4.0的源代码,不论是使用jdk1.6还是1.7甚至是1.8编译都出问题,结果还是觉得spring3.2编译过程轻松一点,配合...
Spring源代码解析(一):Spring中的事务处理 Spring源代码解析(二):ioc容器在Web容器中的启动 Spring源代码分析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy ...
JavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源...
Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码...
Spring源代码解析3:Spring JDBC .doc Spring源代码解析4:Spring MVC .doc Spring源代码解析5:Spring AOP获取Proxy .doc Spring源代码解析6:Spring声明式事务处理 .doc Spring源代码解析7:Spring AOP中对拦截器...
spring-framework-2.0 Java源代码,spring2源代码
精通spring源代码精通spring源代码精通spring源代码精通spring源代码精通spring源代码精通spring源代码
spring-framework完整源代码(spring框架源码) 完整的Spring工程源码,工程内内包括spring各模块源码 以下为spring工程源码包结构: spring-src org.springframework aop,beans,cache,context,core,dao,ejb,...
spring 1.2源代码,包括第三方依赖包,直接导入到eclip中可直接运行。
JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-hibernate3JavaEE源代码 spring-...
JavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源...
Spring2.5的源代码,需要认真研究!
spring mvc4.1.4 源代码 spring mvc4.1.4 源代码spring mvc4.1.4 源代码spring mvc4.1.4 源代码spring mvc4.1.4 源代码
SpringSecurity教程配套源码 专栏地址:http://blog.csdn.net/column/details/springsecurity.html
spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码
JavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 ...
JavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 ...
JavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 ...
JavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源...