spring ioc是spring的核心之一,也是spring体系的基础,那么spring ioc所依赖的底层技术是什么的?反射,以前我们开发程序的时候对象之间的相互调用需要用new来实现,现在所有的bean都是通过spring容器来管理。这样做有什么好处呢?解耦!以前程序直接的调用用new直接给写死了,现在我们可以通过注入不同的接口实现类来完成对象直接的调用。
首先来聊聊Java的反射机制
1、反射机制的作用:
反编译:.class-->.java
通过反射机制访问java对象的属性,方法,构造方法等;
2、Java反射机制用途:
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
3、sun为我们提供了那些反射机制中的类:
java.lang.Class; java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;
4、反射实现的方式
Class c=Class.forName("className"); 注明:className必须为全名,也就是得包含包名,比如,cn.xx.UserInfo; Object obj=c.newInstance(); //创建对象的实例 Constructor getConstructor(Class[] params) //根据指定参数获得public构造器 Constructor[] getConstructors() //获得public的所有构造器 Constructor getDeclaredConstructor(Class[] params) //根据指定参数获得public和非public的构造器 Constructor[] getDeclaredConstructors() //获得public的所有构造器 ewInstance(); //创建对象的实例 获得类方法的方法 Method getMethod(String name, Class[] params), 根据方法名,参数类型获得方法 Method[] getMethods() //获得所有的public方法 Method getDeclaredMethod(String name, Class[] params) //根据方法名和参数类型,获得public和非public的方法 Method[] getDeclaredMethods() //获得所以的public和非public方法 获得类中属性的方法 Field getField(String name) //根据变量名得到相应的public变量 Field[] getFields() //获得类中所以public的方法 Field getDeclaredField(String name) //根据方法名获得public和非public变量 Field[] getDeclaredFields() //获得类中所有的public和非public方法
总结一句,以前写的代码,类的熟悉、方法什么东西的都固定了,如果使用反射我们就可以在运行的时候动态的去修改、增删对象的熟悉、方法等等。
spring IOC是如果使用反射来完成对象的注入呢?
1、读取配置文件,或者扫描注解属性
2、根据配置文件,通过反射实例化对象
3、给对象注入依赖的属性
4、放到类似hashMap结构中,供系统调用