自动装配不适用于非弹簧单例

我有一个非 spring public class MySingleton,它通过 Spring 注入了 MyBattis Mapper,如下所示:


public class MySingleton{


    @Autowired

    MyMapper myMapper


    private List<MyPojo> myList;

    private MySingleton(){

       myList = myMapper.getMyList();

    }


    public static MySingleton getInstance(){        

        if(instance == null){//first check

            synchronized (MySingleton.class) {

                if(instance == null){// second check

                    instance = new MySingleton();                   

                }       

            }           

        }

        return instance;

    }

}

myMapper从未初始化,它在构造函数中始终为 null。我已经测试过该 bean 是在我的 Singleton 之前声明和创建的,我也尝试过Configurable注释,但没有任何作用。


谁能帮我?


收到一只叮咚
浏览 157回答 4
4回答

HUH函数

为了在非托管类上检索托管 spring bean,我编写了一个类来执行您想要执行的操作。@Configurationpublic class ApplicationContextProvider {&nbsp; &nbsp; private static ApplicationContext context;&nbsp; &nbsp; public ApplicationContextProvider(ApplicationContext context){&nbsp; &nbsp; &nbsp; &nbsp; ApplicationContextProvider.context = context;&nbsp; &nbsp; }&nbsp; &nbsp; public static ApplicationContext getContext() {&nbsp; &nbsp; &nbsp; &nbsp; if (Objects.isNull(ApplicationContextProvider.context)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new IllegalStateException("Context isn't available!");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return ApplicationContextProvider.context;&nbsp; &nbsp; }&nbsp; &nbsp; public static <E> E getBean(Class<E> bean){&nbsp; &nbsp; &nbsp; &nbsp; return getContext().getBean(bean);&nbsp; &nbsp; }}要获得托管 bean,只需ApplicationContextProvider.getBean(MyMapper.class);

30秒到达战场

您可以在非托管类中实现ApplicationContextAware接口。这将导致应用程序上下文通过 setter 注入,并允许您访问 Spring 生态系统的其余部分。然后你就可以打电话了applicationContext.getBean(MyMapper.class);。

慕斯王

对MyMapper类进行@Component注解。这意味着当使用基于注解的配置和类路径扫描时,Spring框架将自动检测这些类进行依赖注入。

湖上湖

MyMapper 这个类没有在 IOC 中注册为 bean。首先使用@Component或XML文件将MyMapper类注册为bean然后运行
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java