zoukankan      html  css  js  c++  java
  • SpringFramework|@Qualifier 设值注入&构造注入

    @Qualifier 设值注入&构造注入

    前述

    Java: 1.8

    Maven: 3

    SpringFramework版本以及各组件成员: 5.1.1.RELEASE

    • spring-context
    • spring-core
    • spring-beans

    可能会有这样一种情况,当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱。

    示例(设值注入)

    Bean - Bean.java

    package noioo;
    
    public class Bean {
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    

    配置文件 - spring-beans.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:annotation-config/>
    
        <bean id="beanUser" class="noioo.BeanUser">
        </bean>
    
    	<!-- 此处有两个同类型的Bean, 我们只要那个"想要的" -->    
        <bean class="noioo.Bean">
            <property id="want" name="name" value="想要的Bean!"/>
        </bean>
        <bean class="noioo.Bean">
            <property name="name" value="不想要的Bean!"/>
        </bean>
    	<!-- 注意: 类只是个模板, 是"死"的. 只有创建出来的实例对象才具有生命周期.. -->
    </beans>
    

    Bean使用者 - BeanUser.java

    当不使用@Qualifier时, 会显示报错(如果你使用的是IDEA):

    代码如下:

    package noioo;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    
    public class BeanUser {
    
    
        private Bean bean;
    
        @Autowired
        @Qualifier("want")
        public void setBean(Bean bean) {
            this.bean = bean;
        }
    
        public Bean getBean() {
            return bean;
        }
    
        public void useBean(){
            System.out.println(bean.getName());
        }
    }
    

    您还可以改为在方法参数上指定@Qualifier注释

    @Autowired
    public void setBean(@Qualifier("want")Bean bean) {
        this.bean = bean;
    }
    

    执行者 - Runner.java

    package noioo;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Runner {
    
        public static void main(String[] args){
            ApplicationContext context = new ClassPathXmlApplicationContext("spring-beans.xml");
            BeanUser beanUser = (BeanUser) context.getBean("beanUser");
            beanUser.useBean();
        }
    }
    

    执行结果

    想要的Bean!
    
    Process finished with exit code 0
    

    示例(构造注入)

    一些修改 - BeanUser.java

    上述代码不变, 但修改BeanUser.java

    package noioo;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    
    public class BeanUser {
    
    
        private Bean bean;
    
    
        @Autowired
        public BeanUser(@Qualifier("want")Bean bean){
            this.bean = bean;
        }
    
        public Bean getBean() {
            return bean;
        }
    
        public void useBean(){
            System.out.println(bean.getName());
        }
    }
    

    执行结果

    想要的Bean!
    
    Process finished with exit code 0
    
  • 相关阅读:
    escape
    洛谷 P2158 【仪仗队】
    GIT学习----第五节:管理修改
    前端Webpack
    20 行 JS 代码,实现复制到剪贴板功能
    mysql表分区和分表的实现方式几种以及区别,什么时候用
    微信小程序----解析px、rpx、rem、vw实现页面布局
    微信小程序----相对路径图片不显示
    微信小程序----评价系统中的评星
    微信小程序----session_key失效导致的后台错误wxsp login api aesCbcUtil error info: pad block corrupted
  • 原文地址:https://www.cnblogs.com/shwo/p/9863828.html
Copyright © 2011-2022 走看看