EchoDemo's Blogs

装配Bean之通过Java代码装配Bean

尽管在很多应用场景下通过组件扫描和自动装配来实现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来进行配置。

🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------