• 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、正确的注入姿势。

     暂略

  • 相关阅读:
    告别恼人的水平滚动条——滚动条宽度到底是多少?
    A用户控件包含B用户控件,在B里头如何取得A控件
    ASP.NET URL重写
    Asp.net(c#)发送电子邮件
    优化网站性能的14条规则
    复杂度的来源—高性能
    构建命令行式交易区块链应用
    复杂度来源—低成本、安全、规模
    实现一个简易的区块链
    复杂度来源—可扩展性
  • 原文地址:https://www.cnblogs.com/xkxf/p/7147799.html
Copyright © 2020-2023  润新知