博客园

Spring装配bean之通过 Java 代码装配 bean

github:https://github.com/guo1727013939/SpringBean
   在Spring中,对象无需自己查找和创建与其所关联的其他对象。相反,容易负责把需要相互协作的对象引用赋予各个对象。例如,一个订单管理的组件需要信用卡认证组件,但它不需要自己创建信用卡认证组件。订单管理组件只需要表明自己两手空空,容器就会主动赋予它一个信用卡认证组件。创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入(DI)的本质。
   Spring容器负责创建应用程序的bean并通过DI来协调这些对象之间的关系。但是,作为开发人员,你需要告诉Spring要创建那些bean并且如何将其装配在一起。当描述bean如何进行装配时,Spring具有非常大的灵活性,它提供了三种主要的装配机制:

  • 在XML中进行显式配置;
  • 在Java中进行显式配置;
  • 隐式的bean发现机制和自动装配;

1.通过 Java 代码装配 bean

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

package soundsystem;
import org.springframework.beans.factory.annotation.Configurable;
/**
 * @author 国洪志
 * @description
 * @since 2022-08-22 10:49
 **/

@Configurable
public class CdPlayerConfig {
}

2声明简单的bean

package soundsystem;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;

/**
 * @author 国洪志
 * @description
 * @since 2022-08-22 10:49
 **/

@Configurable
public class CdPlayerConfig {

    /**
     *  @Bean 注解会告诉Spring这个方法将会返回一个对象,对该对象要注册为Spring应用上下文的Bean。
     * 默认情况下,bean的ID与带有@Bean注解的方法名是一样的。 可以使用@Bean的name属性进行重命名
     */
    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }
}

发挥想象力,我们希望可以做一点稍微疯狂的事情,比如说在一组CD中随机选择一个CompactDisc来播放

package soundsystem;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;

/**
 * @author 国洪志
 * @description
 * @since 2022-08-22 10:49
 **/

@Configurable
public class CdPlayerConfig {

    /**
     *  @Bean 注解会告诉Spring这个方法将会返回一个对象,对该对象要注册为Spring应用上下文的Bean。
     * 默认情况下,bean的ID与带有@Bean注解的方法名是一样的。 可以使用@Bean的name属性进行重命名
     */
    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }

    @Bean
    public CompactDisc randomBeatlesCD(){
        int choice = (int)Math.floor(Math.random() * 4);
        if (choice == 0){
            return new SgtPeppers();
        }else if (choice == 1){
            return new SgtPeppers();//另一张CD
        }else if (choice == 2){
            return new SgtPeppers();//另一张CD
        }else{
            return new SgtPeppers();//另一张CD
        }
    }
}

3 借助JavaConfig实现注入

   我们前面所声明的CompactDisc bean是非常简单的,它自身没有其他的以来。但现在我们需要声明CDPlayer Bean,它依赖于CompactDisc。在JavaConfig中,要如何将它们装配到在一起呢?


package soundsystem;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

/**
 * @author 国洪志
 * @description
 * @since 2022-08-22 10:49
 **/

@Configurable
public class CdPlayerConfig {

    /**
     *  @Bean 注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文的Bean。
     * 默认情况下,bean的ID与带有@Bean注解的方法名是一样的。 可以使用@Bean的name属性进行重命名
     */

    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }

    @Bean
    public CompactDisc randomBeatlesCD(){
        int choice = (int)Math.floor(Math.random() * 4);
        if (choice == 0){
            return new SgtPeppers();
        }else if (choice == 1){
            return new SgtPeppers();
        }else if (choice == 2){
            return new SgtPeppers();
        }else{
            return new SgtPeppers();
        }
    }


    /**
     *  默认情况下Spring中的Bean都是单例的,我们并没有必要创建相同的Bean
     *  
     *  我们这使用CDPlayer的构造器实现了DI功能,但是我们完全可以采用其他风格的DI配置
     *  
     *  带有@Bean注解的方法可以采用任何必要的方式来产生bean实例
     *  
     */
    @Bean
    public CDPlayer cdPlayer(){
        return new CDPlayer(sgtPeppers());
    }

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

    @Bean
    public CDPlayer cdPlayer(CompactDisc compactDisc){
        CDPlayer cdPlayer = new CDPlayer(compactDisc);
        cdPlayer.setCd(compactDisc);
        return cdPlayer;
    }
}
posted @ 2022-09-01 00:07  放纵!  阅读(112)  评论(0)    收藏  举报