Spring学习(七):通过Java代码装配bean

1. 引言

尽管在很多场景下通过组件扫描和自动装配实现Spring的自动化配置是更为 推荐的方式,但有时候自动化配置的方案行不通,因此需要明确配置 Spring。比如说,你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@Autowired注解的,因此 就不能使用自动化装配的方案了。

在这种情况下,你必须要采用显式装配的方式。在进行显式配置的时候,有两种可选方案:Java和XML。在这节中,我们将会学习如何使用Java配置, 接下来的一节中将会继续学习Spring的XML配置。

JavaConfig与其他的Java代码又有所区别,在概念上,它与应用程序 中的业务逻辑和领域代码是不同的。尽管它与其他的组件一样都使用相同的 语言进行表述,但JavaConfig是配置代码。这意味着它不应该包含任何业务 逻辑,JavaConfig也不应该侵入到业务逻辑代码之中。尽管不是必须的,但 通常会将JavaConfig放到单独的包中,使它与其他的应用程序逻辑分离开 来,这样对于它的意图就不会产生困惑了。

2. 案例讲解

2.1 CD接口

package blog.p2;

public interface CD {
    void play();
}

2.2 JayCD实现CD接口

package blog.p2;

import org.springframework.stereotype.Component;

public class JayCD implements CD {

    private String title = "稻香";
    private String artist = "Jay";

    public void play() {
        System.out.println("palying " + title + " by " + artist);
    }

}

2.3 CDPlayer

package blog.p2;

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

public class CDPlayer {

    private CD cd;

    public CDPlayer() {
    }

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

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

    public void setCd(CD cd) {
        this.cd = cd;
    }
}

2.4 配置类

package blog.p2;

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

@Configuration
public class Config {

    @Bean
    public CD jayCd(){
        return new JayCD();
    }

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

}

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

默认情况下,bean的ID与带有@Bean注解的方法名是一样的。在本例中, bean的名字将会是jayCd。如果你想为其设置成一个不同的名字的 话,那么可以重命名该方法,也可以通过name属性指定一个不同的名字

那么如何实现注入呢?在这里并没有使用默认的构造器构建实例,而是调用了需要传入CD对象的构造器来创建CDPlayer实例。看起来,CD是通过调用jayCd()得到的,但情况并非完全如此。因为sgtPeppers()方法上添加了@Bean注解,Spring将会拦截所有对它的调用,并确保直接返回该方法所创建的bean,而不是每次都对其进行实际的调用。如果多个方法调用jayCd()方法,得到的将是同一个实例。

当然,也可以不用构造器注入的方式,而使用方法注入:

@Bean
public CDPlayer cdPlayer2(){
    CDPlayer cdPlayer = new CDPlayer();
    cdPlayer.setCd(jayCd());
    return cdPlayer;
}

2.5 测试类

package blog.p2;

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 = Config.class)
public class App {

    @Autowired
    CDPlayer cdPlayer;

    @Test
    public void test(){
        cdPlayer.play();
    }
}

最后输出:

palying 稻香 by Jay

至此,我们通过java配置Spring的案例就完成了。

你可能感兴趣的:(Spring)