zoukankan      html  css  js  c++  java
  • SpringFramework|自定义@Qualifier

    @Qualifier自定义限定注解

    前述

    @Senyag

    Java: 1.8

    Maven: 3

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

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

    官方文档: 1.9.4 Using Generics as Autowiring Qualifiers

    您可以创建自己的自定义限定符注释。为此,请定义注释并在定义中提供@Qualifier注释.

    示例

    背景: 影院影片播放程序.

    让执行者(Runner.java)调用BeanUser来选定特定的影片进行播放, 但它们都基于Bean类创建, 这需要通过某些设定来做限定.

    Runner.java要做的是先放映动作片ActionMovie, 再放映喜剧片ComedyMovie

    实际上在这需求场景@Qualifier就够用了...... 自定义@Qualifier只是在不使用Beanid匹配时所提供的另一种弥补方案. (个人看法)

    自定义@Qualifier

    package noioo;
    
    import org.springframework.beans.factory.annotation.Qualifier;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    
    @Target({ElementType.FIELD, ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Qualifier
    public @interface Genre{
        // 注意: value指的是@Genre匹配时的值, 并不是注入的固定值.
        String value();
    }
    

    影片的模板 - Bean.java

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

    放映系统 - BeanUser.java

    package noioo;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class BeanUser {
    
    
    
    
        @Autowired
        @Genre("ComedyMovie") //匹配的值(value)
        private Bean comedyMovie;
    
        private Bean actionMovie;
        @Autowired
        public BeanUser(@Genre("ActionMovie") Bean actionMovie) {
            this.actionMovie = actionMovie;
        }
    
        public void watchTheActionMovie() {
            System.out.println(actionMovie.getName());
        }
    
        public void watchTheComedyMovie() {
            System.out.println(comedyMovie.getName());
        }
    }
    

    配置文件 - 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 id="want" class="noioo.Bean">
            <!--使用qualifier标签指定我们所自定义的注解-->
            <!--注意: value指的是@Genre匹配时的值, 并不是注入的固定值.-->
            <qualifier type="noioo.Genre" value="ActionMovie"/>
            <!--以下才是注入的固定值-->
            <property name="name" value="现在放映的是动作片"/>
        </bean>
        <bean class="noioo.Bean">
            <qualifier type="noioo.Genre" value="ComedyMovie"/>
            <property name="name" value="现在放映的是喜剧片"/>
        </bean>
    
    </beans>
    

    执行者 - 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.watchTheActionMovie();
            System.out.println("........");
            beanUser.watchTheComedyMovie();
        }
    }
    

    @Senyag

    执行结果

    现在放映的是动作片
    ........
    现在放映的是喜剧片
    
    Process finished with exit code 0
    
  • 相关阅读:
    Selenium+Pytest自动化测试框架实战
    WPF性能优化经验总结
    C#跨窗体调用控件
    C# lock
    硬实时系统,到底多硬才算Hard Real Time System
    [GPIO]推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置
    【STM32F407的DSP教程】第50章 STM32F407的样条插补实现,波形拟合丝滑顺畅
    实战技能分享,如何让工程代码各种优化等级通吃,含MDK AC5,AC6,IAR和GCC
    【深入探讨】DMA到底能不能起到加速程序执行的作用,DMA死等操作是否合理,多个DMA数据流同时刷是否处理过来
    《安富莱嵌入式周报》第238期:2021.11.012021.11.07
  • 原文地址:https://www.cnblogs.com/shwo/p/9863961.html
Copyright © 2011-2022 走看看