临汾山东漯河饰品美体美文
投稿投诉
美文创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品
漯河衢州
兴义眉山
桂林阳泉
玉溪简阳
山东遂宁
永城新余
梧州洛阳
泸州温州
临汾清远
营口常熟
浙江大连
桐乡宜昌

spring依赖注入属性填充(上)

6月6日 飞虹谷投稿
  我们会经常使用Autowired、Resource、Value这些注解给属性赋值。
  那么这几个注解是怎么给属性赋值的呢?还有其他的方法可以给属性赋值吗?使用Bean注解set方法,设置依赖注入方式(byName,byType)。
  配置类
  bean
  测试
  上面几张图:在配置类中使用Bean注解并设置注入方式,配置bean。
  这种方式在spring中已经被定义为过期的方法,但是还能用,只是spring不建议使用。
  person类的属性上并没有加Autowired,但是也能注入成功。
  上图这段代码就是记录这种注入方式的代码,记住是记录,意思是说:只要用这种方式注入bean的spring都会在这个地方记录,就是将这些bean的名字存到一个集合中,方便后续注入。
  PropertyDescriptor〔〕pdsbw。getPropertyDescriptors();
  PropertyDescriptor:属性描述器,是javaBean里自带的。在这个属性描述器里会记录属性的名字,属性的set方法,get方法,等等。
  前提是必须要有set方法或是get方法,如果一个类里只定义了属性,没有set方法或则是getf方法,那么也是拿不到这个属性的。
  PropertyDescriptor中的name属性是通过解析set方法获取的。例如:setOr123,那么name属性的值就是or123。
  spring在拿到所有属性后进行循环遍历for(PropertyDescriptorpd:pds){if(pd。getWriteMethod()!null!isExcludedFromDependencyCheck(pd)!pvs。contains(pd。getName())!BeanUtils。isSimpleProperty(pd。getPropertyType())){result。add(pd。getName());}}pd。getWriteMethod()!null:将没有set方法的属性给过滤掉。!pvs。contains(pd。getName()):将在MergedBeanDefinitionPostProcessor。postProcessMergedBeanDefinition方法中赋值过的属性过滤掉。!BeanUtils。isSimpleProperty(pd。getPropertyType()):将简单类型的属性过滤掉。
  上图这个方法的最后面,就是下面这段代码if(pvs!null){applyPropertyValues(beanName,mbd,bw,pvs);}
  将记录属性进行赋值。Autowired,Value,Resource给属性赋值
  上图中的1是处理Autowired,Value,2是处理Resource。
  以下主要看是AutowiredAnnotationBeanPostProcessor这个实现类。
  上图中可以看到AutowiredAnnotationBeanPostProcessor实现了SmartInstantiationAwareBeanPostProcessor和MergedBeanDefinitionPostProcessor这两个接口。
  MergedBeanDefinitionPostProcessor。postProcessMergedBeanDefinition寻找注入点
  根据类找到注入点
  注入点:加了Autowired的属性或者方法。
  ReflectionUtils。doWithLocalFields(targetClass,field{MergedA?annfindAutowiredAnnotation(field);if(ann!null){if(Modifier。isStatic(field。getModifiers())){if(logger。isInfoEnabled()){logger。info(Autowiredannotationisnotsupportedonstaticfields:field);}}booleanrequireddetermineRequiredStatus(ann);currElements。add(newAutowiredFieldElement(field,required));}});
  上述代码就是拿到类的所有属性,然后循环判断属性上面有没有加注解(Autowired或Value只要有一个注解就行)如果有注解且不是静态属性,就会加入到缓存中currElements。
  1。静态的属性属于类的,不依赖于某个对象,也可以称为类属性。不同的对象都可以访问到类的属性。带参数的构造方法中不能包含静态的属性。它的生命随着类的消亡而消亡。
  2。非静态属性只能属于某个对象,其它的对象不能访问它的属性。随着对象的消亡而消亡。
  booleanrequireddetermineRequiredStatus(ann);
  这行代码的作用就是处理required的,如果等于true就是必须要给该属性赋值,如果没有值就会报异常。ReflectionUtils。doWithLocalMethods(targetClass,method{MethodbridgedMethodBridgeMethodResolver。findBridgedMethod(method);if(!BridgeMethodResolver。isVisibilityBridgeMethodPair(method,bridgedMethod)){}MergedA?annfindAutowiredAnnotation(bridgedMethod);if(ann!nullmethod。equals(ClassUtils。getMostSpecificMethod(method,clazz))){if(Modifier。isStatic(method。getModifiers())){if(logger。isInfoEnabled()){logger。info(Autowiredannotationisnotsupportedonstaticmethods:method);}}if(method。getParameterCount()0){if(logger。isInfoEnabled()){logger。info(Autowiredannotationshouldonlybeusedonmethodswithparameters:method);}}booleanrequireddetermineRequiredStatus(ann);PropertyDescriptorpdBeanUtils。findPropertyForMethod(bridgedMethod,clazz);currElements。add(newAutowiredMethodElement(method,required,pd));}});
  上述这段代码是处理方法的,和上面的属性大致差不多。
  唯一不同的是:MethodbridgedMethodBridgeMethodResolver。findBridgedMethod(method);if(!BridgeMethodResolver。isVisibilityBridgeMethodPair(method,bridgedMethod)){}
  这个就是处理桥接方法,有兴趣的可以搜一下。
  if(!AnnotationUtils。isCandidateClass(clazz,this。autowiredAnnotationTypes)){returnInjectionMetadata。EMPTY;}
  这段代码就是判断这个bean的类型。如果是String等基础数据类型则不需要寻找注入点,就会直接返回。
  SmartInstantiationAwareBeanPostProcessor。postProcessProperties主要是处理属性
  在拿到注入点后就会执行这个方法,这个方法中会找到注入点的值,并给注入点赋值。
  标号1的地方是找值,找到值后,就会执行标号2,给注入点赋值。
