依赖注入初探

所谓依赖注入是指组件间的依赖关系由容器在运行期决定。程序本身并不负责初始化要用到的组件,只有在程序真正运行时,容器才把配置中的组件注入到程序中。我认为这体显了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");

后记:写文章比应用要复杂,应用只要能用就行了,现在写文章就感觉许多地方无法深入下去,毕竟是知识太浅了。

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...