繁体   English   中英

从非Spring管理的类中连接Spring管理的Bean

[英]Wiring a spring managed bean from a class which is not managed by spring

是否可以将Spring Managed Bean连接到不受Spring IoC管理的类中? 假设有两个类ClassA (不受spring管理)和ClassB (受Spring管理),是否有可能在ClassA ClassB

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

对的,这是可能的。 您将需要一个ApplicationContextAware实现,以使用ApplicationContext获取Spring Managed Bean实例。 这是一个古老的Spring Framework技巧。

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静态方法在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的引用转换为非托管Bean”的问题。

在您的示例中,由于ClassA不是由Spring管理的,因此您必须在某个地方创建它。 传递一个参考ClassBClassA当您创建的实例ClassA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM