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

从不被Spring管理的类中连接一个Spring管理的bean

洪富
2023-03-14

有没有可能将Spring托管Bean连接到一个不受Spring IoC管理的类中?假设有两个类ClassA(不受Spring管理)和ClassB(由Spring管理)有没有可能将ClassB连接到ClassA中。

这是我最近遇到的一个问题,我不知道该怎么做?

共有2个答案

左仰岳
2023-03-14

如果Spring没有管理bean,那么就不要考虑“连线”。相反,只需解决“如何将托管bean的引用转换为非托管bean”的问题。

在您的示例中,由于ClassA不是由Spring管理的,所以您必须在某个地方创建它。创建ClassA实例时,将对ClassB的引用传递给ClassA

锺玺
2023-03-14

是的,这是可能的。要使用ApplicationContext获取Spring托管Bean实例,需要一个ApplicationContextAware实现。这是一个古老的Spring框架技巧。

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public final class BeanUtil implements ApplicationContextAware {

     private static ApplicationContext CONTEXT;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        CONTEXT = applicationContext;
    }

    public static <T> T getBean(Class<T> beanClass) {
        return CONTEXT.getBean(beanClass);
    }    
}

然后,您必须在ClassA中使用BeanUtil::getBean静态方法来获取Application ationContext中的ClassB实例。

public class ClassA {    

    private ClassB classB;

    @Override
    public String toString() {
        return "ClassA - " + getClassB().toString();
    }    

    // Lazy initialization of ClassB to avoid NullPointerException
    private ClassB getClassB() {

        if (classB == null) {
           classB = BeanUtil.getBean(ClassB.class);
        }

        return classB;
    }
}
 类似资料:
  • 问题内容: 我有一个通过调用构造函数实例化的类(Class ABC)。ABC类又具有通过自动接线注入的辅助类(XYZ类)。 我们的是基于Spring MVC的应用程序,在服务器启动时我看不到任何异常。 但是我仍然看到XYZ类为空。是否是因为Spring Container没有实例化ABC类? 在这种情况下,如何使用自动接线? 谢谢。 问题答案: 你可以使用这种方式在非spring bean类中使用

  • 我正在使用Spring的事务支持和JPA(Hibernate)来持久化我的实体。一切正常,但我在处理一个请求中的部分更新时陷入困境: 对于每个用户(HTTP)请求,我必须将一个日志条目写入数据库表,即使“主”业务实体的更新失败(例如,由于验证错误)。因此,我的第一个/主要事务get被回滚,但第二个(写日志)应该提交。这似乎可以使用正确的传播级别来写入日志条目: 然而,我的问题是,我在第二个事务中注

  • 问题内容: 我在python应用程序中使用的是将简单变量或变量列表存储在Redis数据库中,所以我认为最好在每次需要保存或检索变量时都建立与Redis服务器的连接,因为这样做没有做通常,并且不想建立可能会超时的永久连接。 通过阅读一些基本教程,我使用Redis类创建了连接,但是还没有找到关闭连接的方法,因为这是我第一次使用Redis。我不确定是否使用最佳方法来管理连接,所以我需要一些建议。这就是我

  • 创建一个连接 类org.jivesoftware.smack.XMPPConnection管理你的XMPP服务器的连接,默认实现类为org.jivesoftware.smack.XMPPTCPConnection。 主要是使用两个构造函数,第一个是 XMPPTCPConnection(String) ,它把 你想连接到服务器名称 作为参数。 连接和断开 // Create the configur

  • 我们有一个项目是建立在双向grpc客户机/服务器上的C++。客户端只与服务器建立一个连接。服务器将有多个客户端。通过“netstat”命令,服务器端显示来自同一客户端的多个已建立的连接,但客户端当时只有一个与该服务器的活动连接。 以下是一个例子: tcp6 0 0 serverip:端口clientip:48677已建立 tcp6 0 0 serverip:端口clientip:53149已建立

  • 我是Spring保安的新手。我有一个要求做一个基于URL的身份验证,其中用户需要被认证基于唯一的引用,将发送每次作为一个参数在URL。我将把这个引用传递给webservice,获取所需的数据,然后对用户进行身份验证(并设置角色)。身份验证和授权部分工作正常。 但是,当我再次尝试访问应用程序时(现在在URL中使用了不同的引用),它表示“SecurityContextholder没有用匿名令牌填充,因