从不受 spring 管理的类中连接弹簧管理的 bean

  • 本文关键字:管理 连接 bean spring spring
  • 更新时间 :
  • 英文 :


是否可以将 Spring 管理的 Bean 连接到一个不是由春季国际奥委会管理?假设有两个类ClassA(不由 spring 管理(和 ClassB(由Spring管理(是否可以在ClassAClassB接线。

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

是的,这是可能的。您需要一个ApplicationContextAware实现才能使用 ApplicationContext 获取 Spring 托管 Bean 实例。这是一个古老的 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);
    }    
}

然后BeanUtil::getBean必须在 ClassA 中使用静态方法来获取 ApplicationContext 中的 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;
    }
}

如果 Spring 没有管理豆子,请忘记"布线"。相反只需解决"如何将对托管 Bean 的引用获取到非托管 Bean"的问题。

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

最新更新