[Spring] 注入Bean属性

简介:

通常,JavaBean的属性是私有的,同时拥有一组存取器方法,setXXX()和getXXX()形式存在。Spring可以借助属性的set方法来配置属性的值,以实现setter方式的注入。

Kenny是一个很有天赋的乐曲演奏家,由Intrumentalist类定义,如下:

package com.springinaction.springidol;

public class Instrumentalist implements Performer {
    public Instrumentalist() {}

    public void perform() throws PerformanceException {
        System.out.println("Playing " + song + " : ");
        instrument.play();
    }

    private String song;

    public void setSong(String song) {
        this.song = song;
    }

    public String getSong() {
        return song;
    }

    public String screamSong() {
        return song;
    }

    private Instrument instrument;

    public void setInstrument(Instrument instrument) {
        this.instrument = instrument;
    }
}

Instrument接口定义如下:

package com.springinaction.springidol;

public interface Instrument {
    void play();
}

1 注入简单值

在spring中可以使用<property>元素配置bean的属性,如下例子展示了kenny bean的配置:

<bean id="kenny" class="com.springinaction.springidol.Instrumentalist">
       <property name="song" value="Jingle Bells" />
</bean>

2 引入其他Bean

Kenny是一个天才的演奏家,他可以演奏任何乐器,只要这个乐器实现了Instrument接口,定义一个乐器类Saxophone:

package com.springinaction.springidol;

public class Saxophone implements Instrument {
    public Saxophone() {}

    public void play() {
        System.out.println("TOOT TOOT TOOT");
    }
}

在Kenny演奏萨克斯之前,我们现在spring中将它声明为一个bean,如下所示:

<bean id="saxophone" class="com.springinaction.springidol.Saxophone" />

声明之后就可以把它赋给Kenny演奏了,我们对Kenny的配置做如下修改:

<bean id="kenny" class="com.springinaction.springidol.Instrumentalist">
       <property name="song" value="Jingle Bells" />
       <property name="instrument" ref="saxophone" />
</bean>

下面我们可以执行如下代码让Kenny表演:

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-idol.xml");
Performer performer = (Performer)ctx.getBean("kenny");
performer.perform();

输出结果为:

Playing Jingle Bells :
TOOT TOOT TOOT

注入内部bean
内部bean是定义在其他bean内部的bean,如下配置将萨克斯声明为内部bean:

<bean id="kenny" class="com.springinaction.springidol.Instrumentalist">
       <property name="song" value="Jingle Bells" />
       <property name="instrument">
              <bean class="com.springinaction.springidol.Saxophone" />
       </property>
</bean>

内部bean并不仅限于setter注入,我们还可以把内部bean装配到构造方法的入参中,正如下面的duke的新声明所展示的:

<bean id="duke" class="com.springinaction.springidol.PoeticJuggler">
       <constructor-arg value="25" />
       <constructor-arg>
              <bean class="com.springinaction.springidol.Sonnet29" />
       </constructor-arg>
</bean>

内部bean没有ID属性,虽然为内部bean配置一个ID属性完全是合法的,但是却没有必要。内部类最大的缺点:不能被复用。内部bean仅适用于一次注入,而且也不能被其他bean应用。使用内部bean会影响Spring XML配置的可读性。

3 使用spring的命名空间p装配属性

spring的命名空间p提供了另一种bean属性的装配方式,该方式不需要配置如此多的尖括号。
命名空间p的schema URI为http://www.springframework.org/schema/p。如果你想使用命名空间p,主需要在spring的XML配置中增加如下一段声明:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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-3.0.xsd">

使用范例如下:

<bean id="kenny2" class="com.springinaction.springidol.Instrumentalist"
    p:song="Jingle Bells"
    p:instrument-ref="saxophone" />

-ref后缀作为一个标识来告知spring应该装配一个引用而不是字面值。

4 装配集合

当配置集合类型的bean属性时,spring提供了4种类型的集合配置元素。

集合元素 用途
<list> 装配list类型的值,允许重复
<set> 装配set类型的值,不允许重复
<map> 装配map类型的值,名称和值可以是任意类型
<props> 装配properties类型的值,名称和值必须是String类型

当属性为任意的java.util.Collection类型时,<list><set>几乎可以完全互换。
<map><props>这两个元素分别对应java.util.Map和java.util.Properties。当我们需要由键-值对组成的集合时,这两种配置元素非常有用。

Hank能够同时演奏多种乐器,由类OneManBand定义:

package com.springinaction.springidol;

import java.util.Collection;

public class OneManBand implements Performer {
    public OneManBand() {}

    public void perform() throws PerformanceException {
        for (Instrument instrument : instruments) {
            instrument.play();
        }
    }

    private Collection<Instrument> instruments;

    public void setInstruments(Collection<Instrument> instruments) {
        this.instruments = instruments;
    }
}

我们使用list配置元素为Hank赋予表演时所用到的乐器集合:

