装配bean
DI可以降低模块之间的耦合性,一个类通过定义接口来被注入依赖。配置文件描述了对象之间的依赖关系,Spring容器会根据配置文件装配bean。
有三种装配bean的方式:
- 在java中现式配置;
- 在XML文件中现式配置;
- 隐式bean发现和装配。
项目实践
针对上述三种装配bean的方式,我创建了一个简单的项目进行学习。
首先创建了maven项目,并且pom.xml加入所需的依赖:
|
|
自动化装配bean
示例中有两个bean,其中CDPlayer需要装配CompactDisk。
|
|
|
|
通过配置文件指明自动扫描
package com.tc;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//指明该class是一个配置,并且采用自动扫描
public class CDPlayerConfig {
}
进行测试:
package com.tc;
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;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
(SpringJUnit4ClassRunner.class)
(classes = CDPlayerConfig.class)
public class CDPlayerTest {
private CompactDisc cd;
private CDPlayer player;
//cd会被自动装配,不会为null
public void cdShouldNotBeNull() {
assertNotNull(cd);
}
public void playIsRight() {
assertEquals("Playing Sgt by Beatles 1", player.play());
}
//CompactDisc实例只被创建了一次,spring默认bean是单例模式
public void cdIsSingle() {
assertEquals(cd.play(), player.play());
}
}
通过java装配bean
通过java装配bean和自动装配CompactDisc与CDPlayer的区别在于,去掉了@Component
和@Autowired
标注,将这些类变成了普通的类。
而在配置文件中,需要如下修改:
package com.tc;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
public class CDPlayerConfig {
public CompactDisc compactDisc(){
return new CompactDisc();
}
public CDPlayer cdPlayer(CompactDisc cd){
return new CDPlayer(cd);
}
}
使用原来的测试代码,可以发现测试可以成功的通过。
通过XML装配bean
创建xml配置文件src\main\resources\play.xml
,并填入如下配置内容:
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="compactDisc" class="com.tc.CompactDisc"/>
<bean id="cdPlayer" class="com.tc.CDPlayer">
<constructor-arg ref="compactDisc"/>
</bean>
</beans>
把原来的java配置文件CDPlayerConfig.java删除,可以运行测试,结果依然正确。