spring注入一個實體bean的集合並指定順序
阿新 • • 發佈:2019-01-23
本文向一個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;