Spring实战第二章

装配bean

注解释义
@Component表明该类会作为组件类,并告知Spring要为这个类创建bean
@Component(“beanID”)为组件扫描的bean命名
@Named(“beanID”)同上
@ComponentScan默认扫描与配置类相同的包
@ComponentScan(“packageName”)设置组件扫描的基础包
@Configuration配置spring并启动spring容器
@AutoWired声明依赖
@AutoWired(required=false)Item Two

依赖注入的本质:装配(wiring)–创建应用对象之间的协作关系的行为

2.1 Spring配置的可选方案

  • 在XML中进行显式配置
  • 在Java中进行显式配置
  • 隐式的bean发现机制和自动装配

根据项目的需要进行自主选择,最棒的是,可以组合使用,即你可以选择使用XML装配一些bean,使用Spring基于java的配置(JavaConfig)来装配另一些bean,而将剩余的bean让Spring去自动发现。

2.2 自动化装配bean

Spring从两个角度来实现自动化装配:
+ 组件扫描:Spring会自动发现应用上下文中所创建的bean
+ 自动装配:Spring自动满足bean之间的依赖

2.2.1 创建可被发现的bean

通过注解@Component表明该类会作为组件类,并告知Spring要为这个类创建bean
通过注解@ComponentScan默认扫描与配置类相同的包

或者,通过XML来启用组件扫描

<beans>
  <context:component-scan base-package="packageName" />
</beans>

2.2.4 通过为bean添加注解实现自动装配

package soundsystem
import *;

@component
public class CDPlayer implements MediaPlayer{
  private CompactDisc cd;

  @AutoWired
  public CDPlayer(CompactDisc cd){
    this.cd = cd;
  }

  public void play(){
    cd.play();
  }
}

通过自动装配,将一个CompactDisc注入到CDPlayer之中

@AutoWired注解不仅能够用在构造器上,还能用在属性的setter方法上。
与@Inject效果类似

2.3 通过java代码装配bean

2.3.1 创建配置类

package soundsystem
import *;

@Configuration
public class CDPlayerConfig{

}

创建JavaConfig类的关键在于为其添加@Configuration注解,@Configuration注解表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。

2.3.2 声明简单的bean

@Bean
public CompactDisc sgtPeppers(){
  return new SgtPeppers();
}

@Bean注解会告诉Spring这个方法会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean实例的逻辑。
bean的ID有默认值,也可通过@Bean(name=”abc”)来设置

2.3.3 借助JavaConfig实现注入

2.4 通过XML装配bean

2.4.3 借助构造器注入来初始化bean

在XML中声明DI时,会有多种可选的配置方案和风格。具体到构造器注入,有两种基本的配置方案可供选择:
+ 元素
+ 使用Spring3.0引入的c-命名空间

<bean id="cdPlayer" class="soundsystem.CDPlayer"
  <constructor-arg ref="compactDisc" />
</bean>
<bean id="cdPlayer" class="soundsystem.CDPlayer"
      c:cd-ref="compactDisc" />

c: c-命名空间前缀
cd 构造器参数名
-ref 注入bean引用
compactDisc 要注入的bean的ID

将字面量注入到构造器中
<bean id="compactDisc" class="soundsystem.BlankDisc"
  <constructor-arg value="Sgt.Pepper's Lonely Hearts Club Band" />
  <constructor-arg value="The Beatles" />
</bean>
<bean id="compactDisc" class="soundsystem.BlankDisc"
      c:_title="Sgt.Pepper's Lonely Hearts Club Band"
      c:_artist="The Beatles" />

<bean id="compactDisc" class="soundsystem.BlankDisc"
      c:_0="Sgt.Pepper's Lonely Hearts Club Band"
      c:_1="The Beatles" />
装配集合
<bean id="compactDisc" class="soundsystem.BlankDisc"
  <constructor-arg value="Sgt.Pepper's Lonely Hearts Club Band" />
  <constructor-arg value="The Beatles" />
  <constructor-arg>
    <list>
      <value>Sgt.Pepper's Lonely Hearts Club Band</value>
      <value>a</value>
      <value>b</value>
      <value>c</value>
    </list>
  </constructor-arg>
</bean>
<bean id="compactDisc" class="soundsystem.BlankDisc"
  <constructor-arg value="Sgt.Pepper's Lonely Hearts Club Band" />
  <constructor-arg value="The Beatles" />
  <constructor-arg>
    <list>
      <ref bean="beanID1" />
      <ref bean="beanID2" />
      <ref bean="beanID3" />
    </list>
  </constructor-arg>
</bean>

2.4.4 设置属性

  • 构造器注入
  • 属性注入(setter方法注入)
    强依赖使用构造器注入,可选性的依赖使用属性注入
<bean id="cdPlayer" class="soundsystem.CDPlayer"
  <property name="compactDisc" ref="compactDisc" />
</bean>
<bean id="cdPlayer" class="soundsystem.CDPlayer"
      p:compactDisc-ref="compactDisc" />

元素为属性的setter方法所提供的功能与元素为构造器所提供的功能是一样的。

将字面量注入到属性中

2.5 导入和混合配置

2.5.1 在JavaConfig中引用XML配置

package soundsystem;
import *;

@Configuration
@Import(CDPlayerConfig.class)
@ImportResource("classpaht:cd-config.xml")
public class SoundSystemConfig{

}

2.5.2 在XML配置中引用JavaConfig

<bean class="soundsystem.CDConfig" />
<bean id="cdPlayer" class="soundsystem.CDPlayer"
      c:cd-ref="compactDisc" />
<import resource="cdplayer-config.xml" />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值