极客时间:小马哥学习笔记

IoC主要实现策略:面试官总问IoC和DI的区别,他真的理解吗?

Ioc的主要实现策略

  1. 服务定位模式。通常是通过JNDI这种技术获取JavaEE的组件
  2. 依赖注入
  3. 上下文依赖查询
  4. 模板方法
  5. 策略模式(不太深入)
    可以说就是依赖查找和依赖注入

IoC容器的职责:IoC除了依赖注入,还涵盖哪些职责呢?

  • 实现与执行任务之间的解耦
  • 关注设计上的最终目标,而不是它具体的实现
  • 释放这个模块
  • 模块取消,(比如依赖变更了,如果是同步调用,影响比较明显,但是用IOC的话,可能影响不是很明显)

白话文职责

  • 通用职责
  • 依赖处理
    - 依赖查找
    - 依赖注入
  • 生命周期管理
    - 容器
    - 托管的资源(Java Beans 或其他资源)
  • 配置
    - 容器
    - 外部化配置
    - 托管的资源

IoC容器的实现

传统IoC容器实现:JavaBeans也是IoC容器吗?

传统JavaBeans实现

贫血模型、只有可写方法、可读方法、默认构造参数

public class Person {/*** 年龄*/private Integer age;/*** 名字*/private String name;public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

获取JavaBeans元信息

public class BeanInfoDemo {public static void main(String[] args) throws IntrospectionException {//Java自省的方式来操作BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);Stream.of(beanInfo.getPropertyDescriptors()).forEach(propertyDescriptor -> {System.out.println(propertyDescriptor.toString());});}
}

结果

java.beans.PropertyDescriptor[name=age; propertyType=class java.lang.Integer; readMethod=public java.lang.Integer ioc.eg1.Person.getAge(); writeMethod=public void ioc.eg1.Person.setAge(java.lang.Integer)]
java.beans.PropertyDescriptor[name=class; propertyType=class java.lang.Class; readMethod=public final native java.lang.Class java.lang.Object.getClass()]
java.beans.PropertyDescriptor[name=name; propertyType=class java.lang.String; readMethod=public java.lang.String ioc.eg1.Person.getName(); writeMethod=public void ioc.eg1.Person.setName(java.lang.String)]

为什么会 获取这些信息?
先来看看BeanInfo源码里面有什么

public interface BeanInfo {//Bean的描述信息BeanDescriptor getBeanDescriptor();//Bean事件的描述信息EventSetDescriptor[] getEventSetDescriptors();//Bean的字段信息PropertyDescriptor[] getPropertyDescriptors();

这里我们获取了Person的字段元信息,但是为什么多了一个class字段呢?
因为每个Object都有一个可读方法getClass(),然后就会把它当成一个默认属性,误以为是一个property
所以上面就会多出来一个属性class,并且他只有一个读方法
想要关掉它,就多传一个参数

BeanInfo beanInfo = Introspector.getBeanInfo(Person.class,Object.class);

这个第二个参数就是父类,防止多层次的类都打印出来,这个参数就是stopClass

那我们的类型转换元信息转换怎么做的

public class BeanInfoDemo {public static void main(String[] args) throws IntrospectionException {//Java自省的方式来操作BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);Stream.of(beanInfo.getPropertyDescriptors()).forEach(propertyDescriptor -> {//PropetyDescriptor允许添加属性编辑器  -  PropertyEditor//我们以往的GUI程序都会 text(String) -->  PropertyType//Spring怎么做类型转换的//Person  name -> String//          age ->IntegerClass<?> propertyType = propertyDescriptor.getPropertyType();String propertyName = propertyDescriptor.getName();if("age".equals(propertyName)){//为"age" 字段/属性增加 PropertyEditor//输入一个String类型,输出一个Integer类型//其实很简单就是Integer.valueOf();//具体怎么操作//1.写自己的PropertyEditor的实现//2.关联起来//3.将我们的Bean放进去,创建出来propertyDescriptor.setPropertyEditorClass(StringToIntegerPropertyEditor.class);propertyDescriptor.createPropertyEditor(Person.class);}});}static class StringToIntegerPropertyEditor extends PropertyEditorSupport {//方法拦截@Overridepublic void setAsText(String text){Integer value = Integer.valueOf(text);setValue(value);}}}

PropertyEditorSupport


public class PropertyEditorSupport implements PropertyEditor {public void setValue(Object value) {this.value = value;firePropertyChange();}/*** Gets the value of the property.** @return The value of the property.*/public Object getValue() {return value;}public String getAsText() {return (this.value != null)? this.value.toString(): null;}/*** Sets the property value by parsing a given String.  May raise* java.lang.IllegalArgumentException if either the String is* badly formatted or if this kind of property can't be expressed* as text.** @param text  The string to be parsed.*/public void setAsText(String text) throws java.lang.IllegalArgumentException {if (value instanceof String) {setValue(text);return;}throw new java.lang.IllegalArgumentException(text);}

我理解的就是Spring再做一个Bean的元信息、类型转换的时候,接收进来的都是String,然后在其他实现类里重写这个方法,将它转换成我们Bean定义的Type,就像上面的String—>Integer方法一样

Spring3.0以前,大量的类型转换实践都是基于PropertyEditorSupport来做的,上面的几个操作,基本满足于我们的元数据或元信息编程,他也就是一些类型配置和转换的一些根据

实习成长之路: 重新认识IOC,你可能对IoC有些误会?相关推荐

  1. 刘知远、赵鑫、施柏鑫:AI青年科研人员成长之路

    整理 | 刘冰一 在6月2日举办的智源大会青源学术年会举办的一个圆桌"青年科研人员成长之路与经验分享"上,清华大学计算机系副教授刘知远.中国人民大学高瓴人工智能学院长聘副教授赵鑫. ...

  2. 一个大神的Android成长之路

    这篇文章是我的一个朋友写的,总结了这些年的技术成长之路,我觉得对于很多技术人都有借鉴的作用,技术是相通的,不要整天想一口气吃成一个胖子,不积跬步无以至千里,既然选择了技术这条路,就不畏艰辛,苦中有甜, ...

  3. 我的前端成长之路:中医药大学毕业的业务女前端修炼之路

    简介: 前端工程师的修炼没有捷径,踏踏实实的通过一个个项目的实践来升级打怪实现进阶:本文仅分享自己11年的前端生涯,探讨一直在业务中的技术人的成长之路,也复盘再认识下自己,每个节点我遇到的问题和我的选 ...

  4. 原创电子书《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》

    <菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...

  5. 回顾2021,展望2022,静Yu的万粉成长之路

    万粉成长之路 前言 CSDN的发展 建立社区 收获奖品 2022的展望 福利发放 本周福利 祝福 前言 光阴似箭,转眼间2020年已经过去,一年时间里,有开心.有失落.有所失去.也有所收获.在一年的结 ...

  6. 张俊红 python_我的朋友张俊红成长之路

    张俊红同学是个好同志,是我的一位好朋友,与俊红在现实中素未谋面过(微信视频过).我认识俊红两年了,2016年的时候,在他大四实习的时候,我就认识他了.那时俊红正忙着转型做数据分析师,他偶尔也会在公众号 ...

  7. 高通Camera 软件工程师的成长之路

    本文以个人的工作学习经历来描述一 Camera 软件工程师的披荆斩棘之路,时间从大学开始,以至任职于高通 Camera 软件工程师结束,杂以本人学习过程当中的一系列学习笔记和博客文章,绝对是干货满满, ...

  8. JAVA程序员成长之路的总结

    JAVA程序员成长之路的总结 看了篇推荐贴,JAVA程序员成长之路的总结,大致适用于各种初级JAVA程序员规划借鉴之用, 原文地址http://tieba.baidu.com/p/2017010306 ...

  9. 十年风雨,一个普通程序员的成长之路(一)怀念:西安的小黑屋

    受大飞的文字及李莹大哥的影响,也写了篇自己毕业以来,十年生涯的回顾.还在沉默王二的文章激励下一鼓作气把公众号开通了,发了这篇公众号的首篇文章. 终于开通了自己第一个公众号,发表了第一篇文章.看着空白的 ...

  10. 王小二C:一个大神的Android成长之路

    这篇文章是我的一个朋友写的,总结了这些年的技术成长之路,我觉得对于很多技术人都有借鉴的作用,技术是相通的,不要整天想一口气吃成一个胖子,不积跬步无以至千里,既然选择了技术这条路,就不畏艰辛,苦中有甜, ...

最新文章

  1. LeetCode简单题之长按键入
  2. 【Qt】QWidget对样式表设置边框无效的解决方法
  3. Nginx学习4:负载均衡实例
  4. java字符串的替换replace、replaceAll、replaceFirst的区别
  5. SWT的UI线程和非UI线程
  6. 电大计算机本科离散数学考试题,国开(中央电大)本科《离散数学(本)》网上形考(任务一至三)试题及答案...
  7. mall整合SpringBoot+MyBatis搭建基本骨架
  8. ubuntu服务器修改保存文件,Ubuntu Server 如何永久保存iptables的设置?
  9. php mysql难不难_PHP操作mysql数据库
  10. MySQL数据库面试题(2022最新版)
  11. Javascript实战应用篇(2):继续完善网页文本框系列(增加水印和提示)
  12. 核磁共振三维重建(视频)
  13. win7 host 中 vbox 虚拟机无法 attach USB device的问题
  14. 筚路蓝缕,以启山林 | 做RPA行业的坚守者与创新者——数据猿专访云扩科技CTO史秋芳
  15. python-selenium学习笔记:运用验证码过滤登陆,验证是否登陆成功
  16. 程序员吃的是青春饭?年纪大了何去何从
  17. layui文件上传接口后端具体实现SpringMVC
  18. 学生上计算机课的好处,上网课的好处和坏处
  19. 度金互联网金融社区:P2P网贷资金必须托管 监管脚步渐响
  20. 方舟服务器恐龙等级修改器,方舟服务器恐龙的等级 | 手游网游页游攻略大全

热门文章

  1. element表格固定某一行_elementui 表格 固定列+合计行
  2. Cesium:去除原生自带绿色选择框
  3. Javascript特效:音乐导航
  4. Javascript特效:表单选中、取消选中、反选
  5. Echarts数据动态加载的实现样例
  6. 图像语义分割(1)-FCN:用于语义分割的全卷积神经网络
  7. 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。(C++实现)
  8. 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则
  9. 如何修改leaflet的marker图标
  10. Linux常用命令汇总 - Linux Shell Cheat Sheet