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

– 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());
    }
}



	
	
	
	
	
	
	
		
	
	
		
	
	
	

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;

@Configuration
public 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

你可能感兴趣的:(Spring,Framework)