博客园
Spring装配bean之通过 Java 代码装配 bean
Published on 2022-09-01 00:07 in 分类: Spring , 学习笔记 , Spring实战 with 放纵!

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 @   放纵!  阅读(102)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 25岁的心里话
    · 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
    · 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
    · 零经验选手,Compose 一天开发一款小游戏!
    · 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
    点击右上角即可分享
    微信分享提示