spring注入一个实体bean的集合并指定顺序

这篇博客介绍了如何在Spring中向一个Bean注入实现了特定接口的实体Bean集合,并通过@Order注解指定它们的顺序。首先定义了接口和其实现类,接着展示了如何直接注入集合和创建单独的集合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;



<think>好的,我现在要解决用户的问题:“如何通过标签将实体注入到IoC容器中”。首先,我需要回顾一下用户提供的引用内容,看看里面有没有相关的信息。 引用[1]提到IoC容器的作用是简化依赖注入,列举了常见的容器如Spring.NET和Autofac。引用[2]详细解释了依赖注入的概念,说明Spring如何动态赋值属性。引用[3]提到了使用@Import注解注入第三方类,但这是针对注解的方式,用户问的是标签,也就是XML配置。引用[4]和[5]则讨论了XML和注解注入的方式,其中引用[5]特别提到了使用构造函数注入的标签。 用户的问题集中在XML配置,也就是标签方式。所以需要整理Spring中通过XML标签注入Bean的方法。根据知识库,常见的标签包括<bean>定义,构造函数注入使用<constructor-arg>,属性注入使用<property>,还有自动装配的autowire属性。 接下来需要分步骤说明:定义Bean、构造函数注入、属性注入、自动装配,可能还要提到命名空间如p:和c:。同时要确保例子正确,比如<bean>标签的id和class属性,构造函数参数的index或name,属性注入的ref或value。还要注意是否需要引入schema声明,比如p命名空间。 另外,用户可能对自动装配的类型感兴趣,比如byType和byName的区别。要确保每个部分都覆盖,且例子清晰。最后,总结不同方式的适用场景,帮助用户理解何时使用哪种方法。 需要检查是否有遗漏,比如是否提到集合类型的注入,但根据用户的问题,可能不需要太深入。主要聚焦在基础标签的使用上。确保引用正确的参考文献,比如引用[2]和[5]中的内容,说明依赖注入的实现方式。</think>### 通过XML标签将实体注入IoC容器的方法 在Spring框架中,使用XML标签将实体注入IoC容器主要通过定义`<bean>`标签实现,配合依赖注入(DI)的两种核心方式:**构造函数注入**和**属性注入**。以下是具体实现方法及示例: --- #### 一、基础Bean定义 通过`<bean>`标签声明类的实例化方式,指定唯一标识符(id)和类路径(class): ```xml <!-- 定义名为userService的Bean --> <bean id="userService" class="com.example.UserServiceImpl"/> ``` 此时Spring会自动调用无参构造函数创建对象[^2][^5]。 --- #### 二、构造函数注入 通过`<constructor-arg>`标签为构造函数参数赋值,支持**按顺序**或**按名称**注入: ```xml <!-- 按顺序注入 --> <bean id="orderService" class="com.example.OrderService"> <constructor-arg index="0" value="1001"/> <!-- 第一个参数 --> <constructor-arg index="1" ref="userDao"/> <!-- 第二个参数(引用其他Bean) --> </bean> <!-- 按名称注入 --> <bean id="paymentService" class="com.example.PaymentService"> <constructor-arg name="timeout" value="5000"/> <constructor-arg name="retryStrategy" ref="retryStrategy"/> </bean> ``` 此方式适用于强制依赖项,确保对象初始化时参数完整[^5]。 --- #### 三、属性注入 通过`<property>`标签为类的属性赋值,支持基本类型、对象引用和集合类型: ```xml <bean id="userDao" class="com.example.UserDaoImpl"/> <bean id="userService" class="com.example.UserServiceImpl"> <property name="userDao" ref="userDao"/> <!-- 注入对象引用 --> <property name="maxRetry" value="3"/> <!-- 注入基本类型 --> <property name="allowRoles"> <!-- 注入集合 --> <list> <value>admin</value> <value>editor</value> </list> </property> </bean> ``` 要求类中必须存在对应的setter方法(如`setUserDao()`)[^4][^5]。 --- #### 四、自动装配(Autowiring) 通过`autowire`属性实现依赖的自动关联,减少手动配置: ```xml <bean id="orderController" class="com.example.OrderController" autowire="byType"/> ``` 支持四种模式: - `byType`:按类型匹配容器中的Bean - `byName`:按属性名与Bean的id匹配 - `constructor`:按构造函数参数类型匹配 - `no`(默认):不自动装配 --- #### 五、简化配置(p/c命名空间) 使用命名空间简化属性或构造函数的注入: ```xml <!-- 引入命名空间 --> xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" <!-- p命名空间(属性注入) --> <bean id="dataSource" class="com.example.DataSource" p:driver="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/test"/> <!-- c命名空间(构造函数注入) --> <bean id="reportService" class="com.example.ReportService" c:template="daily_report" c:generator-ref="pdfGenerator"/> ``` --- #### 总结对比 | 方式 | 适用场景 | 特点 | |-----------------|-------------------------|-------------------------------| | 构造函数注入 | 强制依赖项 | 保证对象初始状态完整 | | 属性注入 | 可选依赖项 | 需提供setter方法 | | 自动装配 | 减少重复配置 | 可能因Bean不唯一导致冲突 | | p/c命名空间 | 简化XML代码 | 需引入额外命名空间声明 | ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值