当前位置 : 首页 » 文章分类 :  开发  »  Spring-装配Bean

Spring-装配Bean

spring容器提供了三种主要的装配机制:

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

自动化装配

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

@Component注解,这个简单的注解表明该类会作为组件类,并告知Spring要为这个类创建bean
组件扫描默认是不启用的。我们还需要显式配置一下Spring,从而命令它去寻找带有@Component注解的类,并为其创建bean。
@ComponentScan注解,@ComponentScan默认会扫描与配置类相同的包以及这个包下的所有子包,查找带有@Component注解的类。

缺点:如果第三方库中没有注解,无法将其自动装配到应用中。


java config 装配

@Bean注解,@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean
默认情况下,bean的ID与带有@Bean注解的方法名是一样的。如果你想为其设置成一个不同的名字的话,可以通过name属性指定一个不同的名字:

@Bean(name="lonelyHeartsClubBand")
public CompactDisc sgtPeppers() {
  return new SgtPeppers();
}

@Configuration注解,@Configuration注解表明这个类是一个配置类,该类应该包含Spring应用上下文中如何创建bean的细节


xml装配

声明需要的xml名称空间与模式文档

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

构造器注入

当Spring发现这个<bean>元素时,它将会自动调用class对应的默认构造器来创建bean。

构造器注入初始化bean的两种方法:

  • <constructor-arg>元素
  • 使用Spring 3.0所引入的c-命名空间
    使用c-命名空间的属性无法实现装配集合的功能。

constructor-arg 元素注入

<bean id="compactDisc" class="soundsystem.SgtPeppers" />

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

c-命名空间注入

<beans>中声明c命名空间:

xmlns:c="http://www.springframework.org/schema/c"
<bean id="cdPlayer" class="soundsystem.CDPlayer" c:cd-ref="compactDisc" />

解释:

属性名以”c:”开头,也就是命名空间的前缀。接下来就是要装配的构造器参数名,在此之后是”-ref”,这是一个命名的约定,它会告诉Spring,正在装配的是一个bean的引用,这个bean的名字是compactDisc,而不是字面量”compactDisc”

字面量注入

ref属性用来引用其他的bean
value属性用来指定字面量,即常量值

集合注入

java代码:

public class BlankDisc implements CompactDisc {
  private String title;
  private String artist;
  private List<String> tracks;

  public BlankDisc(String title, String artist, List<String> tracks) {
    this.title = title;
    this.artist = artist;
    this.tracks = tracks;
  }

  public void play() {
    System.out.println("Playing " + title + " by " + artist);
    for (String track : tracks) {
      System.out.println("-Track: " + track);
    }
  }
}

xml配置:

<bean id="compactDisc" class="soundsystem.collections.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>With a Little Help from My Friends</value>
      <value>Lucy in the Sky with Diamonds</value>
      <value>Getting Better</value>
      <value>Fixing a Hole</value>
      <value>She's Leaving Home</value>
      <value>Being for the Benefit of Mr. Kite!</value>
      <value>Within You Without You</value>
      <value>When I'm Sixty-Four</value>
      <value>Lovely Rita</value>
      <value>Good Morning Good Morning</value>
      <value>Sgt. Pepper's Lonely Hearts Club Band (Reprise)</value>
      <value>A Day in the Life</value>
    </list>
  </constructor-arg>
</bean>

set和list元素的区别不大,其中最重要的不同在于当Spring创建要装配的集合时,所创建的是java.util.Set还是java.util.List。如果是Set的话,所有重复的值都会被忽略掉,存放顺序也不会得以保证。不过无论在哪种情况下,set或list都可以用来装配List、Set甚至数组


设置属性

设置属性的两种方式:

  • <property>元素
  • p-命名空间

<property>元素为属性的Setter方法所提供的功能与<constructor-arg>元素为构造器所提供的功能是一样的。

p-命名空间注入

<beans>中声明p命名空间:xmlns:p="http://www.springframework.org/schema/p"
p-命名空间注入bean引用
<bean id="cdPlayer" class="soundsystem.properties.CDPlayer" p:compactDisc-ref="compactDisc" />

解释:

p-命名空间注入字面量

<bean id="compactDisc"
    class="soundsystem.properties.BlankDisc"
    p:title="Sgt. Pepper's Lonely Hearts Club Band"
    p:artist="The Beatles">

混合装配

在Spring中,可以将JavaConfig的组件扫描与自动装配、JavaConfig装配、或XML配置混合在一起。
在自动装配时,Spring并不在意要装配的bean来自哪里。自动装配的时候会考虑到Spring容器中所有的bean,不管它是在JavaConfig或XML中声明
的还是通过组件扫描获取到的。


上一篇 2016年第四季度运动记录

下一篇 PostgreSQL-基础

阅读
1,191
阅读预计5分钟
创建日期 2016-12-28
修改日期 2018-06-22
类别
百度推荐