SpringInAction--自动化装配(显示装配之 java注解配置)

Spring在配置时候有三种方案可选

1、在xml中进行显示配置

2、在java中进行显示配置

3、隐式的Bean发现机制和自动装配

今天学习的 第二种—— 在java中进行显示配置

场景:

  尽管在很多场景下通过组件扫描和自动装配实现Spring的自动化配置是更为推荐的方式,但有时候自动化配置的方案行不通,因此需要明确配置Spring。比如说,你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@Autowired注解的,因此就不能使用自动化装配的方案了。在这种情况下,你必须要采用显式装配的方式。(摘自 《Spring In Action》)

还是以CD机播放CD为例,首先 我们要创造CD接口

package com.bean.java;

/**
 * Created by IntelliJ IDEA.
 * Author XueYuan
 * Data  2017/02/22
 * Time  10:14
 */

public interface CompactDisc {

    void play();
}

CD接口有了,那么我们还是先拿一张CD吧 里面有一首歌:

package com.bean.java;

/**
 * Created by IntelliJ IDEA.
 * Author XueYuan
 * Data  2017/02/22
 * Time  10:14
 */

public class DangNianQing implements CompactDisc {

    private String title = "DangNianQing";
    private String artist = "张国荣";


    public void play() {
        System.out.println("Playing " + title + " By " + artist);
    }
}

有了一首歌之后呢,感觉听来听去的单曲循环不过瘾 那我们就再来一个合集

package com.bean.java;

/**
 * Created by IntelliJ IDEA.
 * Author XueYuan
 * Data  2017/02/22
 * Time  10:57
 */

public class RandomCd implements CompactDisc {

    private String title ;
    private String artist = "张国荣";

    public RandomCd(String title) {
        this.title = title;
    }

    public void play() {
        System.out.println("Playing " + title + " By " + artist);
    }
}

碟子有了下面就差播放器了, 我在创造一个播放器。。

package com.bean.java;

/**
 * Created by IntelliJ IDEA.
 * Author XueYuan
 * Data  2017/02/22
 * Time  10:29
 */

public class CDPlay {

    private CompactDisc compactDisc;

    public CDPlay(CompactDisc compactDisc) {
        this.compactDisc = compactDisc;
    }

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

}

好了,现在已经创造了四个类 分别是  CDPlay(CompactDisc compactDisc)   、 RandomCd(String song) 、  DangNianQing()  、 CompactDisc()  

既然java显示配置适用的场景是配置第三方组件的,那么从现在开始,我不知道内部结构是怎样的,现在只知道:

CDPlay(CompactDisc compactDisc)是开始播放的接方法  compactDisc为是什么碟子

RandomCd(String song) 是随机选歌的方法 song 为歌名

DangNianQing() 是播放 当年情 这首歌

CompactDisc()  CD的接口类,可以看作是 制作碟子的模版(碟子模版制作出来了,之后才刻录么,对吧? ~嗯,对的!)

播放器有了,碟子也有了 下面就是需要操作了

package com.bean.java;

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

/**
 * Created by IntelliJ IDEA.
 * Author XueYuan
 * Data  2017/02/22
 * Time  10:08
 */

@Configuration
public class CDPlayerConfig {


    /**
     * @Bean 可以不指定名字 默认为方法名——'dangNianQing'
     * @Bean(name="XXX") 也可以指定一个名字
     */

   /*@Bean
    public CompactDisc dangNianQing() {
        return new DangNianQing();
    }*/
    @Bean
    public CompactDisc randomCd() {
        int choice = (int) Math.floor(Math.random() * 4);
        switch (choice) {
            case 0:
                return new RandomCd("dangNianQing");
            case 1:
                return new RandomCd("qianNvYouHun");
            case 2:
                return new RandomCd("wo");
            default:
                return new RandomCd("chenMoShiJing");
        }
    }

    @Bean
    public CDPlay cdPlay(CompactDisc compactDisc){
        return new CDPlay(compactDisc);
    }


}

这边在 randomCd() 与 cdPlay() 方法上面添加了 @Bean,就是把这两个方法装配成Bean

CDPlayerConfig  配置的操作,告诉我们如何去播放随机歌曲的方法,下面就让我们听一下

package com.bean.java;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * Created by IntelliJ IDEA.
 * Author XueYuan
 * Data  2017/02/22
 * Time  10:35
 */

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

    @Autowired
    CDPlay cdPlay;

   /* @Autowired
    RandomCd randomCd;*/

    /*@Autowired
    DangNianQing dangNianQing;*/

    @Test
    public void test() {
        cdPlay.play();
        //dangNianQing.play();
        //randomCd.play();
    }


}

当执行 test() 的时候:

步骤1、因为自动装配了CDPlay, 这个时候就会包下查找带有@Bean的 方法

步骤2、找到了CDPlayerConfig中的 cdPlay(),然后cdPlay()方法中需要有一个CompactDisc(随机播放的cd) 

步骤3、但是方法中并没有CompactDisc啊 ,所以又要自动查找,这个时候找到了带执行CDPlay 中的play()方法播放

以上就是Java注解显示的配置Bean方法的简单小例子,如有错误,请指出,谢谢~

代码:https://github.com/eoooxy/springinaction test下 的com.bean.java 中

原文地址:https://www.cnblogs.com/eoooxy/p/6428492.html