Spring 属性注入的实现原理

来源:互联网 发布:修改apache默认目录 编辑:程序博客网 时间:2024/06/05 15:45

先说反射和内省。

反射
就是在运行时根据类名获取类名里一切内容,比如有哪些成员变量,有哪些成员方法,可以实例化这个类,可以访问成员变量,可以调用方法。

内省
首先,JavaBean里一种默认的规则,就是假设有个实体类User,里面有个属性name,那么默认的规则就是使用getName方法获取name的值,使用setName设置name的属性。内省,就是这个Bean自己知道这个默认的规则。比如,知道了要操作的是哪个属性,就能通过内省机制获取这个属性的set和get方法。

Spring依赖注入的原理就是这样的。假设有类A和类B,类B是类A的成员变量,那么在IOC时,可以通过反射机制获取A中的所有成员变量,比如获取到有个成员变量B,怎么根据这个变量B获取到B的get和set方法呢?用的就是内省,根据变量B,通过内省可以获取到对应的set方法,然后再使用反射,调用这个方法,完成set,这样依赖就注入了。

如果set方法是public类型的,那么符合Java语法规范,反射可以调用;

如果set方法是private类型的,那么不符合Java语法规范,反射就需要调用暴力反射,将setAccessble(true)来将该属性设置为可操作的,然后赋值。

0 0
原创粉丝点击