自动依赖注入大大简化了我们的工作量,但是也有缺陷,如果一个接口有多个实现类,我们该注入哪一个呢?一种方法是给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