隐式的bean发现机制和自动装配
- 组件扫描(component scanning): spring会自动发现应用上下文中所创建的bean
- 自动装配(Autowiring): spring自动满足bean之间的依赖
定义一个接口
package soundsystem;
public interface ComPactDisc {
void play();
}
ComPactDisc的是实现
package soundsystem;
import org.springframework.stereotype.Component;
/* 表明该类会作为组件,并告知Spring要为这个类创建bean */
@Component
public class SgtPeppers implements ComPactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "The Beaties";
@Override
public void play() {
System.out.println("Playing " + title + " by " + artist);
}
}
创建一个自动扫描的类,去扫描带有@Component的类
package soundsystem.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import soundsystem.TT;
/* @Configuration:表明这个是一个java配置类 */
@Configuration
@ComponentScan("soundsystem")
public class CDPlayerConfig {
//里面什么都不写,只作为扫描用的
}
@ComponentScan用法
- 使用了@ComponentScan,会将@ComponentScan指定的目录作为根目录,扫描这个同级目录中的@Component和目录下的@Component
- @ComponentScan: 不设置任何属性,会将该类所在的目录作为基础包(根目录)
- @ComponentScan(“soundsystem”): 会将包名为soundsystem作为基础包(根目录)
- @ComponentScan(basePackages={“soundsystem”, “xxx”}): 会将包名为soundsystem和包名为xxx作为基础包(两个基础包)
- @ComponentScan(basePackageClasses = {ComPactDisc.class, TT.class}): 会将ComPactDisc和TT这个类所在的包作为基础包(两个基础包)
编写测试类
package soundsystem;
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;
import soundsystem.config.CDPlayerConfig;
import static org.junit.Assert.assertNotNull;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= CDPlayerConfig.class)
public class CDMTest {
/** 当Spring创建ComPactDisc bean的时候,会通过这个构造器来进行实例化 */
@Autowired
private ComPactDisc cd;
@Test
public void cdShouldNotBeNull() {
assertNotNull(cd);
cd.play();
}
}