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(三):IoC容器装配Bean(xml配置方式和注解方式)

XML配置方式 一、三种实例化Bean的方式 1.使用类构造器实例化(默认无参数) 2.使用静态工厂方法实例化         class="com.itcast.factory.Pe...
  • u013360022
  • u013360022
  • 2016年07月05日 00:28
  • 1790

【Spring】装配Bean-(1)-使用XML配置

Spring配置
  • robinjwong
  • robinjwong
  • 2014年05月11日 23:18
  • 5926

简化Spring的XML配置(二)——使用注解装配bean

从Spring2.5开始,Spring开始支持使用注解的方式来自动装配bean的属性。这种方式与XML里面配置方式相比,减少了代码量,更加方便快捷。如果想用注解来配置bean,首先要做的就是在XML文...
  • Trigl
  • Trigl
  • 2016年01月10日 13:53
  • 2922

简化Spring的XML配置(一)——自动装配bean属性

对于小的程序来说,在XML中配置的bean数目很少。但是如果对于一个大一点的应用,需要在XML中配置很多的bean。那么有没有简化XML配置的方法呢,Spring为我们提供了这个机制,现在就讲几种简化...
  • Trigl
  • Trigl
  • 2016年01月07日 23:21
  • 2466

Spring - 装配Bean:即依赖注入

装配Bean:即依赖注入在Spring中,对象间的协作是通过IoC机制完成的。反向控制也叫依赖注入(Dependency Injection,DI),简单来说就是将JavaBean需要的对象通过配置文...
  • LeosHope
  • LeosHope
  • 2007年10月30日 22:15
  • 5358

【spring】1、三种装配bean的方式

【spring】1、三种装配bean的方式 创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入(DI)的本质 spring有如下三种装配bean的方法 在XML中进行显式配置 在Ja...
  • u011719271
  • u011719271
  • 2016年12月14日 23:51
  • 3629

spring--装配bean

众所周知,spring最基本的功能就是用来管理bean,spring为我们提供了三种装配bean的方式: 1. XML显式配置 2. Java显式配置 3. 组件扫描和自...
  • xingtingshu
  • xingtingshu
  • 2016年08月20日 14:35
  • 742

Spring的三种装配Bean的方式

Spring的三种装配Bean的方式   一.自动扫描+自动装配 适用情况:简单bean,初始化不需要基本bean之外的其他参数,无参构造函数或者仅需要其他bean,如果需要其他bean作为属性...
  • java_hxc_sz
  • java_hxc_sz
  • 2017年02月04日 16:43
  • 677

Spring定义和装配Bean

我在上一篇博客中讨论了Spring中的IOC和AOP,本篇文章通过代码来演示一下Spring到底是如何实现IOC的。本篇博客我会介绍在Spring中如何定义和装载Java Bean。...
  • daguanjia11
  • daguanjia11
  • 2015年10月18日 17:22
  • 4778

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

虽然项目中常用的是通过注解的方式装配bean,但是XML文件配置作为最初的配置方式,对于Spring学习者来说,还是很有必要了解一下的。...
  • lom9357bye
  • lom9357bye
  • 2017年05月29日 20:52
  • 300
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring in action 03 -- 装配 Bean(xml配置)
举报原因:
原因补充:

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