1.1 创建可被发现的bean
 

CompactDisc的具体内容并不重要, 重要的是将其定义为一个了接口,并且定义了一个播放的方法

带有@Component注解的实现类SgtPeppers,SgtPeppers类上使用了@Component注解。 这个简单的注解表明该类会作为组件类, 并告知Spring要为这个类创建bean(啥是bean?我理解是:简单笼统的说就是一个类,一个可复用的类,javaBean在MVC设计模型中是model,又称模型层,在一般的程序中,我们称它为数据层,就是用来设置数据的属性和一些行为,然后我会提供获取属性和设置属性的get/set方法JavaBean是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java类可以通过自身机制发现和操作这些JavaBean 属性。比如实体类)

spring注解工作原理 spring注解的作用_spring自动扫描组件

不过, 组件扫描默认是不启用的。 我们还需要显式配置一下Spring, 从而命令它去寻找带有@Component注解的类, 并为其创建bean。

@ComponentScan注解启用了组件扫描

spring注解工作原理 spring注解的作用_java_02

如果没有其他配置的话, @ComponentScan默认会扫描与配置类相同的包。 因为CDPlayerConfig类位于soundsystem包中, 因此Spring将会扫描这个包以及这个包下的所有子包, 查找带有@Component注解的类。 这样的话, 就能发现CompactDisc, 并且会在Spring中自动为其创建一个bean

使用XML来启用组件扫描的话, 那么可以使用Spring context命名空间
的<context:component-scan>元素

spring注解工作原理 spring注解的作用_JAVA_03

<context:component-scan>元素会有与@ComponentScan注解相对应的属性和子元素

创建一个简单的JUnit测试, 让它创建Spring上下文, 并判断CompactDisc是不是真的创建出来了。

注解@ContextConfiguration会告诉它需要在CDPlayerConfig中加载配置,因为CDPlayerConfig类中包含了@ComponentScan, 因此最终的应用上下文中应该包含CompactDisc bean。
为了证明这一点, 在测试代码中有一个CompactDisc类型的属性, 并且这个属性带
有@Autowired注解, 以便于将CompactDisc bean注入到测试代码之中
 

做个小总结:把@Component当做是一盏灯,@ComponentScan就是总开关,他会打开房间里(包以及这个包下的所有子包)所有你安了灯泡地方的灯,照亮你房间