自动化装配bean
在便利性方面最强大的是Spring的自动化配置,我感觉这个也确实是用起来最方便的
首先,Spring是从两个角度来实现自动化装配:
- 组件扫描:Spring会自动发现应用上下文中所创建的bean
- 自动装配:Spring自动满足bean之间的依赖
下面来看Spring是如何创建bean,如何扫描bean,又如何装配的,我们以CD为例子
- 创建bean
-
我们先定义CD这个接口,CD中有一个play功能
package soundsystem; public interface CompactDisc { void play(); }
然后我们来实现这个接口,就弄一个叫Lemon的CD吧
package soundsystem; import org.springframework.stereotype.Component; @Component public class Lemon implements CompactDisc { private String title = "Lemon"; private String artist = "米津玄师"; public void play() { System.out.println("Playing " + title + " By " + artist); } }
应该很容易发现一个特别的东西,就是@Component注解,这个注解表明这个类会作为组件类,并告知Spring要我这个类创建bean,不过组件扫描默认是不启用的,所以我们要显示配置一下Spring,从而让它去找到那些带有@Component注解的类,并为其创建bean
那么接下来就是启用组件扫描去找到这个Lemon类了(顺带一提,下面的CDPlayer也是靠这个类去扫描的,因为都在一个包中),这个过程也非常简单,我们写一个配置类即可
package soundsystem;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class CDPlayerConfig {
}
我们只要添加一个@Configuration注解和一个@ComponentScan注解即可,@Configuration注解表明这个类是一个配置类,而@ComponentScan则是启动组件扫描,如果没有其他配置,@ComponentScan会默认扫描与配置类相同的包,如果你想扫描其他的包的话有下面三种方式
@ComponentScan("soundsystem") //包名
@ComponentScan(basePackages = {"soundsystem","test"}) //包名
@ComponentScan(basePackageClasses = {SgtPeppers.class, Lemon.class}) //类名
3.接下来我们把这张《Lemon》CD放到(注入)CDPlayer中去
package soundsystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CDPlayer {
private CompactDisc cd;
@Autowired
public CDPlayer(CompactDisc cd)
{
this.cd = cd;
}
public void play()
{
cd.play();
}
}
@Autowired是自动装配
4.最后我们来验证一下自动装配是否成功了,创建一个CDPlayerTest类
package soundsystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired
private CDPlayer cdp;
@Test
public void cdShouldNotBeNull()
{
assertNotNull(cdp);
cdp.play();
}
}
我这里是用的Junit测试单元测试的@RunWith就是告诉Spring,这个用JUnit4来测试,@ContextConfiguration则是告诉Spring配置类在是哪个,最后运行的结果:
通过运行和输出的结果我们可以知道bean的自动装配成功了 ,以上就是Spring自动装配bean 的过程,下一篇会写利用Java代码装配bean和XML装配bean。