Spring实战之IOC bean装配

前言

  在spring中,对象无需自己查找或创建与之关联的其他对象,相反,容器负责把需要相互协作的对象引用赋予各个对象,创建应用对象之间协作关系的行为称为装配。Spring有三种装配机制,且这些装配机制是可以互相搭配的,一些bean使用XML装配,另一些使用javaconfig装配也是可以的。:

  1. 隐式的bean发现机制和自动装配
  2. 在Java 中进行显式装配
  3. 在XML中显式装配

一、自动化装配bean:

  • 组件扫描:Spring自动发现应用上下文中所创建的bean
  • 自动装配:Spring自动满足bean之间的依赖

比如一个CD播放机(CDPlayer类),需要注入CD来进行播放,CD为CompactDisc接口,有一个类实现该接口,该类为SgtPeppers 。

@Component注解
@Component
public class SgtPeppers implements CompactDisc
{ 
   Xxx…
}

表示该类会作为组件类(组件扫描默认不启动,即加上该注解后要用@CamponentScan来显式的来扫描)。Spring会为所有的bean都设置id,默认为类名第一个字母小写,或者也可以手动设置id,@Component(“xxx”) xxx表示手动设置的id名

@ComponentScan注解

  启用组件扫描,@ComponentScan默认会扫描与配置类相同的包。查找带有@Component注解的类,并在Spring中自动为其(@Component注解的类)创建一个bean,若想扫描不同包,可以@ComponentScan(basePackages=“xxx”),xxx表示包名。如果是多个包,那么就用@ComponentScan(basePackages={“packge1”,”packge2”})数组表示,或者使用@ComponentScan(basePackageClasses={CDPlayers.class,DVDPlayers.class,...})使用xxx.class指定包中含有的类或接口。

@Configuration注解

@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为配置spring容器(应用上下文)

@ContextConfiguration注解

在CDPlayerTest测试类前加上一句@ContextConfiguration(classes=CDPlayerConfig.class)

注解@ContextConfiguration会告诉它需要在CDPlayerConfig中加载配置。 因为CDPlayerConfig类中包含了@ComponentScan, 因此最终的应用上下文中应该包含CompactDisc bean

@Autowired注解

通过@Autowired注解来实现自动装配bean:

@Autowired
Public void insertDisc(CompactDisc cd)
{
     This.cd=cd;
}

通过该注解,使得spring自动装配所需的CompactDisc bean。

结合实例详解自动配置:

配置类:

@Configuration 注解标记为配置类
@ComponentScan 并扫描所有组件

组件类:

@Component 标记为组件类
@Autowired 组件类方法中需要加载其他类:

@Autowired
public CDPlayer(CompactDisc cd) {
     this.cd = cd;
}
测试类:

@RunWith(SpringJUnit4ClassRunner.class)使用JUnit4进行测试

@ContextConfiguration(classes=CDPlayerConfig.class) 加载所需要的配置类

@Autowired 加载需要的其他bean

@Test 使用JUnit4进行测试

如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class ConstructorArgReferenceTest {

  @Autowired
  private MediaPlayer player;

  @Test
  public void play() {
    player.play();
  }

}

二、使用java代码进行装配:

  就是在方法前加上@bean注解,类似于xml文件的<bean/>

  @Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。

例:

@Configuration 
public class AppConfig() 
{ 
   @Bean 
   public MyService myService() 
   { 
      return new MyServiceImpl(); 
   } 
}  

使用如上的注解相当于在配置文件中使用如下的配置:

<beans> 
      <bean id="myService" class="com.hello.MyServiceImpl" />
</beans> 

结合实例详解JavaConfig配置:

配置类:

@Configuration 注解标记为配置类

@Bean 告诉Spring该方法要返回一个对象,该对象要注册为上下文中的bean

  在Java代码配置中,不需要注解组件类,因为若在其它类中需要用到这个类,使用@bean即可为该类注册bean

测试类:

@RunWith(SpringJUnit4ClassRunner.class): 使用JUnit4进行测试

@ContextConfiguration(classes=CDPlayerConfig.class) : 加载配置类

@Autowired: 加载需要的其他bean
@Test : 使用JUnit4进行测试

如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {

  @Autowired
  private MediaPlayer player;

  @Test
  public void play() {
    player.play();
  }

}

