所谓依赖注入是指组件间的依赖关系由容器在运行期决定。程序本身并不负责初始化要用到的组件,只有在程序真正运行时,容器才把配置中的组件注入到程序中。我认为这体显了OO思想,现在我们程序本身只要留下接口,任何实现该接口的组件都可以通过配置注入到
程序中,从而减轻了组件之间的依赖关系,很明显也提高了组件的可移植性。依赖注入的缺点是,由于是在配置文件中完了对象的初始化,
其错误在编译期间是无法发现的,有时因为配置的小小疏漏,导致化大量时间来寻找错误。另外因为对象之间的依赖是在容器中设定的,当对象较多时,依赖关系不是像写在Java程序里那样显而易见和易于跟踪。
依赖注入的实现离不开java的反射机制,该机制使得我们可以通过类名来实例化类对象,并设置对象的属性,当然,该类必须符合javabean
规范。以下代码是反射机制的利用:
1. Class cls = Class.forName("com.wqh.hibernate.pojo.Personal");
2. Object obj = cls.newInstance();
3. Method mtd = cls.getMethod("setCity",new Class []{String.class});
4. mtd.invoke(o,new Object[]{"杭州"});
第一行依据类名创建一个类对象。
第二行返回一个实例,其实该实例已经是Personal的实例。
第三行取得一个方法对象,注意取得该对象时我们给了它三个参数,一个是“setCity”,是Pesonal中的方法名,一个是“new Class []{String.class}”,这个数组包含了setCity方法的参数类型,可以有多个。还是一个参数是隐性的,cls对象,它包含了Personal的类信息。
第四行利用invoke方法把“杭州”set进obj对象。
把初始化好的实例注入另一实例,有三种方式
1、接口注入
2、构造注入
3、设值注入
基于同样原理,org.springframework.context.ApplicationContext提供了一个更加完善的实现.利用ApplicationContext,我们可以在类
的实例初始化时做更多的工作,如是否为单例,初始化事件,销毁事件,以及指定属性值,指定依赖关系等等。我们不用ApplicationContext,也照样可以实现自已的依赖注入,但是Spring提供了一套成熟而全面的基础框架,故相对传统模式,节省了大量的代码
配置文件bean.xml:
<bean id="personaldao"
class="com.wqh.hibernate.daoimpl.PersonalDaoImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
使用:
ApplicationContext ctx= new FileSystemXmlApplicationContext("bean.xml");
Personaldao persondao = (Personaldao) ctx.getBean("personaldao");