依赖注入的类型

  • 构造器注入(constructor injection)传入继承同一接口的不同类
  • Setter注入
  • 其他注入

依赖注入的方法

  1. 自动配置
  2. Java配置
  3. XML配置

1、自动配置

()中为可选参数
* @Configuration 配置注解 说明是配置类
* @Component //(“id”)设置ID 组件注解,自动扫描时会扫描到这个类
* @ComponentScan //设置扫描的包(“package name”) 组件扫描

  • @AutoWired //添加(required=false)没有匹配bean时不报错 自动DI(依赖注入)
    可在构造函数处构造器注入,也可以在setter处注入
    也等同于@Inject

2、Java配置DI

@Bean(name="xxx")//指定一个bean的id
public 类实现的接口名 类名(){//类名第一个字母小写
    return new 类对象();
    //若有依赖可以(依赖的接口或new 接口()但不推荐)bean一般都是单例的
    return new 类对象(依赖接口);
}
//也可以用setter
@Bean(name="xxx")//指定一个bean的id
public 类实现的接口名 类名(){//类名第一个字母小写
    类 ref = new 类(依赖对象);
    ref.setter(依赖对象);
    return ref;
}

3、XML配置DI

构造器注入

<beans xnlns="http://ww.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context">


      <bean id="cdPlayer" class="soundsystem.CDPlayer">
        <!--构造器注入引用-->
        <constructor-arg ref="compactDisc" />
        <!--为构造函数赋字面量-->
        <constructor-arg value="xxx">
        <constructor-arg value="xxx">
      </bean>

      <!--constructor-arg比c空间能额外做到的是可以为参数装填列表等容器,
      从而做到了批量装填,且带有预先value或装填引用-->
      <constructor-arg>
      <list>
          <value>xxx</value>
          <value>xxx</value>
      </list>
      <list>
          <ref bean="xxx"/>
          <ref bean="xxx"/>
      </list>
      </constructor-arg>

</beans>
<beans xnlns="http://ww.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:c="http://www.springframework.org/schma/c"
      xsi:schemaLocation="http://springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context">

      <!-- configuration cetains no here -->
      <!--构造器注入也可以用c命名空间,但是要引入以下这个xsd-->
      <!--xmlns:c="http://www.springframework.org/schma/c"-->
      <!--用法-->
      <!--c:_参数名="xxx"为构造函数赋字面量 假如只有一个参数可以直接_占位,和ref一样-->
      <!--c是命名空间
      cd是指构造器参数名,也可以用位置代替比如0,或者根本用_表示
      -ref是注入bean引用-->
      <bean id="cdPlayer" class="soundsystem.CDPlayer" c:cd-ref="compactDisc"
      c:_参数名="xxx"/>
</beans>

<beans />是根元素
网址是xsd文件,其中包括了beans的XML元素

Setter注入

<!--XML的Setter注入方法,为name为xxx的属性注入类为xxx的对象-->
<bean id="xxxx" class="xxx">
    <property name="xxx" ref="xxx">
    <!--同样也可以装填列表等容器-->
    <property name="xxx">
        <list>
          <value>xxx</value>
          <value>xxx</value>
        </list>
    </property>
</bean>

<!--或者用p命名空间也可以做到同样效果-->
<bean id="xxxx"
    class="xxx"
    p:xxx-ref="xxx"
/>
<!--p空间也可以装填字面量,但也不能批量装填,但可以引入Spring util-->
<!--引入util的xsd后,可以用<util:list>>

Spring Tool Suite可以快捷方便创建Spring XML,用来装配bean最基本的XML元素包含在spring-beans模式之中。

在Java配置中引用其他

//引入Java配置中的Bean
使用@Import
注解引入其他配置类进行依赖注入
@Import(xxxxConfig.class)

//引入XML的Bean
@ImportResource(xxx.xml)

在XML配置中引用其他

<!--将Java配置类作为一个bean引入-->
<bean class="xxxConfig" />
<!--引入其他XML-->
<import resource="xxx.xml">

总结

《Spring In Action》中较为推荐自动配置 > Java > XML,在实际中都采用三者混合,减少显示配置也可以降低代码复杂度

《Spring In Action》第二章

KAI Java, Spring