簡體   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