范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  我们会经常使用@Autowired、@Resource、@Value 这些注解给属性赋值。
  那么这几个注解是怎么给属性赋值的呢?还有其他的方法可以给属性赋值吗?使用@Bean注解+set方法,设置依赖注入方式(byName,byType)。
  配置类
  bean
  测试
  上面几张图:在配置类中使用@Bean 注解并设置注入方式, 配置bean。
  这种方式在spring中已经被定义为过期的方法,但是还能用,只是spring不建议使用。
  person类的属性上并没有加@Autowired,但是也能注入成功。
  上图这段代码就是记录这种注入方式的代码,记住是记录,意思是说:只要用这种方式注入bean的spring都会在这个地方记录,就是将这些bean的名字存到一个集合中,方便后续注入。
  PropertyDescriptor[] pds = bw.getPropertyDescriptors();
  PropertyDescriptor:属性描述器, 是javaBean 里自带的。在这个属性描述器里会记录属性的名字,属性的set 方法 ,get方法,等等。
  前提是必须要有set方法或是get方法,如果一个类里只定义了属性,没有set方法或则是getf方法,那么也是拿不到这个属性的。
  PropertyDescriptor中的name属性是通过解析set方法获取的。例如:setOr123 , 那么name属性的值就是 or123。
  spring 在拿到所有属性后进行循环遍历for (PropertyDescriptor pd : 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 -> {    MergedAnnotation<?> ann = findAutowiredAnnotation(field);    if (ann != null) {       if (Modifier.isStatic(field.getModifiers())) {          if (logger.isInfoEnabled()) {             logger.info("Autowired annotation is not supported on static fields: " + field);          }          return;       }       boolean required = determineRequiredStatus(ann);       currElements.add(new AutowiredFieldElement(field, required));    } });
  上述代码就是拿到类的所有属性,然后循环判断属性上面有没有加注解(@Autowired或@Value只要有一个注解就行)如果有注解且不是静态属性,就会加入到缓存中 currElements。
  1.静态的属性属于类的,不依赖于某个对象,也可以称为类属性。不同的对象都可以访问到类的属性。带参数的构造方法中不能包含静态的属性。 它的生命随着类的消亡而消亡。
  2.非静态属性只能属于某个对象,其它的对象不能访问它的属性。随着对象的消亡而消亡。
  boolean required = determineRequiredStatus(ann);
  这行代码的作用 就是处理 required 的,如果等于true 就是必须要给该属性赋值,如果没有值就会报异常。ReflectionUtils.doWithLocalMethods(targetClass, method -> {    Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);    if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) {       return;    }    MergedAnnotation<?> ann = findAutowiredAnnotation(bridgedMethod);    if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) {       if (Modifier.isStatic(method.getModifiers())) {          if (logger.isInfoEnabled()) {             logger.info("Autowired annotation is not supported on static methods: " + method);          }          return;       }       if (method.getParameterCount() == 0) {          if (logger.isInfoEnabled()) {             logger.info("Autowired annotation should only be used on methods with parameters: " +                   method);          }       }       boolean required = determineRequiredStatus(ann);       PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz);       currElements.add(new AutowiredMethodElement(method, required, pd));    } });
  上述这段代码是处理方法的,和上面的属性大致差不多。
  唯一不同的是:Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) {    return; }
  这个就是处理桥接方法,有兴趣的可以搜一下。
  if (!AnnotationUtils.isCandidateClass(clazz, this.autowiredAnnotationTypes)) {    return InjectionMetadata.EMPTY; }
  这段代码就是判断这个bean 的类型。如果是String等基础数据类型则不需要寻找注入点,就会直接返回。
  SmartInstantiationAwareBeanPostProcessor.postProcessProperties 主要是处理属性
  在拿到注入点后就会执行这个方法,这个方法中会找到注入点的值,并给注入点赋值。
  标号1的地方是找值,找到值后,就会执行标号2 ,给注入点赋值。

