当前位置: 首页 > 知识库问答 >
问题:

Spring:基于Xml的按接口类型自动连接bean列表

戚宏扬
2023-03-14

使用Spring,可以通过接口类注入bean列表,如:

@Component
public class Service {
  @Autowire
  private List<InterfaceType> implementingBeans;
  ...
}

实现此接口的所有已定义bean都将出现在此列表中。

基于注释的方法对我来说是不可能的,因为服务类在一个模块中,不能有Spring依赖关系。

我需要通过xml配置从外部使用这种机制。

<bean id="service" class="...Service">
  <property name="implementingBeans">
    ??? tell spring to create a list bean that resolves all beans of the interfaceType.
  </property>
</bean>

有人知道怎么解决这个问题吗?

编辑:此外,有不止一个Spring应用程序使用此服务。所以最好的解决方案是完全通过xml配置来处理这个szenario。然后,我可以将xml部分复制到所有需要它的spriong应用程序。

我希望避免使用一种初始化bean,它将服务注入,然后必须复制到所有Spring应用程序。

亲切的问候。

共有1个答案

卢德惠
2023-03-14

只有XML的解决方案只需声明一个

控制bean属性是否"自动生成"。这是一个自动过程,其中bean引用不需要在XML bean定义文件中显式编码,而是由Spring容器计算依赖关系。
[...]

解释有点混乱,因为我们期望多个InterfaceTypebean,但是实际字段的类型是List,Spring将能够动态实例化一个,并将所有的InterfaceTypebean添加到其中,然后注射它。

您的XML将简单地看起来像

<bean id="service" class="...Service" autowire="byType">
</bean>

我最初建议的解决方案使用了SpEL。

在具有Spring依赖项的模块中,创建一个DTO

@Component(value = "beanDTO")
public class BeanDTO {
    @Autowire
    private List<InterfaceType> implementingBeans;

    public List<InterfaceType> getImplementingBeans() {
        return implementingBeans;
    }
}

然后使用SpEL从beanDTObean中检索实现Beans的值。

<bean id="service" depends-on="beanDTO" class="...Service">
    <property name="implementingBeans" value="{beanDTO.implementingBeans}" />
</bean>

Spring将创建BeanTDObean,注入所有类型为InterfaceType的bean。然后它将创建服务bean,并将其属性从bean设置为实现bean属性。

以下是对问题的评论:

为了更符合JSR330,Spring引入了对JavaEE的javax的支持。注入包。现在,您可以使用@javax注释注入目标。注射注入而不是@Autowired。同样,可以使用@Named而不是@Component。文件中有更多细节。

 类似资料:
  • 问题内容: 我有一类具有类型的对象列表。 我的弹簧配置看起来像这样。 现在,可以在列表中自动自动连接所有类型的bean,而不是显式连接列表中的每个守护程序实现。我要解决的问题是,如果有人创建了类的新实现的bean,却忘记将其连接到列表中。 我已经在stackoverflow上的某个地方看到了这个问题,但无法再次找到它。对此表示歉意。 问题答案: 它应该像这样工作(从您的XML中删除ArrayLis

  • 我是Spring的新手。我正面临Spring-Boot的问题。我正在尝试将外部配置文件中的字段自动装配到自动装配的bean中。我有以下类 应用程序。Java语言 AppConfig。Java语言 服务接口 服务1 我无法在App类的postconstruct方法中显示服务名称变量。我这样做对吗?

  • 我正在使用Spring配置文件(xml配置)进行Spring自动布线。我想根据一个条件注射豆子。让我详述一下。 有两个类“”和“”,它们实现了接口。在配置文件中为这两个类配置了bean。 > 我有另一个类,其中有一个类型为的实例变量。 我想根据SenderUser.getType()的值将注入到SenderUser的bean中。这意味着首先应该设置sernderuser.type,然后基于它的值(

  • 我通过Spring Boot 1.1.8使用Spring 4,并创建了一个类来缓存一些数据。这个类依赖于泛型来工作,但我在Spring和将这个类自动连接为另一个服务中的bean方面遇到了问题。 我会遇到如下错误: 所涉及的班级: 类BaseRepository扩展JpaRepository如下。其他实际存储库扩展了这个。 BaseWithName类是一个MappedSuperclass,它定义名称

  • 我正在使用Swing和Spring创建一个金融应用程序。在应用程序的一部分中,我有一个,其中包含应用程序中每个的。单击时,我希望在中显示类型的。这都是在下面的控制器中执行的。 会为每个点击更改,因此我将设置为一个原型bean,因此我将为每个帐户接收一个新实例。为了使原型作用域工作,我需要使用。以下是代码: 您将注意到我试图自动连接类型的bean。但是,该bean没有正确地自动连接,它是空的。以下是

  • 问题内容: 可以与列表一起使用吗? 就像我有带有mimetypes的属性文件,而在我的班级文件中,我有类似的东西 问题答案: Spring 4支持自动收集给定类型的所有bean并将其注入到集合或数组中的能力。 例: