事实上Spring的依赖注入就是采用反射机制的。反射是指程序可以访问、检测和修改它本身状态或行为的一种能力。对于Java来说,就是在运行状态中,查询这个类、对象的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法、修改它的属性。而所谓的依赖注入就是指在运行时(不是编译时)改变对象的属性或者调用对象的构造方法。

允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深(这也是使用$parent不好实现的地方),并在起上下游关系成立的时间里始终生效。
不用再关心dom层级,只要在祖先组件内部就可以一直使用祖先组件提供的provideprovide 选项允许我们指定我们想要提供给后代组件的数据/方法。
然后在任何后代组件里,我们都可以使用 inject 选项来接收指定的我们想要添加在这个实例上的属性:
祖先组件不需要知道哪些后代组件使用它提供的属性后代组件不需要知道被注入的属性来自哪里
provide/inject 是解决组件之间的通信问题的利器,不受层级结构的限制,但并不是响应式的。
Vue的依赖注入是一种在组件层级中进行信息传递的机制。在组件渲染的过程中,父组件会在下方插入子组件,子组件渲染完成之后,其内部可能需要依赖于父组件的数据或方法,此时,就可以通过依赖注入将这些依赖传递到子组件中。Vue的依赖注入基于Provide和Inject两个API。Provide会在组件实例被创建后调用,并返回一个对象,Inject会在组件创建之前调用,会将父组件中Provide提供的数据注入到子组件中。总之,Vue的依赖注入原理可以简单概括为:Provide提供数据,Inject注入数据。
依赖注入(Dependency Injection)和控制反转(Inversion of control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。 不管是依赖注入,还是控制反转,都说明Spring采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。在理解依赖注入之前,看如下这个问题在各种社会形态里如何解决:一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)。
1 autowired实现注入的方法是通过自动装配的方式将依赖的对象注入到目标对象中。2 autowired注解会自动扫描并查找与目标对象需要的依赖类型相匹配的对象,并将其注入到目标对象中。它可以根据类型进行注入,也可以根据名称进行注入。3 autowired注解可以用在字段、构造方法、setter方法上,通过在目标对象中使用该注解,可以方便地实现依赖注入,减少手动配置的工作量。4 autowired注解的实现原理是通过反射机制来实现的,它会在运行时动态地查找并注入依赖对象。5 autowired注解的使用可以提高代码的可读性和可维护性,减少了手动配置的繁琐过程,提高了开发效率。