如何配置一个带泛型的Bean

本文介绍如何在Spring中正确配置带有泛型的Bean,避免XML配置文件中的特殊字符引起解析错误,并展示了使用JavaConfig进行配置的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

希望在Spring容器中配置一个带泛型的Bean,直接配置如下:

<bean id="list" class="java.util.ArrayList<java.lang.String>"/>


启动容器时,将报如下所示:

Caused by: org.xml.sax.SAXParseException: The value of attribute "class" associated with an element type "null" must not contain the '<' character.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1427)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(XMLScanner.java:945)


这是因为“<”或“>”的字符是XML的特殊字符,它会破坏Spring XML配置文件的格式,因此产生了错误


由于Spring 3.0引入了JavaConfig,以代码的方式定义Bean,因此我们可以使用如下方式配置之:

package com.ioctest; /**
* Copyright:中软海晟信息科技有限公司 版权所有 违者必究 2013
*/

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class AppConfig {

@Bean(name = "listStr")
public List<String> listStrBean(){
return new ArrayList<String>();
}
}


在XML配置文件中引用这个JavaConfig:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!-- <bean id="list" class="java.util.ArrayList<java.lang.String>"/>-->

<context:component-scan base-package="com.ioctest"/>
<context:annotation-config/>

</beans>


这个就可以正确启动了:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class Tester {

public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("test.xml");
List<String> listStr = (List<String>) applicationContext.getBean("listStr");
listStr.add("ddd");
}
}
### Kotlin 中 `@Autowired` 注解与结合使用的示例 在 Spring 和 Kotlin 的开发环境中,`@Autowired` 是用于依赖注入的核心注解之一。当涉及到时,可以通过定义Bean 来实现自动装配的功能。 以下是关于如何在 Kotlin 中使用 `@Autowired` 结合一个具体例子: #### 示例代码 ```kotlin import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service // 定义一个通用的服务接口 interface BaseService<T> { fun process(data: T): String } // 实现针对特定数据类的服务 @Service class IntegerService : BaseService<Int> { override fun process(data: Int): String { return "Processed integer: $data" } } @Service class StringService : BaseService<String> { override fun process(data: String): String { return "Processed string: $data" } } // 使用 @Autowired 自动装配Bean @Service class Processor { @Autowired private lateinit var integerService: BaseService<Int> @Autowired private lateinit var stringService: BaseService<String> fun handleData(data: Any): String { return when (data) { is Int -> integerService.process(data) is String -> stringService.process(data) else -> "Unsupported type" } } } ``` 上述代码展示了如何通过 `@Autowired` 将不同类服务注入到同一个类中[^4]。 - `BaseService<T>` 是一个接口。 - `IntegerService` 和 `StringService` 分别实现了该接口的不同特化版本。 - 在 `Processor` 类中,分别注入了两个不同的服务实例,并根据输入的数据类动态调用对应的方法。 --- ### 关键点解析 1. **延迟初始化 (`lateinit`)** - 在 Kotlin 中,由于非空属性必须在构造函数中初始化,而 Spring 的依赖注入发生在对象创建之后,因此需要使用 `lateinit` 或者可空类来声明字段。 2. **Spring的支持** - Spring 能够识别并区分基于Bean,前提是这些 Bean 已经被正确注册到容器中。如果遇到反射无法获取实际类的情况(如 Java 中提到的擦除问题),则需确保在编译期保留足够的类信息[^3]。 3. **Kotlin 与的安全性** - Kotlin 提供了更严格的类检查机制,能够有效避免运行时错误的发生。例如,在上面的例子中,`process` 方法会强制要求传入正确的参数类,从而减少潜在的风险。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值