自动化装配 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
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 的方法,没有其他太多......