【Spring3】依赖注入

来源:互联网 发布:方伯谦 知乎 编辑:程序博客网 时间:2024/06/10 20:35

       在编程的过程中,我们通常的做法就是使用new一个依赖类再调用类实例的方法,这种方法存在的一个问题就是new的类实例不好管理,为了更好的开发效率,我们使用了依赖注入的思想来管理我们的类,依赖注入的含义就是:当某个java实例(调用者)需要另一个java实例(被调用者)时,创建被调用者的工作不再由调用者完成,而是由Spring容器来完成,然后注入调用者.

       Spring的依赖注入通常两种方式:设值注入和构造注入.

设值注入

        设值注入是指IoC容器使用属性的setter方法来注入被依赖的实例,这种注入方式在简单直观,因而在Spring的依赖注入中大量使用.

        下面举一个使用设值注入的例子

         

public interface Person{//定义一个使用斧子的方法public void useAxe();}public interface Axe{//Axe接口里有个砍的方法public String chop();}public class Chinese implements Person{private Axe axe;//设值注入所需的setter方法public void setAxe(Axe axe){this.axe=axe;}//实现Person接口的useAxe方法public void useAxe(){//调用axe的chop()方法。表明Person对象依赖于axe对象System.out.println(axe.chop());}}public class StoneAxe implements Axe{public String chop(){return "使用石斧砍柴";}}public class BeanTest{public static void main(String[] args) throws Exception{//创建Spring容器ApplicationContext ctx=new ClassPathXmlApplicationContext("bean.xml");Person p=ctx.getBean("Chinese",Person.class);p.useAxe();}}
       下面是Spring来配置依赖注入,为Chinese类注入StoneAxe实例.

        

<beans><bean id="chinese" class="Chinese"><property name="axe" ref="stoneAxe"/></beans>bean id="stoneAxe" class="StoneAxe" /></beans>

构造注入

               使用构造注入的方式在构造实例时,已经为其完成了依赖关系的初始化。

         对设值注入的代码进行简单的修改.

         

public class Chinese implements Person{private Axe axe;//构造注入所需的带参数的构造器public Chinese(Axe axe){this.axe=axe;}//实现Person接口的useAxe方法public void useAxe(){//调用axe的chop()方法。表明Person对象依赖于axe对象System.out.println(axe.chop());}}
         Spring配置文件

         

<beans><bean id="chinese" class="Chinese"><constructor-arg  ref="stoneAxe"/></beans>bean id="stoneAxe" class="StoneAxe" /></beans>


要点          依赖注入以配置文件管理Bean实例之间的耦合,让Bean实例之间的耦合从代码层次分离出来,依赖注入是一种优秀的解耦方式.

         使用Spring IoC容器有3个基本的要点

         1.应用程序的各组件面向接口编程,面向接口编程可以将各组件之间的耦合提升到接口层次,从而有利于项目后期                 的扩展.

         2.应用程度的各组件不再由程序主动产生,而是由Spring容器负责产生、并初始化

         3.Spring采用配置文件或者Annotation来管理Bean的实现类、依赖关系,Spring容器则根据配置文件、反射爱创                建实例,并注入依赖关系。


对比

          这两种注入方式并没有绝对的好坏,只是适应的场景不同.

          设值注入有如下优点:

                 1.与传统的JavaBean写法相似,通过setter犯法设定依赖关系显得更加直观自然.

                 2.复杂的依赖关系,采用构造注入,会导致构造器过于臃肿,Spring在创建Bean实例时需要同时实例化其依赖                              的全部实例,因而导致性能下降.使用设值注入,则能避免这些问题.

                 3.在某些属性可选的情况下,多参数的构造器更加笨重.

          构造注入也有其优点:

                 1.构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入.

                 2.对于依赖关系无需变化的Bean,构造注入更有用.因为没有setter方法,所有的依赖关系全部在构造器内设                                 定,因此无须担心后续的代码对依赖关系产生破坏.

                 3.依赖关系只能在构造器中设定,则只用组件的创建者才恩呢该改变组件的依赖关系.对组件的调用者而言,组                             件内部的依赖关系完全透明,更符合高内聚的原则.

           建议采用以设值注入为主,构造注入为辅的注入策略.对于依赖关系无须变化的注入,尽量采用构造注入,而其他的依赖关系的注入则考虑采用设值注入.

1 0
原创粉丝点击