Spring bean的装配-java配置类装配

254 阅读3分钟

java配置类装配bean

在我另一篇文章 Spring bean的装配-自动化装配 中讲述了Spring中自动装配的实现方式,那么本文呢,我会主要讲一下使用java配置类实现显式装配。

我们知道使用自动装配对于开发来说很方便,但是在有的场景却不适合自动装配。比如我要使用第三方的代码,我们不能直接在别人代码上加注解,这时候就需要我们明确的配置Spring。我们可以使用java配置类 和 XML 方式来显式配置bean。本文主要讲java配置类如何装配bean

按照之前的音响系统案例,我们首先创建一个CD接口,以及它的实现类CDImpl,再创建一个CDPlayer类,以及创建一个CDPlayerConfig配置类用于配置bean。

CD接口

package com.abiao._02_Autowiring;

/**
 * CD光盘接口
 **/
public interface CD {
    /** CD播放 */
    void play();
}

CD实现类

package com.abiao._02_Autowiring;

/**
 * CD接口的实现类
 **/
public class CDImpl implements CD {
    public void play() {
        System.out.println("CD在播放。。。");
    }
}

CDPlayer(CD播放器类)

package com.abiao._02_Autowiring;

import org.springframework.beans.factory.annotation.Autowired;

/**
 * CD播放器
 **/
public class CDPlayer implements Player{

    private CD cd;

    @Autowired
    public CDPlayer(CD cd){
        this.cd = cd;
    }

    public void play() {
        cd.play();
    }

    public CD getCd(){
        return cd;
    }
}

CD播放器配置类

package com.abiao._02_Autowiring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * CD播放器配置类
 **/
@Configuration
public class CDPlayerConfig {

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

    @Bean
    public CDPlayer cdPlayer2(){
        return new CDPlayer(cd());
    }

    @Bean
    public CD cd(){
        return new CDImpl();
    }

}

测试装配结果

import com.abiao._02_Autowiring.CD;
import com.abiao._02_Autowiring.CDPlayer;
import com.abiao._02_Autowiring.CDPlayerConfig;
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;

/**
 * CD播放器测试
 **/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest {

    @Autowired
    private CD cd;

    @Autowired
    private CDPlayer cdPlayer;
    
    @Autowired
    private CDPlayer cdPlayer2;

    @Test
    public void play(){
        System.out.println(cd);
        System.out.println(cdPlayer.getCd());
        System.out.println(cdPlayer2.getCd());
        cdPlayer.play();
    }
}

结果:

图片.png

我们能够看到bean的装配已经成功了,但是我们细心一点能够发现前三个CD bean 他们是同一个对象,并没有创建三个不同的bean。这是因为他们在注入CD bean的时候,调用的是一个方法cd()。

表面上看CD bean都是通过调用cd()方法获取的,但情况并非完全如此。因为cd()方法上添加了@Bean注解,Spring会拦截所有对它的调用,确保每次返回正确的bean,并不是每次都对该方法进行实际的调用。

默认情况下,Spring中的bean都是单例的,我们并没有必要每次为CD bean创建相同的实例。那为什么cdPlayer对象不是同一个呢,因为他们在注入bean的时候调用的是两个不同的方法,cdPlayer()和cdPlayer2()。


Java配置类装配bean的细节

  • 我们只需要在类上打上@Configuration注解,该类则被定义为一个Java配置类
  • 在配置类中提供一个公共可访问的方法,并打上@Bean注解,表示该方法返回的对象将作为bean的实例。
    • 原则上我们可以使用任意Java代码来产生bean实例。默认情况下,会将方法名作为bean的名称,我们当然也可以在@Bean注解后加name属性对bean名称进行重命名。

每天进步一点点,越慢才能越快!