专栏名称: Guo_1_9
目录
相关文章推荐
51好读  ›  专栏  ›  Guo_1_9

Spring之旅第三站:基于自动装配、JavaConfig配置。

Guo_1_9  · 掘金  ·  · 2018-02-22 02:00

正文

请到「今天看啥」查看全文


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;

/**
 * Created by guo on 21/2/2018.
 */
@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属性来进行设置







请到「今天看啥」查看全文