正文
CDPlayerConfig
{
}
类CDPlayConfig通过Java代码定义了Spring的装配规则。@ComPonentScan注解可以能够在Spring中启动组件扫描。如果没有其他配置,@ComponentScan默认会扫描与配置类相同的包。Spring将会扫描这个包以及这个包下所有的子包。查找带有@Component注解的类。这样就能发现CompactDisc,并且会在Spring中自动创建一个bean。
使用XMl来启用组件扫描的话,可以使用Spring context命名空间的
context:component-scan
元素,
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
.....
<context:component-scan base-package="com.guo.soundsystem" />
</beans>
尽管我们可以通过XMl的方案来启用组件扫描,但是在后面的讨论中,更多的还是会使用基于Java的配置。
为了测试组件扫描功能 创建一个简单的JUnit测试,它会创建Spring上下文,并判断CompactDisc是不是真的创建出来了。
package com.guo.soundsystem;
import com.guo.soundsystem.CDPlayerConfig;
import com.guo.soundsystem.CompactDisc;
import static org.junit.Assert.*;
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;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayConfig.class)
public class CDPlayTest {
@Autowired
private CompactDisc cd;
@Test
public void cdShouldNotBeNull() {
assertNotNull(cd);
}
}
CDPlayerTest使用了Spring的SpringJUnitClassRunner,以便在测试开始的时候自动创建Spring的上下文。注解@ContextConfiguration会告诉它需要在CDPlayerConfig中加载配置.带有@Autowired注解,以便将CompactDisc bean注入到测试代码中,最后断言cd属性不为null,就意味着Spirng能够发现CompactDisc类,自动在Spring应用上下文中将其创建为bean并将其注入到测试代码中。,
2.2.2 为组件扫描的bean命名
Spring应用上下文中所有bean都会给定一个ID。尽管没有明确为SgtPeppers bean 设置ID,但Spring会根据类名为其指定一个ID,这个ID所给定的ID为sgtPeppers,也就是将类名的第一个字母变为小写。
如果想设置不同的ID,所需要做的就是将期望的ID作为值传递给@Component注解
@COmponent("lonelyHeartsClub")
public class SgtPeppers implements CompactDisc {
...
}
还有另外一种为bean命名的方式,这种方式不使用@Component注解,而是使用Java依赖注入规范(Java Dependency Injection) 中所提供的@Named注解为bean设置ID:
import javax.inject.Named
@Named("lonelyHeartsClub")
public class SgtPeppers implements CompactDisc {
...
}
Spring支持将@named作为@Component注解的替代方案。两者之间有一些细微的差异,但是在大多数场景中,他们是可以互相替换的。
《Spring 实战》作者更喜欢@Component注解,而对于@Named。。。感觉名字起的很不好
2.2.3 设置组件扫描的基础包
到目前为止,我们没有为@ComponentScan设置任何属性,这意味着,按照默认规则,它会以配置类所在的包作为基础包(base package) 来 扫描组件,有一个原因会促使我们明确的设置基础包,那就是我们要将配置类放在单独的包中,使其与其他应用代码区分开来。
为了指定不同的基础包,你所需要做的就是在@ComponentScan的Value属性中指明包的名称
@Configuration
@Componentscan("com.guo.soundsystem")
public class CDPlayerConfig{}
如果你想更加清晰的表明你所设置的是基础包,那么你可以通过basePackages属性来进行设置