三、使用XML进行装配:

@Component("user") 
public class user
{
      ......
}  

等效于XML配置

 <bean id="user"class="main.user"/> 

就是说@Component配置了一个bean组件,相当于在XML中的这行代码

3.1 使用XML配置构造器bean

  • 无构造器类的bean声明
<bean id="compactDisc" class="soundsystem.SgtPeppers" />
  • 构造器有基本数据类型参数的bean声明:
publicBlankDisc(String title, String artist) 
{
    this.title = title;
    this.artist = artist;
}
<bean id="compactDisc" class="soundsystem.BlankDisc">
    <constructor-arg value="Sgt.Pepper's Lonely Hearts Club Band" />
    <constructor-arg value="The Beatles"/>
</bean>
  • 构造器中参数是其他类的bean声明:
<bean id="cdPlayer" class="soundsystem.CDPlayer">
    <constructor-arg ref="compactDisc" />
</bean>
  • 构造器中参数有集合类如list的bean声明:
<bean id="compactDisc" class="soundsystem.collections.BlankDisc">
    <constructor-arg value="Sgt.Pepper's Lonely Hearts Club Band" />
    <constructor-arg value="TheBeatles" />
    <constructor-arg>
      <list>
        <value>Sgt. Pepper's LonelyHearts Club Band</value>
        <value>With a Little Help from MyFriends</value>
        <value>Lucy in the Sky withDiamonds</value>
      </list>
    </constructor-arg>
  </bean>
C命名空间:除了上面的constructor还可使用c命名空间配置构造器

C命名空间

装配引用:
  • 使用参数名:c:cd-ref=
<beanid="cdPlayer" class="soundsystem.CDPlayer"
        c:cd-ref="compactDisc" />
  • 使用参数索引c:_0-ref=
<bean id="cdPlayer" class="soundsystem.CDPlayer"
        c:_0-ref="compactDisc1" 
        c:_1-ref="compactDisc2" />
  • 若只有一个参数:c:_ -ref
<bean id="cdPlayer"class="soundsystem.CDPlayer"
      c:_ -ref="compactDisc" />
装配字面量:

  字面量是指由字母,数字等构成的字符串或者数值,它只能作为右值出现,所谓右值是指等号右边的值。在spring中指构造器参数是基本数据类型。

  • 构造器有多个参数时用参数名表示 c:_title=”xxx” …
<beanid="compactDisc" class="soundsystem.BlankDisc"
       c:_title = "Sgt. Pepper's LonelyHearts Club Band"
       c:_artist ="The Beatles" />
  • 构造器有多个参数时用数字索引表示c:_0=”xxx” …
<beanid="compactDisc" class="soundsystem.BlankDisc"
        c:_0="Sgt. Pepper's Lonely HeartsClub Band"
        c:_1="The Beatles" />
  • 构造器只有一个参数时用表示
<bean id="cdPlayer"class="soundsystem.CDPlayer"
        c:_="Sgt. Pepper's Lonely HeartsClub Band" />

3.2使用XML配置属性bean

  属性通过property注入bean:
  这里的给对象注入值不是通过构造器注入,而是通过setter方法直接给对象的属性注入值。首字母可以不区分大小写:即name=”name/size”与name=”Name/Size”是等同的

  • 属性是类对象
<beanid="cdPlayer" class="soundsystem.properties.CDPlayer">
    <property name="compactDisc" ref="compactDisc" />
</bean>
  • 属性是基本数据类型
<beanid="cake" class="main.Cake"
   <property name="name" value="Blueberry Cheesecake"/>
   <property name="size" value="7"/>
</bean>
p命名空间:除了上面的property还可使用p命名空间配置属性

P命名空间

  • 属性是类对象
<beanid="cdPlayer" class="soundsystem.properties.CDPlayer"
    p:compactDisc-ref="compactDisc"/>
  • 属性是基本数据类型
<bean id="compactDisc" class="soundsystem.properties.BlankDisc"
    p:title="Sgt. Pepper's Lonely HeartsClub Band"
    p:artist="The Beatles">
    <property name="tracks">
      <list>
        <value>Sgt. Pepper's LonelyHearts Club Band</value>
        <value>With a Little Help from MyFriends</value>
        <value>Lucy in the Sky withDiamonds</value>
      </list>
    </property>
  </bean>
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值