您的位置:首页 > 编程语言 > Java开发

Spring journey -- JavaConfig 装配 Bean

2017-02-27 22:36 267 查看
自动化装配 Bean :

给你需要装配的 Bean 添加一个@Component 注解;
写一个 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 的方法,没有其他太多......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring