zoukankan      html  css  js  c++  java
  • Spring自动装配bean

    Spring推荐面向接口编程,这样可以很好的解耦具体的实现类。

    CompactDisc.class 文件:

    public interface CompactDisc {
    
        void play();
    }

     

    SgtPeppers.class 文件:

    import org.springframework.stereotype.Component;
    
    /*
    * 使用注解 @Component 生命该类为一个组件,并告知Spring要为这个类创建bean实例
    * Spring 应用上下文中所有的 bean 都有一个 ID 。
    * 如果没有明确设置 ID ,Spring 会根据类名(将类名首字母小写)为其指定一个 ID。
    *
    * 明确设置 ID ,只需要将自定义的 ID 名传递给 @Component 注解即可,如:
    *   @Component("lonelyHeartsClub")
    *
    * 也可以使用 @Named 注解来设置 ID,如:
    *   @Named("lonelyHeartsClub")
    *   该注解来源于 java 依赖注入规范
    * */
    @Component
    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);
        }
    }

     

    CDPlayerConfig.class 文件:

    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    /*
    * Spring 的组件扫描默认是不启用的,需要显式配置启用组件扫描去寻找被 @Component 注解修饰的组件类,并为其创建 bean 实例。
    * */
    
    // 标记类 CDPlayerConfig 是 Spring 的配置类,通过 java 代码定义 Spring 的装配规则。
    @Configuration
    /*
    * 声明启用 Spring 的组件扫描。
    *
    * 默认组件扫描包:
    * 默认扫描配置类所在的包,及其子包,查找被 @Component 注解标记的类,并为其创建 bean 实例。
    *
    * 显式指定组件扫描包:
    * 如果我们想要将配置类放在单独的包中,使其与其他的应用代码区分开来,这时默认的扫描包就不能满足需求了。
    * 这时可以通过设置 @ComponentScan 注解的 value 属性值,来明确指定需要扫描的包,如:
    *   @ComponentScan("需要扫描的包名")
    *
    * 如果想更清晰的表明设置的是基础扫描包,可以使用 basePackages 属性,如:
    *   @ComponentScan(basePackages={"包名1","包名2",...})
    *
    * 上面才用 String 类型设置扫描包的方式是类型不安全的,如果重构代码,指定的基础包就很可能会出错。
    * Spring 提供了另一种设置扫描包的方式:使用 basePackageClasses 属性,将要扫描的包指定为该包中所包含的类或接口,如:
    *   @ComponentScan(basePackageClasses={CompactDisc.class, SgtPeppers.class})
    *   被指定的类或接口所在的包,将会作为组件扫描的基础包。
    *   实践技巧:可以在需要扫描的包中创建一个用来进行扫描的空的标记接口,通过标记接口的方式,可以避免引用任何实际的程序代码,避免重构造成影响。
    *
    * 在XML中启用组件扫描:
    * 在 XML 中启用组件扫描,使用 context 命名空间的 <context:component-scan> 元素,如:
    *   <context:component-scan base-package="需要被扫描的包名">
    * */
    @ComponentScan
    public class CDPlayerConfig {
    }

     

    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 依赖注解规范)
        * */
        @Autowired
        private CompactDisc cd;
    
        /*
        * @Autowired 注解不仅能用在构造器上,还可以用在属性的 setter 方法上。
        * */
        @Autowired
        public void setCd(CompactDisc cd) {
            this.cd = cd;
        }
    
        /*
        * 实际上 @Autowired 注解可以用在类的任何方法上。
        * */
        public void insertDisc(CompactDisc cd) {
            this.cd = cd;
        }
    
        @Test
        public void cdShouldNotBeNull() {
            assertNotNull(cd);
        }
    }

     

  • 相关阅读:
    CSS3-loading动画(三)
    CSS3-loading动画(二)
    CSS3-loading动画(一)
    CSS reset ---- 个人理解与惯用方式
    HTTP常见状态码 200 301 302 404 500
    c#导出文件,文件名中文乱码解决方法。
    对FineU框架Grid多表头合计行导出Excel的回顾
    JS数据类型
    细数使用View UI(iView)开发中遇到的坑
    源生JS实现点击复制功能
  • 原文地址:https://www.cnblogs.com/yingtoumao/p/8669026.html
Copyright © 2011-2022 走看看