教育改变生活

标题: Spring : 依赖注入 [打印本页]

作者: 却尘    时间: 2024-5-14 17:26
标题: Spring : 依赖注入
依赖注入(DependencyInjection, DI)也被称为控制反转(Inversionof Control,loC)。下面这个打印机的例子可以帮助读者更好的理解依赖注入。
    当項目中的对象比较少时自己new对象还不会有什么问题。而一旦项目中包含多个对象时,多个对象之间的依赖关系会比较夏杂,它们之间的紧密合就会紿代码的测试和重构造成极大的困难。
    在Spring下,使用依赖注入的方式对于相同的功能至于完成更少的工作。
    反射使得应用的构建更加灵活,但仍需注意,如果对反射使用不当,則其成本会相当。Java的反射机制提供的主妥功能有:
1.在程序运行期间判断一个对象属于哪个类。
2.在程序运行期间构造出任意一个类的对象。
3.在程序运行期间判断任意一个类具有的成员变量和成员方法。
4.在程序运行期间调用任意一个对象的方法。
5.生成动态代理
    Java的反射机只通过反射API来实现的,它允许程序在运行过程中取得任何一个已知名称的类的内部信息。反射API位于 java.lang.reflect包中,主要包括几下级类:
1.Constructor类:用来描述一个类的构造方法。
2.Field类:用来描述一个类的成员变量。
3.Method类:用来描述一个类的方法
4.Array:用来对数组进行操作。
    Constroctor、Field、Method这3个类都是JVM (虚拟机)在程序运行时创建的,用来表示加载类中相应的成员。在本节内容中,我们側重介绍Field和Method这两个反射API.因为理解了它们,才能更好地理解SpringIoC容器模拟实现的项目。
    在应用中,如果要使用Field和Method这两个反射API,一般要遵循如下的步骤:
    首先要得到所操作的对象或类的java.lang.Class类的实例。
    然后通过调用获取类中成员变量的函数,如getDeclaredFields()就可以获得该类中定义的所有成员变量的列表,通过调用获取类中方法的函數,如getDeclaredMethods()则可以获得该类中定义的所有方法的列表。
    最后就可以使用反射API来操作获得的成员变量或方法了。
如何在运行中获得所操作的对象或类的Class类的实例呢?通过调用Class类的newlnstance方法便可以创建出类的实例。需要注意的是,使用newlnstance方法创建类实例时只能调用类的默认构造方法,而不能调用其带参数的构造方法。如果想调用参数的构造方法,则需要用到Constructor中的newInstance方法。
admin = Class.forName("domain.Admin");

//创建Admin实例
adminInstance = (Admin)admin.newInstance();
adminInstance.setAdminPhone("156xxxx2366");
Method getAdminPhone =admin.getMethod("getAdminPhone");//getAdminPhone()方法
//执行get方法,传入 adminInstance对象,
//表示执行adminInstance的getAdminPhone方法
String phone = (String)getAdminPhone.invoke(adminInstance);
// 获取对象所有属性,但不包含继承的。
Field[] declaredFields = admin.getDeclaredFields();
for (Field field : declaredFields) {System.out.println(field); }
//获取对象所有公共方法
Method[] methods = admin.getMethods();
for (Method method : methods) {System.out.println(method);}

    其中需要注意的是forName()方法和getClass()方法的区别。有Java开发基础的读者应该知道,一个java.lang.Class对象代表了java应用程序在运行时所加载的类或者接口实例,即被加载的类在JVM中是以Class类的实例形式存在的,Class类的对象是由JVM自动生成的。
    使用Object的getClass()方法可以获取到每一个对象所对应的Class对象,然后就可以使用Class类中提供的方法来操作该Class对象以取得Class类的一些信息。在实际开发过程中,有时候无法事先知道用户要加载什么类,此时必须由用户指定要加载的类名称,再根据该类名称来加载类,在这种情况下,则可以使用Class类提供的静态方法forName()方法来实现动态的加载。
获得类中方法的函数包括:
1.MethodgetMethod(String name,Class[] paramTypes):获得类中具有指定名称、指定参数类型的公共方法,参数name指定方法的名称,paramTypes指定方法的參数类型。
2.Method[]getMethod():获得类中所有的公共方法。
3.MethodgetDeclaredMethod(String name,Class[] paramTypes)获得类中声明的具有指定名称、指定参数类型的方法,不包括从父类继承的方法,参数name指定方法的名称,参数paramTypes指定方法的参数类型.

  4.Method[]getDeclaredMethod()获得类中声明的所有方法,不包括从父类继承的方法





欢迎光临 教育改变生活 (http://bbs.goldoar.com/) Powered by Discuz! X3.2