当前位置: 首页 > news >正文

西安建设网站公司app在线制作平台有哪些

西安建设网站公司,app在线制作平台有哪些,查找网站空间商,四川省建筑信息网查询系统目录 引入作用代码分析InstantiationAwareBeanPostProcessor#postProcessProperties()AutowiredAnnotationBeanPostProcessor查找注入点元数据给注入点注入属性 引入 之前我们了解到BeanDefinition到Bean#xff0c;经历了 实例化属性赋值初始化 3个步骤现在详细分析下属性赋… 目录 引入作用代码分析InstantiationAwareBeanPostProcessor#postProcessProperties()AutowiredAnnotationBeanPostProcessor查找注入点元数据给注入点注入属性 引入 之前我们了解到BeanDefinition到Bean经历了 实例化属性赋值初始化 3个步骤现在详细分析下属性赋值populateBean(beanName, mbd, instanceWrapper); 作用 就是查找Bean内字段或者方法上是否有Autowired 如果有则从 context中查找并赋值完成依赖注入 代码分析 其实就是解析各种依赖存入 getPropertyValues 缓存相当于一个Map 最后在统一反射到属性中 beanName – the name of the bean mbd – the bean definition for the bean bw – the BeanWrapper with bean instance populateBean(beanName, mbd, instanceWrapper);ropertyValues pvs mbd.getPropertyValues();//可以这样设置Bean(autowire Autowire.BY_NAME) //这里只是解析 但是并没有真的设置 设值在最后一行 if (mbd.getResolvedAutowireMode() AUTOWIRE_BY_NAME || AUTOWIRE_BY_TYPE) {创建一个缓存 newPvs//意思是Bean的属性注入自动根据其Setter的名字或者属性if (resolvedAutowireMode AUTOWIRE_BY_NAME) {newPvs.put(属性的名字(propertyName), getBean(propertyName));}//也可以 Autowire.BY_TYPE 就是根据Setter 参数的类型if (resolvedAutowireMode AUTOWIRE_BY_TYPE) {newPvs.put(属性的名字(propertyName), getBean(属性Setter的参数的类型));}pvs newPvs; } //注意这个方式已经被标记为过时的 因为这样调试起来很麻烦 而且不是很方便推荐还是Autowired遍历处理器 InstantiationAwareBeanPostProcessor bp {pvs bp.postProcessProperties(); }//根据pvs给对象设值 if (pvs ! null) {//这里最终也是通过反射把值设置到字段中BeanWrapperImpl.BeanPropertyHandler#setValueapplyPropertyValues(beanName, mbd, bw, pvs); }InstantiationAwareBeanPostProcessor#postProcessProperties() 这个处理器就是用来专门处理Bean的属性的 AutowiredAnnotationBeanPostProcessor 这个处理器实现就是专门处理Autowired之类的逻辑 初始化的时候autowiredAnnotationTypes设置了 Autowired.classValue.classjavax.inject.Inject postProcessProperties()://查找注入点元数据 InjectionMetadata metadata findAutowiringMetadata(beanName, bean.getClass(), pvs); //给注入点注入属性 metadata.inject(bean, beanName, pvs);查找注入点元数据 findAutowiringMetadata()://这里metadata 其实已经有值了 //在 MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition //其实就进入了AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition //在buildAutowiringMetadata()就把带注解的字段和方法解析完了 //并设置到injectedElements字段中 //最后 this.injectionMetadataCache.put(cacheKey, new InjectionMetadata(clazz, injectedElements))); InjectionMetadata metadata this.injectionMetadataCache.get(cacheKey); if (metadata null) {metadata buildAutowiringMetadata(clazz);this.injectionMetadataCache.put(beanName, ); }//这里就是构建元数据 //构建元数据的前提是有需要注入的点 如果有则创建一个AutowiredFieldElement加入currElements buildAutowiringMetadata(clazz):遍历所有的字段field {if(带有4个注解之一) {currElements.add(new AutowiredFieldElement(field, required));} }遍历所有方法method{if(带有4个注解之一) {PropertyDescriptor pd 这个方法是否是某个字段的读写currElements.add(new AutowiredMethodElement(method, required, pd));} }return new InjectionMetadata(currElements, clazz);给注入点注入属性 AutowiredFieldElement#inject //找到字段的值 value resolveFieldValue(field, bean, beanName); //反射 if (value ! null) {ReflectionUtils.makeAccessible(field);field.set(bean, value); }resolveFieldValue(field, bean, beanName)://包装成统一的描述符 DependencyDescriptor desc new DependencyDescriptor(field, this.required); //找到值 value beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter);return value;resolveDependency(desc, beanName, autowiredBeanNames, typeConverter)://设置参数Name发现器 //1. -parameters java8 编译带了这个参数就能获取参数的name //2. 本地变量表 基于ASM技术 descriptor.initParameterNameDiscovery(getParameterNameDiscoverer()); if (类型不是 ObjectFactory || Optional) {if(依赖带有Lazy) {return 对名称和依赖进行代理在用的时候再查找注入;} return doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter); }doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter):if (descriptor储存了快速解析出来的对象) {return shortcut; }Object value 查找依赖是否有Value, 并获取值 if (value ! null value instanceof String) {//解析 ${} 配置内容并获取值//计算解析不到也把#Value的值读取出来 后续el表达式解析String strVal resolveEmbeddedValue((String) value);value evaluateBeanDefinitionString(strVal, bd);return 类型转化(value); }//这里就是判断依赖是否是复数的 下边的Object只是指代对象 不是特定的类型 //MapString, Object 会注入 BeanName : 符合要求的Bean对象 作为map的entry //ListObject 和 Object[] 会直接注入符合要求的所有Bean对象 Object multipleBeans resolveMultipleBeans(descriptor, beanName, autowiredBeanNames, typeConverter); if (multipleBeans ! null) {return multipleBeans; }//根据类型查找所有的符合要求的实例 MapString, Object matchingBeans findAutowireCandidates(beanName, type, descriptor); if (matchingBeans 为空) {if (isRequired) {throw new NoSuchBeanDefinitionException()} return null; }//确定依赖的实例和名称 String autowiredBeanName; Object instanceCandidate; if (matchingBeans.size() 1) {autowiredBeanName determineAutowireCandidate(matchingBeans, descriptor);if (autowiredBeanName null) {throw new NoUniqueBeanDefinitionException();}instanceCandidate matchingBeans.get(autowiredBeanName); } else {Map.EntryString, Object entry matchingBeans.entrySet().iterator().next();autowiredBeanName entry.getKey();instanceCandidate entry.getValue(); }Object result instanceCandidate; //这个就是自己Bean方法返回null 就会被处理成 NullBean 这样不需要到处判空 if (result instanceof NullBean) {if (isRequired(descriptor)) {throw new NoSuchBeanDefinitionException();}result null; } //确定是否符合要求的类型 在getBean(beanName, Class)方法中 //第二个参数就是用来在这里做校验的 会判断找出的实例类型是否符合要求 if (!ClassUtils.isAssignableValue(type, result)) {throw new BeanNotOfRequiredTypeException(); } return result; findAutowireCandidates(beanName, requiredType, dependencyDescriptor):MapString, Object result CollectionUtils.newLinkedHashMap(candidateNames.length); //根据类型获取所有的 候选名称 //其实就是 beanFactory中 //遍历 this.beanDefinitionNames 获取name mergedBeanDefinitions.get(beanName) 获取 RootBeanDefinition //其中 RootBeanDefinition 是用来提前判断是否符合要求 //matchFound isTypeMatch(beanName, requiredType, true); //matchFound trur 就符合要求 String[] candidateNames BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this, requiredType, true, descriptor.isEager());判断 resolvableDependencies 中是否有符合requiredType的对象遍历 candidateNames {if(不是自依赖 isAutowireCandidate(candidate, descriptor)) {candidates.put(candidateName, getSingleton(beanName, false).getClass());} } //再次判断一下是否符合要求 isAutowireCandidate(candidate, descriptor) if (候选Definition.isAutowireCandidate() 依赖的类型是一个 class) {match true; //检查 Qualifier 没配置返回truematch checkQualifiers(bdHolder, dependencyType.getType() instanceof Class);if (match)) {//检查 Qualifier 没配置返回truematch checkQualifiers(bdHolder, descriptor.getMethodAnnotations();}return match; }//在查找到多个 候选实例的时候 确定一个最终的实例 determineAutowireCandidate(matchingBeans, descriptor):String primaryBeanName; //解析 Primary 遍历 candidates : candidateBeanName{if (有Primary) {if (primaryBeanName ! null) {throw new NoUniqueBeanDefinitionException();}primaryBeanName candidateBeanName;} } if (primaryBeanName ! null) {return primaryBeanName; } //解析 javax.annotation.Priority Integer highestPriority null; 遍历 candidates : candidateBeanName{if (有javax.annotation.Priority) {Integer thisPriority Priority(value);if (thisPriority null) {continue;}if (highestPriority ! null highestPriority thisPriority ) {throw new NoUniqueBeanDefinitionException();}if (highestPriority null || highestPriority thisPriority ) {highestPriority thisPriority;primaryBeanName candidateBeanName;}} } if (primaryBeanName ! null) {return primaryBeanName; }遍历 candidates : candidateBeanName{//这个缓存里有4个可直接解析的实例//{Class501}interface org.springframework.core.io.ResourceLoader - {AnnotationConfigApplicationContext1779}//{Class508}interface org.springframework.context.ApplicationEventPublisher - {AnnotationConfigApplicationContext1779}//{Class510}interface org.springframework.context.ApplicationContext - {AnnotationConfigApplicationContext1779}//{Class504}interface org.springframework.beans.factory.BeanFactory - {DefaultListableBeanFactory1475}if (this.resolvableDependencies.containsValue(beanInstance)) {return candidateName;}//这里就是判断字段或者参数名称 是否和BeanName一致if (matchesBeanName(candidateName, descriptor.getDependencyName()) {return candidateName;} }
http://www.hkea.cn/news/14283575/

