– Start
点击此处观看本系列配套视频。
自动依赖注入大大简化了我们的工作量,但是也有缺陷,如果一个接口有多个实现类,我们该注入哪一个呢?一种方法是设置其中的一个为 primary
package shangbo.spring.example34;
public interface MessageService {
String getMessage();
}
package shangbo.spring.example34;
public class MessageServiceDBImpl implements MessageService {
public String getMessage() {
return "This message from database";
}
}
package shangbo.spring.example34;
public class MessageServiceFileImpl implements MessageService {
public String getMessage() {
return "This message from file";
}
}
package shangbo.spring.example34;
public class MessagePrinter {
private MessageService service;
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="byType">
<!--
全局设定自动注入方式
-->
<!--
两个对象继承自同一接口
第一个对象定义为 primary
-->
<bean class="shangbo.spring.example34.MessageServiceDBImpl" primary="true" />
<bean class="shangbo.spring.example34.MessageServiceFileImpl"/>
<bean class="shangbo.spring.example34.MessagePrinter"/>
</beans>
package shangbo.spring.example34;
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.example35;
public interface MessageService {
String getMessage();
}
package shangbo.spring.example35;
public class MessageServiceDBImpl implements MessageService {
public String getMessage() {
return "This message from database";
}
}
package shangbo.spring.example35;
public class MessageServiceFileImpl implements MessageService {
public String getMessage() {
return "This message from file";
}
}
package shangbo.spring.example35;
import org.springframework.beans.factory.annotation.Autowired;
public class MessagePrinter {
private MessageService service;
@Autowired
public void setService(MessageService service) {
this.service = service;
}
public void printMessage() {
System.out.println(service.getMessage());
}
}
package shangbo.spring.example35;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
public class AppConfig {
@Bean
public MessageService dbMessageService() {
return new MessageServiceDBImpl();
}
// 申明 bean 为 primary
@Bean
@Primary
public MessageService fileMessageService() {
return new MessageServiceDBImpl();
}
@Bean
public MessagePrinter messagePrinter() {
return new MessagePrinter();
}
}
package shangbo.spring.example35;
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