• 【Spring 核心】装配bean(二) JavaConfig装配


    前面介绍完了组件扫描和自动装配,这里再来看一下装配bean的另一种方式JavaConfig。

    包路径:

    src/main/java

    com.bonc-|--config--|--CDPlayerConfig.java (配置类)

                   |--pojo--- |--CompactDisc.java    (接口CompactDisc)

                                 |--SgtPeppers.java      (类SgtPeppers实现了CompactDisc)

                                 |--MediaPlayer.java      (接口 MediaPlayer)

                                 |--CDPlayer.java          (类CDPlayer实现了MediaPlayer)

    接口 CompactDisc.java

    package com.bonc.pojo;
    
    public interface CompactDisc {
        void  play();
    }

    实现类 SgtPeppers.java

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

    接口 MediaPlayer.java

    package com.bonc.pojo;
    
    public interface MediaPlayer {
        void play();
    }

    实现类CDPlayer.java

    package com.bonc.pojo;
    
    public class CDPlayer implements MediaPlayer{
    
        private CompactDisc cd;
        
        public CDPlayer(){
            super();
        }
        
        public CDPlayer(CompactDisc cd){
            this.cd = cd;
        }
        public void play() {
            cd.play();
        }
    
        public void setCd(CompactDisc cd) {
            this.cd = cd;
        }
    }

    配置类:(核心内容)

    package com.bonc.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.bonc.pojo.CDPlayer;
    import com.bonc.pojo.CompactDisc;
    import com.bonc.pojo.SgtPeppers;
    /*
     * 背景信息:
     *    很多场景下,推荐组件扫描、自动装配。但有些第三方组件是不方便装配的,因此需要显示配置,
     *    显示配置有两种JavaConfig或XML。
     *    进行显示配置,JavaConfig是更好的方案,因为它更加强大、类型安全、易于重构。
     *
     * JavaConfig:
     *    1.@Configuration表明这是一个配置类,该类应该包含Spring上下文如何创建bean的细节。
     *    2.尽管我们可以同时使用组件扫描和显示配置,但在这里我们更加关注显示配置,
     *    3.因此我们将CDPlayerConfig的@ComponentScan注解移除掉了。
     *    4.JavaConfig是配置代码,意味着它不应该包含任何业务逻辑,也不应该侵入到业务代码中。
     *    5.通常会将JavaConfig放到单独的包中,使它与其他应用程序逻辑分离开。
     * 
     * */
    
    @Configuration
    public class CDPlayerConfig {
    
        /*
         * 方法说明:
         * @Bean注解告诉Spring这个方法将会返回一个CompactDisc类型的对象,该对象要注册为Spring应用上下文中的bean
         * 方法体包含了最终产生bean实例的逻辑。
         * ID:
         * 默认情况下,bean的ID与带有@Bean注解的方法名是一样的,在本实例中,bean的默认是sgtPeppers
         * 如果要自定义bean的ID,可以设name属性。
         * 
         * 
         * */
        @Bean
        public CompactDisc sgtPeppers(){
            return new SgtPeppers();
        }
        /*
         * JavaConfig中装配bean的最简单方式就是引用创建bean的方法
         * 方法说明:
         * cdPlayer没有使用默认的构造器创建实例,而是调用了sgtPeppers()
         * Spring会拦截sgtPeppers()的调用,来确保sgtPeppers的单例
         * 每次调用sgtPeppers都返回同一个实例
         * 
         * */
        @Bean
        public CDPlayer cdPlayer(){
            return new CDPlayer(sgtPeppers());
        }
        
        /*
         * 更为简单的方式,cdPlayer请求一个CompactDisc作为参数,
         * 通过这种方式引用其他的bean是最佳的选择,因为它不会要求sgtPeppers()方法在同一个配置类中
         * 甚至没有要求CompactDisc要在JavaConfig中声明
         * 实际上它可以通过组件扫描或XML配置进行配置
         * 你可以将配置分散到多个配置类、XML文件、以及自动扫描和装配bean中,只要功能健全即可。
         * */
        @Bean
        public CDPlayer cdPlayer(CompactDisc cd){
            return new CDPlayer(cd);
        }
        
        /*
         * 还可以通过其他风格实现DI功能,不限于构造器和setter方法
         * */
        @Bean CDPlayer cdPlayer2(CompactDisc compactDisc){
            CDPlayer cdPlayer = new CDPlayer();
            cdPlayer.setCd(compactDisc);
            return cdPlayer;
        }
        
    }



  • 相关阅读:
    Linux命令-read
    pytest8-skip与xfail
    python模块-contextlib
    python中eval的使用
    python学习-面向对象(六)
    java学习-IDEA运行java程序报错
    nginx 使用SSL证书 代理https
    BC30560: “ExtensionAttribute”在命名空间“System.Runtime.CompilerServices”中不明确。
    nginx 代理相对路径使用不起
    nginx 解决不同web服务器 在同一服务器使用80端口问题
  • 原文地址:https://www.cnblogs.com/zhengwenqiang/p/6804618.html
Copyright © 2020-2023  润新知