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
posted @ 2018-10-27 23:46  Senyag  阅读(613)  评论(1编辑  收藏  举报