Spring装配Bean ---通过Java代码装配Bean
看Spring实战(第4版)笔记
Spring装配Bean。 Bean有两种: 不依赖其他Bean的简单Bean 如CompactDisc Bean 和 依赖其他Bean的Bean 如CDPlayer Bean。其实就是讲如何声明这两种Bean 让Spring知道 我们想把这两种对象注册成Spring的Bean 让Spring来管理。
Spring装配Bean方式的选择:
推荐使用自动化装配的方式来装配Bean,但是有些场景不能使用@Component和@Autowired注解来实现自动装配,比如:你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@Autowired注解的,因此就不能使用自动化装配的方案了。这时候就必须采用显示配置的方式。显示配置包括Java配置和xml配置。
显示配置中JavaConfig是更好的方案,因为它更强大,类型安全并且对重构友好。
JavaConfig就是Java代码,但是和其它的Java代码又有所区别。JavaConfig是配置代码,它不应该包含任何业务逻辑,也不应该侵入到业务逻辑的代码之中。通常将JavaConfig放到单独的包中,使它和应用程序的逻辑分离开来。
1.通过JavaConfig声明Bean ---声明不依赖其他Bean的简单Bean
JavaConfig通过@Configuration注解 和 @Bean注解实现。 @Configuration注解的类是可以用来替代xml文件。以前配置bean时,都是写在applicationContext.xml文件中的。有了这个注解后,我们就可以编写一个类在其上面加上该注解。即配置类。
在配置类中可以在方法上加@Bean注解定义其中的Bean
JavaConfig 等价于 代替 xml文件 定义bean
JavaConfig 等价于 自动装配Bean 里的自动扫描(@Controller @Service @Repository @Component 注解 和 @ComponentScan )
在配置类里 声明一个public方法 并且用@Bean注解。该方法的方法名就是Bean Id, 方法体 创建所需类型的实例并返回,@Bean注解 告诉告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean。
给bean指定Id 可以使用@Bean注解的name属性 @Bean(name="compactDiscId")
代码示例如下
public class CompactDisc {
private String artist = "dream_s";
private String music = "litter bird";
public void play() {
System.out.println("JAVA CONFIG playing "+ music + " by "+ artist);
}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CDPlayerConfig {
@Bean
public CompactDisc compactDisc() {
return new CompactDisc();
}
}
2.通过JavaConfig实现注入----通过JavaConfig声明 依赖其它Bean 的Bean ---在配置类中声明Bean时实现注入
就是代替 自动装配 里的@Autowired 注解
比如CDPlayer Bean 需要依赖CompactDisc Bean。那么在配置类中声明 CDPlayer Bean 有两种写法
在JavaConfig中装配bean的最简单方式就是引用创建CompactDisc bean的方法,或者请求一个CompactDisc作为参数.
推荐第二种 这样 它不会要求将CompactDisc Bean声明到同一个配置类之中。 甚至没有要CompactDisc 的声明方式,它可以是在JavaConfig中声明, 也可以通过组件扫描功能自动发现 或者通过XML来进行配置。
public class CDPlayer {
//通过构造器 实现DI功能
private CompactDisc compactDisc;
public CDPlayer(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
public void play() {
compactDisc.play();
}
}
在配置类中 声明CDPlayer Bean 代码如下
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CDPlayerConfig {
@Bean
public CompactDisc compactDisc() {
return new CompactDisc();
}
//引用创建bean的方法
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(compactDisc());
}
//或者 cdPlayer()方法请求一个CompactDisc作为参数
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
return new CDPlayer(compactDisc);
}
}
3.测试 JavaConfig 装配Bean
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 CDPlayer cdPlayer; //依赖其它Bean 的Bean
@Autowired
private CompactDisc compactDisc; //不依赖其他Bean的简单Bean
@Test
public void testPlayer(){
compactDisc.play();
cdPlayer.play();
}
}
控制台输入 两行 :JAVA CONFIG playing litter bird by dream_s