Spring in action 03 -- 装配 Bean(xml配置)

原创 2016年05月29日 23:21:20

在上一篇中,遇到了一些问题,其实这些问题,是因为对Spring不熟悉,用的太少才会有的问题,我觉得有一些是理解上的问题,这一篇说通过XML装配bean,
有这么一句话:bean元素类似于javaconfig中的@Bean注解,其实看到这里基本上也就明白上一篇中的问题了。下面来具体看:

  • 构造器注入初始化Bean:

–>构造器注入bean引用

这里写图片描述

这里写图片描述

上面的代码也比较简单,就不做多说了。

–>将字面量注入到构造器中

现在有一个这样的CompactDisc的实现类:BlankDiscXML.java

这里写图片描述

所以这个时候我们可以在.xml中这么写:

<bean id="blankDisc" class="com.stanxu.xmlconfig.BlankDiscXML">
        <constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band">   </constructor-arg>
        <constructor-arg value="The Beatles"></constructor-arg>
</bean>

–> 装配集合

一张CD上面会包含很多的轨道,从而可以放很多歌曲,修改一下BlankDiscXML.java

package com.stanxu.xmlconfig;

import java.util.List;

import com.stanxu.soundsystem.CompactDisc;

public class BlankDiscXML implements CompactDiscXML {

    private String title;
    private String artist;
    private List<String> tracks;


    public BlankDiscXML(String title, String artist,List<String> tracks) {
        // TODO Auto-generated constructor stub
        this.title = title;
        this.artist = artist;
        this.tracks = tracks;
    }

    public void play() {
        // TODO Auto-generated method stub
        System.out.print("Playing " + title + " by " + artist);
        for(String track : tracks){
            System.out.println("-Track: " + track);
        }
    }

}

那么这个时候我们在XML中应该这么写了:

<bean id="blankDisc" class="com.stanxu.xmlconfig.BlankDiscXML">
        <constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band"></constructor-arg>
        <constructor-arg value="The Beatles"></constructor-arg>
        <constructor-arg>
            <list>
                <value>Sgt. Pepper's Lonely Hearts Club Band</value>
                <value>With a Little Help from My Friends</value>
                <value>Getting Better</value>
            </list>
        </constructor-arg>
    </bean>

这都没有什么不好理解的,如果是List中元素是引用类型的话,就直接把value换成ref就可以了。像:

<ref bean="xxx" />

当然也可以用Set集合来代替List,但是有重复的都会被忽略掉,顺序也不能保证,这都是问题。

  • setter方法注入

关于何时使用构造器注入,何是使用setter方法注入,因具体情况而定,一般一些强依赖关系使用构造器注入,而弱依赖使用setter方法注入。

package com.stanxu.xmlconfig;

public class CDPlayerXML implements MediaPlayerXML {

    private CompactDiscXML discXML;

    public CDPlayerXML(CompactDiscXML discXML) {
        // TODO Auto-generated constructor stub
        this.discXML = discXML;
    }

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

}

在XML中对应的是:

<bean id="compactDiscXML" class="com.stanxu.xmlconfig.CompactDiscXML"></bean>

<bean id="cdPlayerXML" class="com.stanxu.xmlconfig.CDPlayerXML">
    <property name="discXML" ref="compactDiscXML"></property>
</bean>

将字面量注入到属性中,修改一下BlankDiscXML.java,要达到的效果是一样的。

package com.stanxu.xmlconfig;

import java.util.List;

import com.stanxu.soundsystem.CompactDisc;

public class BlankDiscXML implements CompactDisc {

    private String title;
    private String artist;
    private List<String> tracks;


//  public BlankDiscXML(String title, String artist,List<String> tracks) {
//      // TODO Auto-generated constructor stub
//      this.title = title;
//      this.artist = artist;
//      this.tracks = tracks;
//  }

    public void setTitle(String title){
        this.title = title;
    }

    public void setArtist(String artist){
        this.artist = artist;
    }

    public void setTracks(List<String> tracks){
        this.tracks = tracks;
    }

    public void play() {
        // TODO Auto-generated method stub
        System.out.print("Playing " + title + " by " + artist);
        for(String track : tracks){
            System.out.println("-Track: " + track);
        }
    }

}

在xml中对应是这样的:

<bean id="blankDisc" class="com.stanxu.xmlconfig.BlankDiscXML">
<!--        <constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band"></constructor-arg> -->
<!--        <constructor-arg value="The Beatles"></constructor-arg> -->
<!--        <constructor-arg> -->
<!--            <list> -->
<!--                <value>Sgt. Pepper's Lonely Hearts Club Band</value> -->
<!--                <value>With a Little Help from My Friends</value> -->
<!--                <value>Getting Better</value> -->
<!--            </list> -->
<!--        </constructor-arg> -->
        <property name="title" value="Sgt. Pepper's Lonely Hearts Club Band"></property>
        <property name="artist" value="The Beatles"></property>
        <property name="tracks">
            <list>
                <value>Sgt. Pepper's Lonely Hearts Club Band</value>
                <value>With a Little Help from My Friends</value>
                <value>Getting Better</value>
            </list>
        </property>
    </bean>

上面看上去比较的冗余,可以利用Spring util-命名空间中的一些功能来简化BlankDisc bean,像下面这样:

这里写图片描述

那么接下来把自动化配置、javaConfig、以及XML配置混合使用:

现在是这样,BlankDiscXML从CDPlayerConfigXML.java中分离出来,定义到它自己的CDConfig.java中:

package com.stanxu.xmlconfig;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CDConfigXML {

    @Bean
    public CompactDiscXML compactDiscXML(){
        return new BlankDiscXML();
    }
}

这里稍后会改成在XML中配置。

现在CDPlayerConfigXML.java中就只有CDPlayerXML.java:

这里写图片描述

现在是这样,这样分开之后 ,可以用下面这种方法再把它们合起来的:新建一个SouldSystemConfig.java:
不用@Bean的方式来去注入SgtPeppersXML,而是把它放到XML中配置

package com.stanxu.xmlconfig;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

@Configuration
@Import(CDPlayerXMLConfig.class)
@ImportResource("classpath:spring.xml")
public class SoundSystemConfig {

}

spring.xml:

<util:list id="trackList">
    <value>Sgt. Pepper's Lonely Hearts Club Band</value>
    <value>With a Little Help from My Friends</value>
    <value>Getting Better</value>
</util:list>

<bean id="blankDisc" class="com.stanxu.xmlconfig.BlankDiscXML">
    <property name="title" value="Sgt. Pepper's Lonely Hearts Club Band"></property>
    <property name="artist" value="The Beatles"></property>
    <property name="tracks" ref="trackList"></property>
</bean>

所以到这里就实现了,在javaconfig中引用XML配置。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Spring In Action(二):基于XML配置装配bean

虽然项目中常用的是通过注解的方式装配bean,但是XML文件配置作为最初的配置方式,对于Spring学习者来说,还是很有必要了解一下的。...

《Spring In Action》 读书笔记(5) -- @autowire,@Qualifier减少xml配置

Instruments.java 创建乐器接口package spring.ioc04;public interface Instruments { public void play(); ...

spring in action-最小化spring XML配置

内容预览: Bean的自动装配 Bean的自动检测 面向注解的Bean装配 基于java的spring配置 一.首先要了解什么是spring装配?  创建应用组件之间相互协作关系的行为就是装配 s...

Spring in Action(第三章 最小化 Spring XML配置)学习笔记

1.减少XML的配置数量 a.Spring提供了几种技巧,可以帮助我们减少XML的配置数量 b.自动装配 有助于减少甚至消除配置元素和元素,让Spring自动识别如何装配Bean 的依赖关系 ...

spring bean XML配置入门

  • 2015年02月05日 15:23
  • 16KB
  • 下载

xml形式装配bean——spring in action chapter 2

1、声明bean 利用beans命名空间: 当spring容器加载该bean时,spring将调用默认的构造器实例化beanClass,相当于 new beanClass()...

【Java.Spring.Core】【IoC】基于注解的Bean装配(非XML配置)

除了使用XML配置外,还可以选择使用基于注解(annotation)的配置方式,其依赖于字节码来织入组件。 注解注入在XML注入之前完成,因此在XML配置中可以重载注解注入的属性。 通常,通过包含...

Spring(三):IoC容器装配Bean(xml配置方式和注解方式)

XML配置方式 一、三种实例化Bean的方式 1.使用类构造器实例化(默认无参数) 2.使用静态工厂方法实例化         class="com.itcast.factory.Pe...

Spring学习-06:IOC容器装配Bean(xml配置方式)详解

Spring框架Bean实例化的方式: 1、构造方法实例化:(默认无参数)默认情况下采用的就是这种方式 2、静态工厂实例化: 3、实例工厂实例化: 一、无参数构造方法的实例化: (1)新建类Bean1...

【Spring 核心】装配bean(三)XML配置

Spring XML方式装配bean
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring in action 03 -- 装配 Bean(xml配置)
举报原因:
原因补充:

(最多只允许输入30个字)