笔记3 装配Bean总结

时间:2023-03-10 06:49:43
笔记3  装配Bean总结

一、自动化装配bean

1.组件扫描

2.自动装配

CompactDisc.java

 package Autowiring;

 public interface CompactDisc {
void play(); }

SgtPeppers.java

SgtPeppers类上使用了@Component注解。

这个简单的注解表明该类会作为组件类,并告知Spring要为这个类创建bean。没有必要显式配置SgtPeppersbean,因为这个类使用了@Component注解,所以Spring会为你把事情处理妥当。

 package Autowiring;

 import org.springframework.stereotype.Component;

 @Component
public class SgtPeppers implements CompactDisc {
private String title = "Sgt. Pepper's Lonely Hearts Club Band";
private String artist = "The Beatles"; @Override
public void play() {
// TODO Auto-generated method stub
System.out.println("Playing " + title + " by " + artist);
} }

不过,组件扫描默认是不启用的。我们还需要显式配置一下Spring,从而命令它去寻找带有@Component注解的类,并为其创建bean。

 package Autowiring;

 import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; @Configuration
@ComponentScan
public class CDPlayerConfig { }

通过Java代码定义了Spring的装配规则@ComponentScan默认会扫描与配置类相同的包。

因为CDPlayerConfig类位于Autowiring包中,因此Spring将会扫描这个包以及这个包下的所有子包,查找带有@Component注解的类。

这样的话,就能发现CompactDisc的实现类,并且会在Spring中自动为其创建一个bean。

测试

CDPlayerTest.java

 package Autowiring;

 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 = Autowiring.CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired
private CompactDisc cd; @Test
public void test() {
cd.play();
}
}

CDPlayerTest使用了Spring的SpringJUnit4ClassRunner,以便在测试开始的时候自动创建Spring的应用上下文。

注解@ContextConfiguration会告诉它需要在CDPlayerConfig中加载配置。因为CDPlayerConfig类中包含了@ComponentScan,因此最终的应用上下文中应该包含CompactDisc这个bean。在测试代码中有一个CompactDisc类型的属性,并且这个属性带有@Autowired注解,以便于将CompactDisc这个bean注入到测试代码之中

二、通过Java代码装配Bean

CDPlayerConfig.java

 package Javawiring;

 import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class CDPlayerConfig { @Bean
public CompactDisc randomBeatlesCD() {
int choice = (int) Math.floor(Math.random() * );
if (choice == ) {
return new SgtPeppers();
} else if (choice == ) {
return new WhiteAlbum();
} else if (choice == ) {
return new HardDaysNight();
} else {
return new Revolver();
}
} @Bean
public CDPlayer cdPlayer(CompactDisc randomBeatlesCD) {
return new CDPlayer(randomBeatlesCD);
}
}

@Configuration注解表明这个类是一个配置类 , 移除了@ComponentScan注解,此时的CDPlayerConfig类就没有任何作用了。

声明简单的bean

     @Bean
public CDPlayer cdPlayer(CompactDisc randomBeatlesCD) {
return new CDPlayer(randomBeatlesCD);
}

CDPlayer实现了一个接口,构造函数的参数是实现了CompactDisc接口的类,然后执行其相应的方法。

     @Bean
public CompactDisc randomBeatlesCD() {
int choice = (int) Math.floor(Math.random() * );
if (choice == ) {
return new SgtPeppers();
} else if (choice == ) {
return new WhiteAlbum();
} else if (choice == ) {
return new HardDaysNight();
} else {
return new Revolver();
}
}

三、通过XML装配bean

声明一个bean

 <bean id="sgtPepperss" class="XMLwiring.SgtPepperss" ></bean>

测试的时候修改@ContextConfiguration("classpath:SoundSystemXMLwiring.xml"),然后定义相应的对象进行测试。

四、混合装配

两个Java配置文件,在一个总的配置文件中使用@Import({ CDConfig.class, CDPlayerConfig.class })进行结合。

1.在JavaConfig中引用XML配置  <@ImportResource注解>

@ImportResource("classpath:SoundSystemJavaXMLwiring.xml")

2.在XML配置中引用JavaConfig

将Java配置文件当作bean在XML文件中进行声明即可。