1  setter注入

  ¤  简单类型

    ♦  在bean中定义引用类型发展并提供可访问的set方法

      public class BookDaoImpl implements BookDao

      {

        private int connectionNumber;

        public void setConnectionNumber(int connectionNumber)

        {

          this.connectionNumber= connectionNumber;

        }

      }

    ♦  配置中使用property标签value属性注入简单类型数据值

      <bean id="bookDao" class="com.feiyan.BookDaoImpl">

        <property name="connectionNumber" value="10"/>

      </bean>

  ¤  引用类型

    ♦  在bean中定义引用类型发展并提供可访问的set方法

      public class BookServiceImpl implements BookService

      {

        private BookDao bookDao;

        public void setBookDao(BookDao bookDao)

        {

          this.bookDao = bookDao;

        }

      }

    ♦  配置中使用property标签ref属性注入引用类型对象

      <bean id="bookService" class="com.feiyan.BookServiceImpl">

        <property name="bookDao" ref="bookDao"/>

      </bean>

      <bean id="bookDao" class="com.feiyan.BookDaoImpl"/>

2  构造器注入

  ¤  简单类型

    ♦  在bean中定义引用类型发展并提供可访问的构造方法

      public class BookDaoImpl implements BookDao

      {

        private String databaseName;

        private int connectionNumber;

        pubolic BookDaoImpl(String databaseName, int connectionNumber)

        {

          this.databaseName = databaseName;

          this.connectionNumber = connectionNumber;

        }

      }

    ♦  配置中使用construct-arg标签name ref属性注入简单类型数据值 有三种方法

      •  第一种方法,name=属性名,存在耦合

      <bean id="bookDao" class="com.feiyan.BookDaoImpl">

        <construct-arg name="databaseName" value="sql"/>

        <construct-arg name="connectionNumber" value="10"/>

      </bean>

      •  第二种方法,使用type=值类型,不能解决多个同类型属性

      <bean id="bookDao" class="com.feiyan.BookDaoImpl">

        <construct-arg type="java.lang.String" value="sql"/>

        <construct-arg type="int" value="10"/>

      </bean>

      •  第三种方法,使用index=位置,不能解决多个同类型属性

      <bean id="bookDao" class="com.feiyan.BookDaoImpl">

        <construct-arg index="0" value="sql"/>

        <construct-arg index="1" value="10"/>

      </bean>

  ¤  引用类型

    ♦  在bean中定义引用类型发展并提供可访问的构造方法

      public class BookServiceImpl implements BookService

      {

        private BookDao bookDao;

        pubolic BookServiceImpl(BookDao bookDao)

        {

          this.bookDao = bookDao;

        }

      }

    ♦  配置中使用construct-arg标签naem ref属性注入引用类型对象  注:name对应构造方法的形参名

      <bean id="bookService" class="com.feiyan.BookServiceImpl">

        <construct-arg name="bookDao" ref="bookDao"/>

      </bean>

      <bean id="bookDao" class="com.feiyan.BookDaoImpl"/>

依赖注入方式的选择

  ¤  强制依赖使用构造器进行,使用setter注入有概率不进行注入造成null对象出现

  ¤  可选依赖使用setter注入,灵活性强

  ¤  Spring框架倡导使用构造器,第三方框架内部大多采用构造器注入的形式进行数据初始化,相对严谨

  ¤  如果有必要可以两者同时使用,使用构造器完成强制依赖的注入,使用setter注入完成可先依赖的注入

  ¤  实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入

  ¤  自己开发的模块推荐使用setter注入