zoukankan      html  css  js  c++  java
  • (七)装配Bean(1)

    针对给接口提供哪一个具体的实现,也就是装配哪一种具体的实现bean,在Spring中提供了多种方式,主要包括3种:

    • 一、隐式的bean发现机制和自动装配(自动化装配bean)
    • 二、在Java类中进行显式的配置
    • 三、在XML中进行显式的配置


    一、自动化装配Bean

    • 实现方式:
    1. 组件扫描:Spring会自动发现应用上下文所创建的bean
    2. 自动装配:Spring自动满足bean之间的依赖。
    • 原理:通过spring注解(@Component)来表明该类会作为组件类,并告知Spring要为这类创建bean,不过组件扫描默认是不启动的,需要显式的配置Spring,从而命令Spring去寻找带有(@Component)注解的类,并为其创建bean。
    • 案例一

    • 编写一个接口类 CD.java
    package action;
    
    public interface CD {
        void play();
    }
    • 编写接口的实现类 CD1.java
    package action;
    
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
      
    @Component    //声明该类是一个组件类,spring会自动为这个类创建一个bean并注册到spring上下文
    @Qualifier("cdone")   //该注解声明该类的限定符为"cdone"
    public class CD1 implements CD{
    
        @Override
        public void play() {
        System.out.println("IM CD1");
            
        }
    
    }
    • 编写接口的实现类 CD2.java
    package action;
    
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
    
    @Component    //声明该类是一个组件类,spring会自动为这个类创建一个bean并注册到spring上下文
    @Qualifier("cdtwo")  //该注解声明该类的限定符为"cdtwo"
    public class CD2  implements CD{
    
        @Override
        public void play() {
        System.out.println("IM CD2");
            
        }
    
    }
    • 接口类 Player.java
    package action;
    
    public interface Player {
        void play();
    }
    • CDPlayer.java
    package action;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
    
    @Component("cdp")  //声明该类是一个组件类,spring会自动为这个类创建一个id为“cdp”的bean并注册到spring上下文
    public class CDPlayer implements Player {
        @Autowired   //自动装配注解,即从spring上下文自动寻找合适的类型注入
        @Qualifier("cdone")   //被注入CD类对象的限定符为"cdone"
        private CD cd;
    
        @Override
        public void play() {
            cd.play();
    
        }
    
    }
    • CDConfig.java
    package config;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration   //表明该类是一个配置类
    @ComponentScan(basePackages="action")    //开启扫描,spring默认不开启,必须设置基本包,spring会扫描基本包极其子包中的所有bean
    public class CDConfig {
    
    }
    • 编写测试类  Test.java
    package test;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    import config.CDConfig;
    import action.CDPlayer;
    
    public class Test {
        public static void main(String[] args) {
                ApplicationContext content=new AnnotationConfigApplicationContext(CDConfig.class);
                CDPlayer cdPlayer=(CDPlayer)content.getBean("cdp");
                cdPlayer.play();
                
        }
    }

    结果:

    IM CD1

    •  注意 :

      1.  @Autowired可以用在构造器,属性,任何方法前,spring在初始化bean的时候会尽可能去满足bean的依赖,每个使用了该注解的方法都会执行,但一般注入采用一种就可以。

    2.如果没有匹配的bean,那么在上下文创建的时候就会抛异常,为了避免,可将@Autowired的required的属性设为false,但你代码如果没判空,可能会出现空指针。

    3.@Autowired默认按类型自动注入,就是说如果,注入的时候根据类型去寻找,找不到抛找不到异常;找到一个则注入;找到多个则再根据名字去找,如果根据名字(字段名)找不到则抛找到多个异常,找到则注入;



  • 相关阅读:
    寒假瞎搞系列(5)
    《亿级用户下的新浪微博平台架构》阅读笔记
    《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》阅读笔记
    《游戏服务器的架构演进(完整版)》阅读笔记
    阅读架构漫谈(四)笔记
    阅读架构漫谈(三)笔记
    阅读架构漫谈(二)笔记
    以《淘宝网》为例,描绘质量属性的六个常见属性场景
    阅读架构漫谈(一)笔记
    假期周进度总结2
  • 原文地址:https://www.cnblogs.com/shyroke/p/6847087.html
Copyright © 2011-2022 走看看