<bean id="hank" class="com.springinaction.springidol.OneManBand">
       <property name="instruments">
              <list>
                     <ref bean="guitar" />
                     <ref bean="cymbal" />
                     <ref bean="harmonica" />
              </list>
       </property>
</bean>

list元素包含一个或多个值,这里的ref元素用来定义在spring上下文中的其他bean引用。当然还可以使用其他的spring设置元素作为list的成员,包括<vaue><bean><null>。实际上,list可以包含另一个list作为其成员,形成多维列表。

Note:无论<list>还是<set>,都可以用来装配类型为java.util.Collection的任意实现或者数组的属性。

装配Map集合
当OneManBand表演时,假设我们还想知道每一个音符是由哪种乐器产生的,OneManBand可以调整如下:

package com.springinaction.springidol;

import java.util.Collection;
import java.util.Map;

public class OneManBand implements Performer {
    public OneManBand() {}

    public void perform() throws PerformanceException {
        for (String key : instruments.keySet()) {
            System.out.println(key + ":");
            Instrument instrument = instruments.get(key);
            instrument.play();
        }
    }

    private Map<String, Instrument> instruments;

    public void setInstruments(Map<String, Instrument> instruments) {
        this.instruments = instruments;
    }
}

使用map元素配置instruments属性,如下所示:

<bean id="hank" class="com.springinaction.springidol.OneManBand">
       <property name="instruments">
              <map>
                     <entry key="GUITAR" value-ref="guitar" />
                     <entry key="CYMBAL" value-ref="cymbal" />
                     <entry key="HARMONICA" value-ref="harmonica" />
              </map>
       </property>
</bean>

map中的entry元素由一个键和一个值组成,键和值可以是简单类型,也可以是其他类型的引用,这些属性将帮助我们指定entry的键和值:

属性 用途
key 指定map中entry的键为String
key-ref 指定map中entry的键为spring上下文中其他bean的引用
value 指定map中entry的值为String
value-ref 指定map中entry的值为spring上下文中其他bean的引用

装配Properties集合
一个范例如下:

<bean id="hank" class="com.springinaction.springidol.XXX">
<property name="instruments">
       <props>
              <prop key="GUITAR">STRUM STRUM STRUM</prop>
              <prop key="CYMBAL">CRASH CRASH CRASH</prop>
              <prop key="HARMONICA">HUM HUM HUM</prop>
       </props>
</property>
</bean>

Note:术语比较

  • <property>元素用于把值或bean引用注入到bean的属性中
  • <props>元素用于定义一个java.util.Properties类型的集合值
  • <prop>元素用于定义<props>集合的一个成员。

5 装配空值

通常情况下bean属性的最初值都是null,直到你为它赋值,但是有些bean会为它的属性默认设置一个非空值。如果因为某些特殊原因,必须把属性设置为空值,则可以显式地为该属性装配一个null值。
为属性设置null值,只需使用<null/>元素,例如:

<property name="someNonNullProperty"><null/></property>

显式地为属性装配null值的另一个理由是覆盖自动装配的值。


转载:http://blog.csdn.net/foreverling/article/details/50878992

目录
相关文章
|
1月前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
1月前
|
Java 测试技术 程序员
为什么Spring不推荐@Autowired用于字段注入?
作为Java程序员,Spring框架在日常开发中使用频繁,其依赖注入机制带来了极大的便利。然而,尽管@Autowired注解简化了依赖注入,Spring官方却不推荐在字段上使用它。本文将探讨字段注入的现状及其存在的问题,如难以进行单元测试、违反单一职责原则及易引发NPE等,并介绍为何Spring推荐构造器注入,包括增强代码可读性和维护性、方便单元测试以及避免NPE等问题。通过示例代码展示如何将字段注入重构为构造器注入,提高代码质量。
|
18天前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
1月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
72 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
1月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
2月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
225 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
2月前
|
XML Java 数据格式
spring复习02,xml配置管理bean
详细讲解了Spring框架中基于XML配置文件管理bean的各种方式,包括获取bean、依赖注入、特殊值处理、属性赋值、集合类型处理、p命名空间、bean作用域及生命周期和自动装配。
spring复习02,xml配置管理bean
|
1月前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
87 1
|
1月前
|
Java Spring
获取spring工厂中bean对象的两种方式
获取spring工厂中bean对象的两种方式
45 1
|
1月前
|
缓存 Java Spring
源码解读:Spring如何解决构造器注入的循环依赖?
本文详细探讨了Spring框架中的循环依赖问题,包括构造器注入和字段注入两种情况,并重点分析了构造器注入循环依赖的解决方案。文章通过具体示例展示了循环依赖的错误信息及常见场景,提出了三种解决方法:重构代码、使用字段依赖注入以及使用`@Lazy`注解。其中,`@Lazy`注解通过延迟初始化和动态代理机制有效解决了循环依赖问题。作者建议优先使用`@Lazy`注解,并提供了详细的源码解析和调试截图,帮助读者深入理解其实现机制。
41 1
下一篇
无影云桌面