Spring 之通过 Java 代码装配 bean

【关于IoC的几点认识】

1、面向接口编程 --> 每层只向上层提供接口

2、inversion of control (IoC)  --> 参考百度百科

3、DI是IoC的一种实现方式

【通过Java代码装配 bean】

由于自动化装配有一些无法避免的缺陷(例如无法装配第三方库中的组件

所以不得不采用显示装配的方式,按照书上的说法,显示装配有两种可选方案:Java和XML,

JavaConfig是更好的选择(更加强大、安全),XML属于历史遗留问题。

1、用 配置 代替 扫描。

package soundsystem;

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

@Configuration
public class CDPlayerConfig {
    @Bean
    public CompactDisc sgtPeppers() {
        return new SgtPeppers();
        // 返回一个对象,该对象将注册为Spring应用上下文中的bean,bean的ID默认与方法名相同
        // 默认情况下该bean为单例
    }

    @Bean
    public CompactDisc randomBeatlesCD() {
        // 可以各种 if else ,尽情发挥Java的所有功能,
        // 只要最终返回一个 CompactDisc实例既可
        // 带有 @Bean 注解的方法可以采用任何必要的Java功能来产生 bean实例
        return new SgtPeppers();
    }
}

 Java 显式创建 bean 的两个注解是类级别的 @Configuration 注解和方法级别的 @bean 注解,最后需要把这个配置类导入到根配置文件中。

2、最简单的注入(装配)方式。——直接在JavaConfig中装配

package soundsystem;

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

@Configuration
public class CDPlayerConfig {
    @Bean
    public CompactDisc randomBeatlesCD() {
        // 可以各种 if else ,尽情发挥Java的所有功能,
        // 只要最终返回一个 CompactDisc实例既可
        // 带有 @Bean 注解的方法可以采用任何必要的Java功能来产生 bean实例
        return new SgtPeppers();
    }

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

3、无法解决歧义的注入(装配)方式。—— @ Autowired (不算用Java代码装配 bean,只是用Java代码配置 bean!)

如果配置形如 1 ,将由于歧义无法完成装配。

package soundsystem;

import static org.junit.Assert.*;

import org.junit.Rule;
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 = CDPlayerConfig.class)
public class CDPlayerTest {

    @Autowired
    private CompactDisc cd;

    @Autowired
    private CDPlayer cdPlayer;

    @Test
    public void cdAndCdPlayerShouldNotBeNull() {
        assertNotNull(cd);
        assertNotNull(cdPlayer);
    }
}

4、正确的注入姿势。

 暂略

原文地址:https://www.cnblogs.com/xkxf/p/7147799.html