Spring 自动依赖注入优化(qualifier)

来源:互联网 发布:ubuntu开启3306端口 编辑:程序博客网 时间:2024/05/22 13:08

– Start
自动依赖注入大大简化了我们的工作量,但是也有缺陷,如果一个接口有多个实现类,我们该注入哪一个呢?一种方法是给bean设置一个限定符(qualifier)

package shangbo.spring.example36;public interface MessageService {    String getMessage();}
package shangbo.spring.example36;public class MessageServiceDBImpl implements MessageService {    public String getMessage() {        return "This message from database";    }}
package shangbo.spring.example36;public class MessageServiceFileImpl implements MessageService {    public String getMessage() {        return "This message from file";    }}
package shangbo.spring.example36;import org.springframework.beans.factory.annotation.Qualifier;public class MessagePrinter {    private MessageService service;    // 使用限定符    @Qualifier("DB")    public void setService(MessageService service) {        this.service = service;    }    public void printMessage() {        System.out.println(service.getMessage());    }}
<?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-4.3.xsd"    default-autowire="byType">    <!--         全局设定自动注入方式    -->    <!--         告诉 Spring 解析bean中的注解        注意需要引入 context 命名空间    -->    <context:annotation-config/>    <!--         两个对象继承自同一接口, 设置不同的限定符 qualifier     -->    <bean class="shangbo.spring.example36.MessageServiceDBImpl">        <qualifier value="DB"/>    </bean>    <bean class="shangbo.spring.example36.MessageServiceFileImpl">        <qualifier value="FILE"/>    </bean>    <bean class="shangbo.spring.example36.MessagePrinter"/></beans>
package shangbo.spring.example36;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {    public static void main(String[] args) {        // 实例化 Spring IoC 容器        ApplicationContext context = new ClassPathXmlApplicationContext("example.xml", MessagePrinter.class);        // 从容器中获得 MessagePrinter 的实例        MessagePrinter printer = context.getBean(MessagePrinter.class);        // 使用对象        printer.printMessage();    }}

下面是使用 Java 配置的例子。

package shangbo.spring.example37;public interface MessageService {    String getMessage();}
package shangbo.spring.example37;public class MessageServiceDBImpl implements MessageService {    public String getMessage() {        return "This message from database";    }}
package shangbo.spring.example37;public class MessageServiceFileImpl implements MessageService {    public String getMessage() {        return "This message from file";    }}
package shangbo.spring.example37;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;public class MessagePrinter {    private MessageService service;    // 限定符    @Autowired    @Qualifier("DB")    public void setService(MessageService service) {        this.service = service;    }    public void printMessage() {        System.out.println(service.getMessage());    }}
package shangbo.spring.example37;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class AppConfig {    @Bean    @Qualifier("DB")    public MessageService dbMessageService() {        return new MessageServiceDBImpl();    }    @Bean    @Qualifier("FILE")    public MessageService fileMessageService() {        return new MessageServiceDBImpl();    }    @Bean    public MessagePrinter messagePrinter() {        return new MessagePrinter();    }}
package shangbo.spring.example37;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class App {    public static void main( String[] args )    {        // 实例化 Spring IoC 容器        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);        // 从容器中获得 MessagePrinter 的实例        MessagePrinter printer = context.getBean(MessagePrinter.class);        // 使用对象        printer.printMessage();    }}

更多参见:Spring Framework 精萃
– 声 明:转载请注明出处
– Last Updated on 2017-05-25
– Written by ShangBo on 2017-05-25
– End

原创粉丝点击