1. 程式人生 > >spring注入一個實體bean的集合並指定順序

spring注入一個實體bean的集合並指定順序

本文向一個bean中注入一個介面實體bean的集合,並指定各個實體bean在集合中的順序,然後在被注入bean中按順序呼叫集合中的bean實體中的方法。核心實現時在實體類上使用@Order註解來定製各個bean被注入的順序實現。

1、定義實體類方法介面

如下demo定義了一個介面類,其中有一個doHandler的方法。

package api.landsem.iot.v1.handler.impl.rpc;

public interface IRpcStatusHandler {
	/** 
	* @Title: doHandler 
	* @Description: Handler method for status update.
	* @param data
	* @param sign      
	*/  
	void doHandler(String status,String sign);
}

2、新增介面實現

如下為三個介面的實現類,注意在實現類上使用@Order註解來指定該實體bean被載入的順序,註解中的值越小越優先被載入注入。

package api.landsem.iot.v1.handler.impl.status;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import api.landsem.iot.v1.handler.IIotDeviceHandler;
import api.landsem.iot.v1.handler.IIotDeviceHandler.IOTDeviceStatus;
import api.landsem.iot.v1.handler.IIotDeviceHandler.IOTDeviceStatus.Status;
import api.landsem.iot.v1.handler.impl.rpc.IRpcStatusHandler;

/**
 * Update device status on device login.
 *
 */
@Component
@Order(1)
public class StatusUpdateHandler implements IRpcStatusHandler{	
	private static final Logger logger = Logger
			.getLogger(StatusUpdateHandler.class);	
	
	@Autowired
	private IIotDeviceHandler mIotDeviceHandler;

	@Override
	public void doHandler(String status, String sign) {
		logger.info("Call status update handler.");
	}
}

package api.landsem.iot.v1.handler.impl.status;

import org.apache.log4j.Logger;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import api.landsem.iot.v1.handler.impl.rpc.IRpcStatusHandler;

/**
 * Send off line configuration message on device login.
 *
 */
@Component
@Order(2)
public class SendOfflineConfigHanler implements IRpcStatusHandler{
	private static final Logger logger = Logger
			.getLogger(SendOfflineConfigHanler.class);		

	@Override
	public void doHandler(String status, String sign) {
		logger.info("Call send offline configuration handler.");		
	}
}

package api.landsem.iot.v1.handler.impl.status;

import org.apache.log4j.Logger;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import api.landsem.iot.v1.handler.impl.rpc.IRpcStatusHandler;

/**
 * Send off line navigation message on device login.
 */
@Component
@Order(3)
public class SendOfflineNavigationHandler implements IRpcStatusHandler{
	private static final Logger logger = Logger
			.getLogger(SendOfflineNavigationHandler.class);	
	
	@Override
	public void doHandler(String status, String sign) {
		logger.info("Call send offline navigation handler.");
		
	}
}

3、使用

(1)、直接注入到集合

在需要使用的bean中,直接建立一個IRpcStatusHandler介面的集合,然後使用@Autowired註解即可,程式啟動後會自動將實現了該介面的bean按照Order註解的順序注入到集合中。

    @Autowired
    public List<IRpcStatusHandler> mRpcStatusHandlers;

(2)、建立一個單獨的集合bean

建立一個集合屬性,然後使用@Autowired注入實現的bean,之後再將該集合屬性作為一個bean返回並未bean指定名字。在其他bean中使用@Autowired注入時使@Qualifier註解指定bean的名字,實現載入集合bean。如下為java中的bean配置程式碼:

package api.landsem.iot.v1.handler.impl.rpc.configuration;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import api.landsem.iot.v1.handler.impl.rpc.IRpcMessageHandler;
import api.landsem.iot.v1.handler.impl.rpc.IRpcStatusHandler;

@Configuration
@ComponentScan("api.landsem.iot.v1.handler.impl.status")
public class RpcConfiguration {
    @Autowired
    private List<IRpcStatusHandler> mRpcStatusHandlers;
    
    /** 
    * @Title: getRpcStatusHandlers 
    * @Description: RPC status update hander bean list. 
    * @return      
    */  
    @Bean(name="rpcStatusUpdateHandlers")
    public List<IRpcStatusHandler> getRpcStatusHandlers() {
        return this.mRpcStatusHandlers;
    }
}

如下為在其他bean中使用集合bean物件的方法:

	@Autowired
	@Qualifier(value = "rpcStatusUpdateHandlers")
	public List<IRpcStatusHandler> mRpcStatusHandlers;