Spring学习笔记之通过Java代码装配Bean

自建博客地址:https://www.bytelife.net,欢迎访问! 本文为博客自动同步文章,为了更好的阅读体验,建议您移步至我的博客👇

本文作者: Jeffrey
本文链接: https://www.bytelife.net/articles/2868.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!


虽然很多场景下可以使用组件扫描和自动装配来实现Spring的自动化配置,但有些时候自动化配置的方案是行不通的,因此需要明确配置Spring。比如你想讲第三方库中的组件装配到你的应用中,在这种情况下,你必须要显式装配。在进行显式配置的时候,有两种方案,Java和XML。

下面介绍通过Java代码显式装配Bean。

一、创建配置类

创建配置类的关键在于@Configuration注解,@Configuration注解表明该类是一个配置类,该类包含了在Spring上下文中如何创建Bean的细节。

package cn.javacodes.spring.configuration;
import org.springframework.context.annotation.Configuration;
/**
 * Created by Eric on 2016/10/16.
 */
@Configuration
public class CDPlayerConfig {
}

二、声明简单的Bean

要在JavaConfig中声明Bean,我们需要写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解。比如下面的代码声明了CompactDisc Bean:

    @Bean
    public CompactDisc transfer(){
        return new Transfer();
    }

@Bean注解会告诉Spring这个方法会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean对象的逻辑。

默认情况下,bean的ID于带有@Bean注解方法的名称是一样的。在上面的例子中,bean的名字将会是“transfer”。如果你想为它设置一个不同的名字,可以通过name属性指定它的ID:

    @Bean(name = "transfer-cd")
    public CompactDisc transfer(){
        return new Transfer();
    }

另外,方法中的方法体可以是任何你想创建Bean的逻辑,比如你想在一组CD中随机选取一个CD进行播放也是可以的。

三、借助JavaConfig实现注入

前面声明的CompactDisc Bean是非常简单的,因为它没有任何依赖,那么现在想要声明一个CDPlayer Bean,它依赖于CompactDisc。

(一)引用创建Bean的方法

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

这里同样使用了@Bean注解,并在构造CDPlayer时将CompactDisc作为CDPlayer构造器的参数传入。

注意:这里虽然看起来是通过调用transfer()方法得到CompactDisc,但由于transfer方法使用了@Bean注解,实际上Spring会拦截所有对它的调用,并确保直接返回该方法所创建的Spring上下文中的bean,而不是每次都对其进行实际的调用。

比如说,假设你引入了另一个其他的CDPlayer Bean,它和之前的那个bean完全一样。

    @Bean
    public CDPlayer cdPlayer(){
        return new CDPlayer(transfer());
    }
    @Bean
    public CDPlayer anotherCDPlayer(){
        return new CDPlayer(transfer());
    }

默认情况下,Spring中的bean都是单例的,我们并没有必要为第二个CDPlayer Bean创建完全相同的CompactDisc实例。Spring会拦截对@Bean注解标注方法的调用并确保返回的是Spring创建的Bean。

(二)将依赖作为参数

可以看到通过引用创建Bean的方法来解决这个问题有些让人疑惑,下面这种方式看起来更为容易理解:

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

在这里,cdPlayer()方法请求一个CompactDisc作为参数。当Spring调用cdPlayer()方法创建bean的时候,它会自动装配一个CompactDisc到配置方法中。这样方法体就可以在合适的位置使用它,通过这种方式可以避免明确的调用@Bean方法。

通过这种方式来引用其它Bean是最佳的选择,因为它不要求将依赖声明到同一个配置类当中,甚至它不要求必须要在JavaConfig中声明,实际上它可以通过组件扫描功能来自动发现或者通过XML来进行配置。

本例中使用了CDPlayer的构造器实现了DI(依赖注入),但是完全可以使用其它风格的DI,比如,你可以使用setter的方式进行注入。

posted @ 2021-02-25 01:08  JeffreyHu  阅读(57)  评论(0编辑  收藏  举报