最近在看《Spring in Action 4th》,讲到JavaConfig的@Import和@ImportResource的使用,于是照着例子做了个小demo,加深自己的印象。在Spring中配置有xml和JavaConfig的配置方式,相比来说,使用JavaConfig的方式配置会更利于管理,类型安全。
demo项目结构(Maven约定):
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── jiaobuchong
│ │ ├── config
│ │ │ ├── CDConfig.java
│ │ │ ├── CDPlayerConfig.java
│ │ │ └── SoundSystemConfig.java
│ │ ├── dao
│ │ │ └── CompactDisc.java
│ │ └── soundsystem
│ │ ├── BlankDisc.java
│ │ ├── CDPlayer.java
│ │ └── SgtPeppers.java
│ └── resources
│ └── cons-injec.xml
└── test
└── java
└── com
└── jiaobuchong
├── soundsystem
├── CDPlayerTest.java
├── CDPlayerTest1.java
└── CDPlayerTest2.java
config包下的三个配置类
CDConfig.java:
package com.jiaobuchong.config;
import com.jiaobuchong.dao.CompactDisc;
import com.jiaobuchong.soundsystem.SgtPeppers;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CDConfig {
@Bean // 将SgtPeppers注册为 SpringContext中的bean
public CompactDisc compactDisc() {
return new SgtPeppers(); // CompactDisc类型的
}
}
CDPlayerConfig.java:
package com.jiaobuchong.config;
import com.jiaobuchong.dao.CompactDisc;
import com.jiaobuchong.soundsystem.CDPlayer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(CDConfig.class) //导入CDConfig的配置
public class CDPlayerConfig {
@Bean(name = "cDPlayer")
public CDPlayer cdPlayer(CompactDisc compactDisc) {
/*这里会注入CompactDisc类型的bean 这里注入的这个bean是CDConfig.class中的CompactDisc类型的那个bean*/
return new CDPlayer(compactDisc);
}
}
SoundSystemConfig.java:
package com.jiaobuchong.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
@Configuration
@Import(CDPlayerConfig.class)
@ImportResource("classpath:cons-injec.xml") //导入xml配置项
public class SoundSystemConfig {
}
这里使用注解@Bean就好比如xml配置时的:
@ImportResource类似于xml配置时的:
dao包下的一个接口:
CompactDisc.java:
package com.jiaobuchong.dao;
public interface CompactDisc {
void play();
}
soundsystem包下的类:
BlankDisc.java:
package com.jiaobuchong.soundsystem;
import com.jiaobuchong.dao.CompactDisc;
import java.util.List;
public class BlankDisc implements CompactDisc {
private String title;
private String artist;
private List tracks;
public BlankDisc(String title, String artist, List tracks) {
this.title = title;
this.artist = artist;
this.tracks = tracks;
}
public void play() {
System.out.println("Playing " + title + " by " + artist);
for (String track : tracks) {
System.out.println("-Track: " + track);
}
}
}
CDPlayer.java:
package com.jiaobuchong.soundsystem;
import com.jiaobuchong.dao.CompactDisc;
import org.springframework.beans.factory.annotation.Autowired;
public class CDPlayer implements CompactDisc {
private CompactDisc cd;
@Autowired //构造函数注入
public CDPlayer(CompactDisc cd) {
this.cd = cd;
}
public void play() {
cd.play();
}
}
SgtPeppers.java:
package com.jiaobuchong.soundsystem;
import com.jiaobuchong.dao.CompactDisc;
import org.springframework.stereotype.Component;
public class SgtPeppers implements CompactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "The Beatles";
public void play() {
System.out.println("Playing " + title + " by " + artist);
}
}
xml配置文件
cons-injec.xml:
Sgt. Pepper's Lonely Hearts Club Band
With a Little Help from My Friends
Lucy in the Sky with Diamonds
Getting Better
Fixing a Hole
测试类
CDPlayerTest.java:
package com.jiaobuchong.soundsystem;
import com.jiaobuchong.config.CDConfig;
import com.jiaobuchong.config.CDPlayerConfig;
import com.jiaobuchong.dao.CompactDisc;
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;
/* CDPlayerTest takes advantage of Spring’s SpringJUnit4ClassRunner to have a Spring application context automatically created when the test starts. And the @Context-Configuration annotation tells it to load its configuration from the CDPlayerConfig class. */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDConfig.class)
public class CDPlayerTest {
@Autowired
private CompactDisc cd;
@Test
public void cdShouldNotBeNull() {
// assertNotNull(cd);
cd.play();
}
}
CDPlayerTest1.java:
package com.jiaobuchong.soundsystem;
import com.jiaobuchong.config.CDConfig;
import com.jiaobuchong.config.CDPlayerConfig;
import com.jiaobuchong.dao.CompactDisc;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest1 {
@Autowired
@Qualifier("cDPlayer")
private CompactDisc cd;
@Test
public void cdShouldNotBeNull() {
// assertNotNull(cd);
cd.play();
}
}
CDPlayerTest2.java:
package com.jiaobuchong.soundsystem;
import com.jiaobuchong.config.CDPlayerConfig;
import com.jiaobuchong.config.SoundSystemConfig;
import com.jiaobuchong.dao.CompactDisc;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SoundSystemConfig.class)
public class CDPlayerTest2 {
@Autowired
@Qualifier("cDPlayer")
private CompactDisc cd;
@Autowired
@Qualifier("compactDisc")
private CompactDisc cd1;
@Test
public void cdShouldNotBeNull() {
// assertNotNull(cd);
cd.play();
}
@Test
public void testBlankDisc() {
cd1.play();
}
}
看完这个demo代码,基本上@Import和ImportResource的意义应该也就明白了,更多细节请参考《Spring in Action 4th》。