相关文章:

  • html5开发的网站怎样做产品推广
  • 网站怎样制作吸引人wordpress文章展示相册
  • 做美工比较好的网站网站建设 深圳
  • 网站在百度上搜不到了网站主页设计素材
  • 临沂网站服务器价格专业网站设计联系方式
  • 婚庆公司网站设计注册个体可以做网站吗
  • 网站开发及后期维护404做的好的网站
  • 芜湖南陵网站建设建设多语种网站
  • 河南网站托管win10优化工具
  • 网站开发知识产权归属成都兼职做网站
  • 网站的关键词策略wordpress宝宝模板
  • 简述网站建设方案类型微信手机网站源码
  • 商务网站的特点金数字网站建设
  • 网站logo更换注册了域名之后如何建立一个网站
  • 做汽车网站怎么挣钱推广网站广告有哪些
  • 在线动画手机网站模板下载东道设计logo
  • 泉州网站建设哪里优惠清新wordpress主题
  • 备案网站名称怎么写手机建网站软件
  • 购物网站开发 需求分析莱芜网络推广公司排行
  • 查询网站流量网站建设与维护典型案例
  • 中国建设网官网网站网站 服务器 域名
  • 企业网站策划书下载网站建设公司自适应源码
  • 邢台做外贸网站wordpress 吧
  • 北京网站设计公司排行榜公司网站的主页优化
  • 上海 网站开发 工作室wordpress 评论框登陆
  • 做音乐网站的目的西安移动网站建设
  • 上海公司网站备案昊客网络
  • 电脑网站素材网站导航条设计欣赏
  • 网站建站网站微信公众号开发wordpress零基础建站
  • 临汾推广型网站建设网页设计移动端尺寸大小