contextconfiguration 加载bean_「Spring系列」入门(二):自动化装配bean

点关注,不迷路;持续更新Java相关技术及资讯!!!

7f95110bc416cb75215f4309d80387fc.png

Spring从两个角度来实现自动化装配:

  • 组件扫描(component scanning):Spring会自动发现应用上下文中需要创建的bean。
  • 自动装配(autowiring):Spring会自动满足bean之间的依赖。

为了更形象的解释组件扫描与自动装配,我们举一个音响系统的例子,主要包含以下内容:

  • CD接口
  • CD接口的一个实现类
  • CD播放器

关于CD和CD播放器关系的解释:

如果你不将CD插入(注入)到CD播放器中,那么CD播放器其实是没有太大用处的。所以,可以这样说,

CD播放器依赖于CD才能完成它的使命。

1. 创建可被发现的bean

先创建CD接口CompactDisc:

package chapter02;public interface CompactDisc { void play();}

然后创建CD接口的一个实现类SgtPeppers:

package chapter02;import org.springframework.stereotype.Component;@Componentpublic class SgtPeppers implements CompactDisc { @Override public void play() { String title = "Sgt.Pepper's Lonely Hearts Club Band"; String artists = "The Beatles"; System.out.println("Playing " + title + " By " + artists); }}

SgtPeppers类与以往类的区别在于使用了@Component注解。

这个注解表明该类会作为组件类,并告知Spring要为这个类创建bean。

那么如何让Spring发现它并创建bean呢?

这时就需要用到组件扫描,不过,在Spring中,组件扫描默认是不启用的

因此我们需要显式配置一下Spring,从而命令它去寻找带有@Component注解的类,并为其创建bean。

创建CDPlayerConfig类:

package chapter02;import org.springframework.context.annotation.ComponentScan;@ComponentScanpublic class CDPlayerConfig {}

这个类与以往类的区别是使用了@ComponentScan注解,这个注解能够让Spring启用组件扫描。

@ComponentScan默认会扫描与配置类相同的包以及这个包下的所有子包,查找带有@Component注解的类。

2. 验证组件扫描

为了验证创建的bean能否被Spring发现,我们创建一个简单的JUnit测试,完成此测试需要导入以下两个jar包:

  • hamcrest-core-2.1.jar
  • junit-4.12.jar

导入jar包的方式如下:

b45aa5d0d5241225acf2cea85df5d5ce.png
428d56a6486483ee7cde5d4a12c0a227.png
8ad254e8424ed73bba06665ea8d3992c.png
2443111092003ce8526a6d0af6c8d830.png
35beb59ec2d75e284c82a5872e5475f3.png

导入完成后的项目结构图如下所示:

7479567df5798a7fcdb82aea0dbd1dca.png
package chapter02;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 = CDPlayerConfig.class)public class CDPlayerTest { @Autowired private CompactDisc compactDisc; @Test public void cdShouldNotBeNull() { assertNotNull(compactDisc); compactDisc.play(); }}

代码简单讲解:

@RunWith(SpringJUnit4ClassRunner.class),会在测试开始的时候自动创建Spring的应用上下文。

@ContextConfiguration(classes = CDPlayerConfig.class)会告诉Spring需要在CDPlayerConfig中加载配置。

字段compactDisc上的@Autowired注解,会将SgtPeppers bean注入到字段compactDisc上,因为它是接口CompactDisc的实现类并且添加了@Component注解。

运行测试方法cdShouldNotBeNull,会发现测试通过,compactDisc不为null:

61a1f97abc396e6a0764778ebb8a2fd2.png

3. 设置bean ID

Spring应用上下文中所有的bean都会给定一个ID,默认情况下,Spring会将类名的第一个字母变为小写,作为该bean的ID

如上面代码中SgtPeppers bean的ID为sgtPeppers。

有以下两种方式来设置bean ID:

3.1 使用@Component设置bean ID

@Component("lonelyHeartsClub")public class SgtPeppers implements CompactDisc { ......}

3.2 使用@Named设置bean ID

@Named注解不是Spring框架的注解,而是Java 依赖注入规范(Java Dependency Injection)中的注解,因此需要导入jar包:javax.inject-1.jar,导入jar包的方式可以参考 Spring入门(一):创建Spring项目。

import javax.inject.Named;@Named("lonelyHeartsClub")public class SgtPeppers implements CompactDisc {......}

在Spring项目中建议使用@Component注解。

4. 设置组件扫描的基础包

按照默认规则 ,@ComponentScan注解会以配置类所在的包作为基础包(base package)来扫描组件。

但有时候,我们会将配置类放在单独的包中,使其与其他的应用代码区分开来。

这种场景下,默认的基础包就满足不了需求。

@ComponentScan注解支持传入指定的基础包,有以下几种场景:

4.1 指定要扫描的基础包(单个)

@ComponentScan("chapter02")public class CDPlayerConfig {}

或者:

@ComponentScan(basePackages = "chapter02")public class CDPlayerConfig {}

4.2 指定要扫描的基础包(多个)

@ComponentScan(basePackages = {"chapter01
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值