投诉 评论

恭喜老佛爷!安切洛蒂彻底解锁巴西双子星,皇马前锋线十年内无忧C罗离开皇马后,老佛爷改变以往花费重金引进巨星的策略,改为在全球范围内物色有发展前景的年轻球员,目的就是打造属于银河战舰亲自出品的顶级巨星。在这样的环境下,年仅17岁的维尼休斯……spring依赖注入属性填充(上)我们会经常使用Autowired、Resource、Value这些注解给属性赋值。那么这几个注解是怎么给属性赋值的呢?还有其他的方法可以给属性赋值吗?使用Bean注解se……一首诗,很短《短》(俄罗斯的一首小诗)一天很短,短得来不及拥抱清晨,就已经手握黄昏。一年很短,短得来不及细品初春殷红窦绿,就要打点素裹秋霜。……龚翔宇缺战!中国女排2523险胜阿根廷!袁心玥再次让人失望北京时间9月25日,女排世锦赛小组赛,世界排名No。4的中国女排迎来首秀,对手是世界排名No。22的阿根廷女排!这是双方第一次在世锦赛上交手,但是在世界杯和奥运会赛场上,双方则……重磅报告揭露美国职业女足系统性虐待和性骚扰丑闻(文王雷平悦苏佳维)10月3日,由美国足协公布的一份杀伤力极强的调查报告称,从高级别赛事到青少年联赛,美国国家女子足球联赛(NWSL)充斥成系统的情感虐待和不当性行为,影响了多……lpl赛程分析lpl已经开始了第一天除了EDG意外都胜了,挺意外的!jdg赢了感觉正常,EDG输了也可以接受毕竟skt实力也不差,RNG赢了真没想到,毕竟入围赛打的没有那么理想,可能这就是血……哈利波特手游下个版本更新爆料,一对多对抗开启,群殴警告哈利波特手游的圣诞版本相当成功,不少玩家都在官博的评论区要求本次活动全都改成永久。尤其是雪球乱斗模式,在与人斗的同时还要跟系统的雪球做斗争,贼刺激。而且每次升级(即击败对手达到……消息称华为将于6月初发布FreebudsPro2耳机等新品IT之家5月22日消息,数码博主长安数君透露,华为将于6月初发布新款耳机,结合其他人的爆料来看预计是新一代FreebudsPro2耳机。华为FreeBudsPro耳机发布……江苏退居第二,2022年17月6强省份消费总额情况喜欢看我文章的朋友们,麻烦关注下,谢谢大家的支持!消费总额(社会消费品零售总额)又名社会消费品零售总额,是指企业(单位)通过交易售给个人、社会集团,非生产、非经营用……银行存款35万,每月能领1203。8元利息,可以躺平吗?我国的老百姓是非常喜欢存钱的,尤其是中老年人,作为世界第一大储蓄大国,能够保持这个称号,中老年人是功不可没的。受到传统思想的影响,我国的老百姓都喜欢为自己存一笔抵御风险的资金,……RedmiNote12Pro渲染图,首发2亿主摄,升级550去年发布的RedmiNote10Pro和RedmiNote11Pro,深受消费者的喜爱,销量和口碑都很高,毕竟Note系列是Redmi定位走量的机型,而今面向2022年打造的R……投资451万亿韩元,尹锡悦领军复兴韩国芯片产业硅基世界(图片来源:韩联社)钛媒体App推出产业报道专题硅基世界,长期关注全球半导体领域的技术与产业升级,洞悉产业一手资讯、深度趋势。芯片半导体是韩国的生命线,也是我们的产……
探索沪上这些公园秋意盎然,来欣赏美图当你遇到不顺的事情的时候,你的心态就是最好的风水爸妈说,这台电视帮他们拾回美好回忆黄山的世界,世界的黄山45。22万高斯意味着什么鸿蒙3。0系统,华为WATCH3ProNew智能手表2899退役后吸金能力更强,羽生结弦冰演出场费是其他奥运冠军的十倍六安令人称奇的景区,依托世界第一坝而建,非遗传统文化博大精深广州队2022足协杯第二轮简评我是特种兵11年后主角逐渐边缘化,配角反而全部走红71岁的超模RosaSaito打破年龄和美丽的刻板印象,点燃孩子画画工具挑选的攻略每个品牌都需要的法则让品牌歌唱而非叫卖腹背受敌,净利润暴跌,三只松鼠真的风光不再了吗?爱你的感觉是怎么样的七夕节爱情表白成长中,我学会了坚强作文500字电脑辐射对小孩有什么影响吗榨汁机过滤网的清洗办法第二章洛书的解密第一节洛书的数理一中国科大首次在固态体系实现突破标准量子极限的磁测量滴滴推出新口碑值为了什么?微信怎么清空当天聊天记录(微信怎么清空当天聊天)关于不断提高幼儿在角色游戏中的能力如何充实的度过每一天

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找