尽管在很多应用场景下通过组件扫描和自动装配来实现Spring的自动化配置是更为推荐的方式,但有时候自动化配置的方案行不通,因此需要明确配置Spring。比如:你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没办法在它的类上添加@Component和@Autowired注解的,因此就不能使用自动化装配的方案了。此时,你必须采取显式装配的方式,在进行显式配置的时候,有两种可选的方案:Java和XML。下面主要是学习如何使用Java来进行配置。在读这篇文章之前,建议先阅读我的上一篇文章装配bean之自动化装配Bean
1、创建配置类
@Configuration
public class CDPlayerConfig{
...
}
创建 JavaConfig 的关键在于为其添加@Configuration注解,此外,该类应该包含在Spring应用上下文中创建bean的细节。
2、声明简单的bean
(1)要在JavaConfig中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解,下面的代码声明了CompactDisc bean:
@Bean
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}
@Bean注解会告诉Spring这个方法会返回一个对象,该对象需要注册为Spring应用上下文中的bean,方法体中包含了最终产生bean实例的逻辑。
(2)默认情况下,bean的ID与带有@Bean注解的方法名是一样的。如果你想为其设置一个不同的名字的话,你可以重命名该方法,或者通过name属性指定一个不同的名字。如下:
@Bean(name="lonelyHeartsClubBand")
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}
3、借助JavaConfig注入
(1)我们前面所声明的CompactDisc bean是非常简单的,其自身没有其他的依赖。现在,我们需要声明CDPlayer bean,它依赖于CompactDisc,在JavaConfig中要像下面那样将它们装配到一起:
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(sgtPeppers());
}
看起来,CompactDisc是通过调用sgtPeppers()得到的,但情况并非完全如此,在默认情况下,Spring中的bean都是单例的,因为sgtPeppers()方法上添加了@Bean注解,Spring将会拦截所有对它的调用,并确保直接返回该方法所创建的bean,而不是每次都对其进行实际的调用。即对sgtPeppers()方法的调用返回的是Spring本身在调用sgtPeppers()时所创建的CompactDisc bean。
(2)可以看到,通过方法来引用bean的方式有点令人困惑。其实还有一种理解起来更为简单的方式:
@Bean
public CDPlyer cdPlayer(CompactDisc compactDisc) {
return new CDPlayer(compactDisc);
}
通过这种方式引用其他的bean通常是最佳的选择,因为它不会要求将CompactDisc声明到同一个配置类之中。在这里甚至没有要求CompactDisc必须要在JavaConfig中声明,实际上它可以通过组件扫描功能自动发现或者通过XML来进行配置。