zoukankan      html  css  js  c++  java
  • 通过java代码装配bean

    CompactDisc.class :

    public interface CompactDisc {
    
        void play();
    }

     

    HardDaysNight.class :

    public class HardDaysNight implements CompactDisc {
    
        private String title = "Hard. DaysNight's Lonely Hearts Club Band";
        private String artist = "The Hard";
    
        @Override
        public void play() {
            System.out.println("Playing " + title + " by " + artist);
        }
    }

     

    Revolver.class :

    public class Revolver implements CompactDisc {
    
        private String title = "Revolver. Revolver's Lonely Hearts Club Band";
        private String artist = "The Revolver";
    
        @Override
        public void play() {
            System.out.println("Playing " + title + " by " + artist);
        }
    }

     

    SgtPeppers.class :

    public class SgtPeppers implements CompactDisc {
    
        private String title = "Sgt. Pepper's Lonely Hearts Club Band";
        private String artist = "The Beatles";
    
        @Override
        public void play() {
            System.out.println("Playing " + title + " by " + artist);
        }
    }

     

    WhiteAlbum.class :

    public class WhiteAlbum implements CompactDisc {
    
        private String title = "White. Album's Lonely Hearts Club Band";
        private String artist = "The White";
    
        @Override
        public void play() {
            System.out.println("Playing " + title + " by " + artist);
        }
    }

     

    CDPlayer.class :

    public class CDPlayer {
    
        private CompactDisc cd;
    
        public CDPlayer() {
    
        }
    
        public CDPlayer(CompactDisc cd) {
            this.cd = cd;
        }
    
        public void setCd(CompactDisc cd) {
            this.cd = cd;
        }
    
        public void play() {
            cd.play();
        }
    }

     

    CDPlayerConfig.class :

    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /*
    * Spring 的组件扫描默认是不启用的,需要显式配置启用组件扫描去寻找被 @Component 注解修饰的组件类,并为其创建 bean 实例。
    * */
    
    /*
    * 标记类 CDPlayerConfig 是 Spring 的配置类,通过 java 代码定义 Spring 的装配规则。
    * 该类应该包含在Spring应用上下文中如何创建bean的细节。
    * */
    @Configuration
    public class CDPlayerConfig {
    
        /*
        * 要在 JavaConfig 中声明 bean ,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加 @Bean 注解。
        *
        * @Bean 注解会告诉 Spring 这个方法将会返回一个对象,该对象要注册为 Spring 应用上下文中的 bean 。
        * 方法体中包含了最终产生 bean 实例的逻辑。
        *
        * 默认,bean 的 ID 和方法名是一样的,如下 bean 的 ID 为 sgtPeppers 。
        * 如果想手动为 bean 指定一个 ID ,可以使用 @Bean 的 name 属性,如:
        *   @Bean(name="lonelyHeartsClubBand")
        * */
        @Bean
        public CompactDisc sgtPeppers() {
            return new SgtPeppers();
        }
    
        // 这里是使用 Java 创建 bean,因此我们可以发挥 Java 提供的所有功能,只要最终生成一个 CompactDisc 实例即可。例如:
        @Bean
        public CompactDisc randomBeatlesCD() {
            CompactDisc cd;
            int choice = (int) Math.floor(Math.random() * 4);
            switch (choice) {
                case 1:
                    cd = new SgtPeppers();
                    break;
                case 2:
                    cd = new WhiteAlbum();
                    break;
                case 3:
                    cd = new HardDaysNight();
                    break;
                default:
                    cd = new Revolver();
                    break;
            }
            return cd;
        }
    
        /*
        * Spring 装配方式一:
        * 在JavaConfig中装配bean的最简单方式就是引用创建bean的方法。
        * */
        @Bean
        public CDPlayer cdPlayer() {
    //        return new CDPlayer(sgtPeppers());
            return new CDPlayer(new WhiteAlbum());
        }
    
        /*
        * Spring 装配方式二:
        * 当 Spring 调用 cdPlayer() 创建 CDPlayer bean 的时候,它会自动装配一个 CompactDisc 到配置方法之中。
        * 然后,方法体就可以按照合适的方式来使用它。
        *
        * 通过这种方式引用其他的 bean 通常是最佳的选择,因为它不会要求将 CompactDisc 声明到同一个配置类之中。
        * 在这里甚至没有要求 CompactDisc 必须要在 JavaConfig 中声明,
        * 实际上它可以通过组件扫描功能自动发现或者通过 XML 来进行配置。
        * 你可以将配置分散到多个配置类、XML 文件以及自动扫描和装配 bean 之中,
        * 只要功能完整健全即可。不管 CompactDisc 是采用什么方式创建出来的,
        * Spring 都会将其传入到配置方法中,并用来创建 CDPlayer bean 。
        *
        * 当配置类中有多个同类型的 bean 时,此时可以使用 @Qualifier 注解来指定参数注入的是哪一个具体的 bean 。
        * */
        @Bean
        public CDPlayer cdPlayer(@Qualifier("randomBeatlesCD") CompactDisc compactDisc) {
            return new CDPlayer(compactDisc);
        }
    
        /*
        * 我们也可以采用属性赋值的方式来注入依赖值,这里所存在的可能性仅仅受到Java语言的限制。
        * */
    //    @Bean
    //    public CDPlayer cdPlayer(@Qualifier("sgtPeppers") CompactDisc compactDisc) {
    //        CDPlayer cdPlayer = new CDPlayer();
    //        cdPlayer.setCd(compactDisc);
    //        return cdPlayer;
    //    }
    }

     

    CDPlayerTest.class :

    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;
    
    import static org.junit.Assert.assertNotNull;
    
    // 使用 Spring 的 SpringJUnit4ClassRunner ,以便在测试开始的时候自动创建 Spring 的应用上下文。
    @RunWith(SpringJUnit4ClassRunner.class)
    // 声明需要加载的配置类
    @ContextConfiguration(classes = CDPlayerConfig.class)
    public class CDPlayerTest {
    
        /*
        * 自动装配,就是让 Spring 自动满足 bean 依赖的一种方法。
        * 使用 @Autowired 标记的属性,Spring 会自动将所需的依赖值注入进来。
        *
        * 如果有且只有一个 bean 匹配依赖需求,Spring 会自动将这个 bean 装配进来;
        * 如果没有匹配的 bean ,那么在应用上下文创建时,Spring 会抛出一个异常。
        * 为了避免次异常,可以将 @Autowired 注解的 required 属性设置为 false ,如:
        *   @Autowired(required=false)
        *   此时 Spring 会尝试进行自动装配,但如果没有匹配的 bean ,Spring 将会让这个 bean 处于未转配的状态。
        *
        * 如果有多个 bean 都能满足依赖关系的话,Spring 也会抛出一个异常,因为没有明确指定选择哪个 bean 进行装配。
        *
        * @Autowired 是 Spring 特有的注解,我们也可以使用 @Inject 注解代替(@Inject 来源于 java 依赖注解规范)
        *
        * 当配置类中配置了多个同类型的 bean 时,自动装配时,会采用后配置的 bean 。
        * */
        @Autowired
        private CDPlayer cdPlayer;
    
    
        @Test
        public void cdShouldNotBeNull() {
            assertNotNull(cdPlayer);
            cdPlayer.play();
        }
    }

     

  • 相关阅读:
    HTML5画布(线条、渐变)
    HTML5画布(圆形)
    HTML5画布(矩形)
    HTML5拖放
    HTML5音频
    HTML5视频
    table添加正确的样式
    Mac上SublimeText3安装Emmet时PyV8安装问题
    PHP分页
    Mysql的limit用法
  • 原文地址:https://www.cnblogs.com/yingtoumao/p/8670254.html
Copyright © 2011-2022 走看看