Spring journey -- JavaConfig 装配 Bean

自动化装配 Bean :

  1. 给你需要装配的 Bean 添加一个@Component 注解;
  2. 写一个 Config 类,给它添加一个@ComponentCan 注解,启用应用组件扫描,扫描到 JavaConfig 类所在的包及其所在包的子包中所有包含@Component 注解的类,还要在这个 Config 类的顶部加一个@Configuration 注解。
这是上一篇中提到的。

介绍另外一种装配 Bean 的方法:通过 Java 代码装配 Bean,和上面还有一些不太一样的地方,但是是会比上面的那种方法要笨一些。还是会有一些情景下会用得到,比如你想将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上面用@Component 和 @Autowired 注解的。这时候就会用到显式装配,有两种可选:Java 和 XML。 但是推荐的是 JavaConfig 的方式,因为它对重构更友好。

JavaConfig 是配置代码,不应该包含任何业务逻辑。通常会把它放到单独的包中。

配置类:
package com.springinaction.soundsystem;

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

/**
 * Created by user on 2/21/17.
 */
@Configuration
//@ComponentScan(basePackageClasses = {CDPlayer.class, MediaPlayer.class})
public class CDPlayerConfig {
}
可以看到把@Component 注解注释掉了。

声明 Bean : 
@Bean
public CompactDisc sgtPeppers(){

    return new SgtPeppers();
}

默认情况下,bean 的 ID 与还有@Bean 注解的方法名是一样。但是也可以通过 name 属性指定一个名字:
@Bean(name = "stayFocus")
public CompactDisc sgtPeppers(){

    return new SgtPeppers();
}

现在应该考虑怎么把一个 Bean 注入到另一个 Bean 中了:
@Bean
public CDPlayer cdPlayer(){
    return new CDPlayer(sgtPeppers());
}

从上面的两个 Bean 看,cdPlayer()并没有使用默认的构造器构建实例(即 new CDPlayer()),而是调用了需要传入 CompactDisc 对象的构造器来创建 CDPlayer 实例。看起来 CompactDisc 是通过调用 sgtPeppers()得到的,但情况并不是这样,sgtPeppers()方法上面添加了@Bean注解, Spring 将会拦截所有对它的调用,并确保直接返回该方法所创建的 Bean,而不是每次都对其进行实际的调用,因为在默认情况下,Spring 中的 Bean 都是单例的。

下面是最佳选择:
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
    return new CDPlayer(compactDisc);
}

现在的 CDPlayerTest 类是这么写的:
package com.springinaction.soundsystem;

import static org.junit.Assert.*;

import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.StandardOutputStreamLog;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * Created by user on 2/21/17.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest {

//    @Autowired
//    private CompactDisc sgtPeppers;

//    @Autowired
//    private CDPlayer cdPlayer;

    @Bean
    public CompactDisc sgtPeppers(){

        return new SgtPeppers();
    }

    @Bean
    public CDPlayer cdPlayer(CompactDisc compactDisc){
        return new CDPlayer(compactDisc);
    }

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

    @Test
    public void cdShouldNotBeNull(){
        assertNotNull(new CDPlayerTest().sgtPeppers());
    }

    @Test
    public void play(){
        new CDPlayerTest().cdPlayer(new CDPlayerTest().sgtPeppers()).play();
        assertEquals("Playing Sgt. Pepper's Lonly Hearts Club Band by The Beatles\n",log.getLog());
    }
}

运行之后就可以看到绿条了:


只是介绍多一种可选的装配 Bean 的方法,没有其他太多......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值