Java可以通过反射机制动态生成对象。例程见Java反射机制 从示例上可以看出,Java通过Class.forName()就可以生成类对象,然后生成类实例。而且可以通过Field设备属性。
- Class c1 = Class.forName("my.unittest.com.Book");
- Object o = c1.newInstance();
- Book b = (Book)o;
- Field idF = c.getDeclaredField("bookname");
- idF.set(o, "Thinking in Java");
- b.printBookName();
这样就可以在配置文件XML里设定了类名,对象属性,然后通过Java反射机制实现创建新的对象。Spring的IOC依赖反转就是这样实现的。一个对象依赖于另一个对象,被依赖的对象现在可以写在配置文件里,如果需要改变该被依赖对象,就可以直接通过容器生成该对象。
控制反转:我们在使用一个类型的实例实现某个功能时,需要先new出该类型的一个实例,并赋值给我们声明的某个引用变量,这样我们才能够使用该变量进行操作。而new和赋值本事我们自己的权限,此处便是将该控制权限反转交给了spring容器。
依赖注入:某个类型要完成一个功能往往需要其他类型的变量来完成,我们在程序中往往通过自己new的方式来完成这个需求,而在spring中,容器会帮助我们将这种装配的功能实现,这便是依赖注入。
配置文件例子:
<bean id="StudentDao" class="me.ml.dao.StudentDaoImpl">
<property name="sqlSessionFactory" ref="sessionFactory"></property>
</bean>
public static void main(String[] args) {
cxt = new ClassPathXmlApplicationContext("Beans.xml");
IStudentDao sd = (IStudentDao) cxt.getBean("StudentDao");
List<Student> students = sd.list();
System.out.println("STUDENT表的记录数为:" + students.size());
for (int i = 0; i < students.size(); i++)
System.out.println(students.get(i).toString());
}
容器通过配置文件找到me.ml.dao下面的StudentDaoImpl.java生成Bean名为StudentDao的对象,然后强制转换为IStudentDao的接口,这个接口提供了List()方法,调用该方法。