装配Bean的三种常用方式

上一次的随笔内容只是简单的实现了Bean的装配(依赖注入)

今天来具体讲讲实现Bean装配的三种常用方法:

自动化装配

使用javaConfig显示装配

使用xml装配

一般来说,尽可能地使用自动化装配(spring的一大原则就是约定大于配置),在必要时使用javaConfig显示装配,实在不行才使用xml装配

本篇不涉及xml装配

一、自动化装配

所谓自动化装配,就是让spring自动的发现上下文所创建的Bean,并自动满足这些Bean之间的依赖。

自动扫描需要在Config配置类里加上@ComponentScan注解:

@Configuration
//@PropertySource("classpath:./test/app.properties")
@ComponentScan
public class CDPlayerConfig {

//    @Autowired
//    Environment env;
//
//    @Bean
//    @Conditional(CDExistsCondition.class)
//    public CDPlayer cdPlayer(CompactDisc compactDisc){
//      return new CDPlayer(compactDisc);
//    }
//
//    @Bean
////    @Primary
//    public CompactDisc sgtPeppers(){
//        return new BlankDisc();
////        return new SgtPeppers();
//    }
//
//    @Bean
//    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
//        return new PropertySourcesPlaceholderConfigurer();
//    }
//
//    @Bean
//    @Primary
//    public CompactDisc BeatIt(){
//        return new BeatIt();
//    }
}

如果不需要再显示配置Bean,那么配置类里可以是空的,完全交给Spring去自动配置。

 

既然要让spring自动发现Bean,那么在写类的时候,我们便要加上@Component注解,表示这是一个可以被发现的Bean:

package CD_Play;

import org.springframework.stereotype.Component;

@Component("abc")
public class SgtPeppers implements  CompactDisc {

    private String title = "Sgt. Pepper's Lonely Hearts Club Band";
    private String artist = "The Beatles";

    SgtPeppers(){}

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

这里类是一张“CD”,他实现了CD接口,并具有play功能,我们正准备把他放入“CD机”(CDPlayer)进行播放,现在我们为这个类加上了@Component注解,他就可以被Spring自动扫描发现了。

现在Spring已经可以发现这个类了,那么要怎么才能让Spring直到这个类该装配到哪里去呢,这就需要我们在需要装配的地方加上@Autowired注解:

package CD_Play;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class CDPlayer implements MediaPlayer{

    private CompactDisc cd;

    @Autowired
    CDPlayer(CompactDisc cd){
        this.cd = cd;
    }

//    @Autowired
//    @Qualifier("abc")
//    public void setCd(CompactDisc cd) {
//        this.cd = cd;
//    }
//    public CDPlayer(CompactDisc cd){
//        this.cd = cd;
//    }

    @Override
    public void play() {
        cd.play();
    }
}

这个@Autowired注解可以加载构造器上,也可以加载set方法上(如注释中一样),这样Spring就会根据所需要的参数(这里是CompactDisc类的参数)从创建好各个Bean的容器中找到匹配这个类型的Bean直接装配进去。

最后放出测试类进行测试:

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



    @Rule
    public final StandardOutputStreamLog log = new StandardOutputStreamLog();

    @Autowired
    private MediaPlayer player;

    @Autowired
    private CompactDisc cd;

    @Test
    public void cdShouldNotBeNull(){
        assertNotNull(cd);
    }

    @Test
    public void play(){
        player.play();
        assertEquals("Playing Sgt. Pepper's Lonely Hearts Club Band" +
                " by The Beatles\r\n", log.getLog());
    }
}

测试结果为:

可以看到测试通过,证明Bean已被创建并被正确的装配到CDPlayer中正常工作。

posted on 2019-08-09 15:42  尤达  阅读(996)  评论(0编辑  收藏  举报

导航