34年前台湾电影妈妈再爱我一次中演员大盘点妈妈再爱我一次是台湾独立制片富祥公司1988年出品的台湾伦理悲剧片。也许你忘记了这个影片的名字,但是那首世上只有妈妈好的歌曲,我想你一定会唱。这个影片用倒叙的方式讲述了归国的年轻医450岁的中年女人,学会这5套减龄穿搭,时尚又高级,很显品位女人到了450岁,就已经步入了中年阶段,在穿搭上也要格外讲究。而中年女人穿衣最大的问题就是要么显老,要么扮嫩,所以在穿搭上要把握好分寸,要清楚地意识到减龄不等于扮嫩,而是看起来比实2022年十大流行趋势,先知道!先时髦四大时装周春夏系列的精彩表现大家都领教过了吧,各大品牌争奇斗艳,太过瘾了!而且我发现今年流行的单品及趋势都能在秀场找到源头。所以今天大喜给大家大胆预测一波2022年10大流行趋势,奚梦瑶高调走机场,优雅高贵有气场,照着穿会很美奚梦瑶是享誉国际时尚圈的名模,身材比例超好,还有一副具有东方特色的脸部轮廓,配上她活泼可爱的性格,深受国内外的时尚界好评。在维秘秀一举成名后,她嫁了给赌王公子何猷君,但即使生了孩子春天,是一幅绚丽多彩的画卷文小小01。hr岁月极美,在于迭新更代丰富多彩,在于时光赋予生活不同的意境,在于岁月自然而然地花开花谢,在于春天绚丽多彩,铺展的画卷。季节的巷道里,春越来越深,阳光越来越暖,不经意夜读丨蜉蝣不知有明天,蚂蚱不知有明年,青蛙不知外面的世界绿标收听朗读音频文苏墨一只小小的蜉蝣,生命周期只有短短一天。蜉蝣和蚂蚱交了朋友,很欢喜地在一起玩了一天。到了晚上,蚂蚱说我要回家了,明天早上见。蜉蝣不解明天是什么?何为明天早上?后渔村的炊烟来源人民网人民日报图片来源影像中国我的故乡在东南沿海的一个渔村。小时候,最喜欢和伙伴们爬到村后的山上,眺望鳞次栉比的房屋冒出的袅袅炊烟。那欢快朴素的炊烟,从家家户户烟囱里徐徐而出,北极星是什么样的恒星?北极星轮流当,现任北极星有5万个太阳大如果你不小心在野外漆黑的夜晚迷失了方向,请不要慌张。天空中有一颗星星会给你指引方向,找到回家的路。这颗星星就是北极星。我们一起来认识一下北极星。怎样找到北极星?北极星北极星因为可以科学家在嫦娥五号月壤中发现铁橄榄石分解成因单质金属铁纳米级单质金属铁(Nanophaseironparticles,npFe0)是太空风化作用的特征产物,广泛存在于月壤矿物颗粒的表层非晶质环带与胶结质玻璃中,其研究意义在于纳米金属铁前沿论坛MatthewJ。Kohn为什么全球变暖是异常的?摘要地质历史时期,全球气候出现过比现今更加温暖的时候,也出现过更加寒冷的时候。如果说气候变化就是全球平均温度的上升和下降,那么我们从何得知现代全球气候变暖是正常的还是异常的呢?地质可观测宇宙中有97的星系已经失联?研究者人类正在被宇宙孤立宇宙到底有多大?这是一个没有人能够准确回答的问题,原因就是我们在宇宙中的观测范围是有限的,这个有限的观测范围通常被称为可观测宇宙,这是一个以我们为中心以我们在宇宙中的最远观测距离为
从终南山回望长安(外二首)文连忠照从终南山回望长安(外二首)文连忠照站在冬天的终南山上回望长安长安不见只有无边的蓝烟覆盖着茫茫的长安就像韩愈站在蓝关长安不见只有无边的忧愁让他抹一抹双眼带着揪心的疼痛去了无边的远方在读书活着最戳你的心窝的地方作者余华文桃子姐姐如果觉得生活艰难,请一定看一下这本书,读完不会觉得活着也是一种幸运。它告诉我们,活着不是为了什么,只是为了活着本身,活着是人生上不能被剥夺的意志,展示人自强不息坚七夕会养育雨后的山夏日的黄昏,刚下过一场雨,天空格外明净,一朵朵祥云像棉花糖一样浮游着。夕阳西斜,也将云朵映照得更加雪白。雨后的公园,像洗过一样清新,也有了一丝秋天似的凉爽。人群三三两两,有的在湖边iPadmini6真的适合你么?颜值方面ipadmini6很合我心意,对我这种手小力气小的女生来说,ipadmini6的大小正正好好,外出携带也很方便,躺在床上刷也不觉得很重。全面屏的设计很好看,颜色我买的是粉色将历代经典iPhone装裱起来!电子垃圾也能变废为宝一般来说,苹果用户的忠诚度很高,很多人是从iPhone4一直用到今天的。而对于之前那些淘汰的iPhone,大家是怎么处理的?其实这些经典的旧iPhone可以拆开做成艺术品,最好是那体验天龙PMA900NECD播放器最近我们拿到一台天龙的PMA900HNE功放,这是天龙第一台集成HEOS和流媒体功能的HiFi功放机。从天龙官网我们可以看到,它的HIFI产品序列并不复杂,级别最高的当属2500N模拟火车世界3面向各大平台公布9月6日推出DovetailGames日前公布了模拟火车世界系列的新作模拟火车世界3。该游戏将于9月6日在PC(Steam和Epic游戏商店)PS5PS4XboxSeriesXS和XboxOn开源MySQLweb端SQL审核平台Yearning开源精选是我们分享GithubGitee等开源社区中优质项目的栏目,包括技术学习实用与各种有趣的内容。本期推荐的是一个开源的web端MySQL审核平台Yearning。Yearni美媒评下赛季小前TOP10塔杜卡詹前四,嘴哥未进前十引争议今天凌晨,美媒Hoopshype专家团投票选出20222023赛季联盟25大小前锋,塔图姆杜兰特伦纳德詹姆斯位居前四。维金斯未进前十(排名11)具体排名如下1塔图姆2杜兰特3伦纳德曾经的五位第一中锋生涯数据大比拼曾经的五位第一中锋生涯数据大比拼,有人沦为无人问津的角色!1。霍华德2004年状元,生涯总薪金2。45亿美元,场均15。7分11。8篮板1。3助攻1。8盖帽,58。7命中率生涯获得麦迪09年的湖人,把科比换成克劳福德照样夺冠,科比的队友太强麦迪09年的湖人,把科比换成克劳福德照样夺冠,科比的队友太强本人认为,能突破二轮就烧高香了。有些球星只能在巨星身边发挥最大价值,加索尔再厉害为什么在灰熊连季后赛都进不去,这些人后面