Spring--多种Bean的注入(上)

有了前三篇的铺垫,这篇该来点干货了,说说这所IoC婚姻介绍所的各种客户,及客户在IoC婚姻介绍所的登记方式,也就是说Spring中各种Bean及他们的注入方式,这里主要介绍XML方式,Annotation有时间单独写一篇。

按照Spring的胃口,这家IoC婚姻介绍所是接受任何客户(Bean)的,包括基本数据类、集合、自定义类等,接口和抽象类较特殊,大家都知道他俩是不能实例化的,因此在Spring中是不能注入的,但是可以被注入的,举个例子来说,他俩的共同的做人原则是不施舍,但这并不能阻止别人施舍给他俩,不知道举得例子是否恰当,具体用法见后文。再说客户在IoC中的注册方式(创建Bean),总共有三种情况:

1.通过构造方法创建;

2.通过静态工厂方法创建;

3.通过实例工厂方法创建;

第一种方式最为常用。这三种创建方式中,创建Bean并不是重点,重点是通过这三种不同的方式维护了Bean之间的依赖关系,如此才分出这三种情况,单单为创建一个Bean分出几种方式有点像茴香豆的茴有几种写法,毫无意义。

1.通过构造方法创建

这里可以分为构造器和SetterDI,本人较喜欢后者。构造方法的注入是通过调用带参数的构造器来实现的,因此,你想把B注入到A类,那在A类必须要实现一个B为参数的构造方法,B也需要有一个无参构造器,请看下面的例子(示例代码均来自网络):

package examples;

public class ExampleBean {

    // No. of years to the calculate theUltimate Answer

    private int years;

    // The Answer to Life, the Universe,and Everything

    private String ultimateAnswer;

    public ExampleBean(int years, StringultimateAnswer) {

        this.years =years;

       this.ultimateAnswer = ultimateAnswer;

    }
}

以上是你要在Java代码中完成的,接下来你需要在SpringXML文件中完成如下配置:

<bean id="exampleBean" class="examples.ExampleBean">

 <constructor-arg type="int" value="7500000"/>

 <constructor-arg type="java.lang.String" value="42"/>

</bean>

     有时候代码就是最好的语言,废话不多说,我们来看第二个例子:

      Java部分还沿用上面的代码。

     下面是XML中的配置信息:

<bean id="exampleBean" class="examples.ExampleBean">

 <constructor-arg index="0" value="7500000"/>

 <constructor-arg index="1" value="42"/>

</bean>

从上下配置对比中,可以清晰的看出,下面这种用到了index这个属性,Spring支持index属性来显式指定构造参数的索引,这样不但可以解决多个简单属性的混淆问题,还可以解决有可能有相同类型的2个构造参数的混淆问题了,注意index是从0开始。别忘了类型的问题,能在配置中指定参数类型的就尽量指定,细心一些没坏处。

      OK!下面来看看Setter注入的方式,这种注入方式是通过调用set方法实现注入的,如果类A依赖类B,那A是要提供对B私有变量,并实现set方法,看下面的例子:

Java部分:

public class SyncLogBO{

      //注入对象metaService

      privateMetaService metaService;

        //一定要写被注入对象的set方法

      publicvoid setMetaService(MetaService metaService) {

           this.metaService= metaService;

      }

Xml配置部分:

      <bean id="AdhesiveSyncLogBO" class="com.boco.irms.adhesive.location.sync.SyncLogBO">

           <property name="metaService" ref="AdhesiveMetaService"/>

      </bean>

默认情况下,ApplicationContext实现中的Bean采用提前实例化的singleton模式,这样做的好处是可以提前进行配置检查。

2.通过静态工厂方法创建

 静态工厂方法就是调用静态工厂的方法来获取自己需要的对象,定义一个Bean使用自己类上的静态工厂方法来创建自己,下面还是举例说明:

Java部分,UserDao.java:

package research.spring.beanfactory.ch2;

public class UserDao {
       public static UserDao getInstance() {

              return new UserDao("static factory method");
       }
 
       private String name = "";
 
       public UserDao(String name) {
              this.name = name;
       }
 
       public void create() {

              System.out.println("create user from - " + name);
       }
}

增加一个getInstance()方法来创建自己。

Xml部分:

<beans>
    <bean name="userManager"  class="research.spring.beanfactory.ch2.UserManager">
      	<property name="userDao" ref="userDao"/> 
    </bean>
    <bean name="userDao" class="research.spring.beanfactory.ch2.UserDao" factory-method="getInstance" / >
beans>


factory-method定义了userDao Bean通过使用getInstance()方法来创建自己实例。userManager通过Setter DI获取userDao。静态工厂方法存在的一些限制:

①静态工厂方法不能有参数,也不能在Spring中定义静态工厂方法的参数;

②静态工厂方法只能是public,不能是private和protected;

③静态工厂方法不能和构造方法注入一起使用。

3.通过实例工厂方法创建

定义一个Bean,使用这个Bean的工厂对象上的工厂方法来创建自己。继续上面UserDao的例子,定义一个Userdao的factory的来创建UserDao。

Java代码,UserDaoFactory.java:

package research.spring.beanfactory.ch2;
 public class UserDaoFactory{
   public UserDao getUserDao(){

          return new UserDao("UserDaoFactory");
   }
}

Xml配置部分:

<beans>
    <bean name="userManager"  class="research.spring.beanfactory.ch2.UserManager">
		<property name="userDao" ref="userDao"/>      
    </bean>
    <bean name="userDao" class="research.spring.beanfactory.ch2.UserDao" factory-bean="userDaoFactory" factory-method="getUserDao" />
    <bean name="userDaoFactory" class="research.spring.beanfactory.ch2.UserDaoFactory"/>
beans>

通过上面的配置,基本可以看出实例工厂比静态工厂就多了一个factory-bean,它定义了工厂bean;看到这里,就能想到,静态工厂创建和实例工厂创建是存在相同的限制的,就是我上面列举的那三条。不同的是实例工厂方法不是静态的,而静态工厂方法必须是静态的。

三种注入的方式讲完了,现在说一说开发中对他们的选择,spring虽然对工厂模式提供了完美的支持,但是在用到IoC模式设计系统时,就尽量不要用工厂类,spring支持工厂模式更多的是用来解决老系统的遗留问题的,是为了和遗留系统很好的集成,因此,在遇到遗留系统时,工厂模式是不错的选择,但如果您正在开发一套新系统,那就尽量不要使用工厂模式。

这篇介绍注入方法,下篇讲每种Bean的配置方式(以Setter为准),以及一些重要的属性。

你可能感兴趣的:(Spring--多种Bean的注入(上))