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

– 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值