有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

真正调用bean之后的JavaSpring延迟加载

我希望(单例)bean只有在实际使用后才被初始化(而不是只有自动连接时)。假设我有一个Client,我只想在调用它的任何方法时初始化它

@Component
@Lazy(true)
public class Client {

    @PostConstruct
    void init() {}
    void action(){}
}

我有一个Service类,有时使用它(有时可能不使用)

@Service
public class Service {

    @Autowired
    Client client;

    void action1WithClient(){}
    void action2WithClient(){}
    void actionWithoutClient(){}
}

现在,由于@Autowired和Service被急切地加载的事实,客户机在应用程序启动时就被初始化,而没有实际使用

目前我想到的唯一解决方案是,当有人试图使用(即不使用@Autowired)或(可能更好)在Client内执行“手动”延迟加载时,通过显式地从spring应用程序上下文请求Clientbean来执行双重检查锁定

问:是否有一种“spring”方式来推迟客户机的初始化,直到它的任何方法被实际调用为止(例如,hibernate集合中的延迟加载)

我正在使用Spring4


共 (2) 个答案

  1. # 1 楼答案

    啊,好吧,我应该更仔细地阅读javadoc。。。解决方案似乎添加了一个“每个”自动连线依赖项:

    @Autowired
    @Lazy
    Client client;
    

    无论如何——如果有人知道是否有可能省略这样的声明,因为它可能容易出错——人们很容易忘记在每个注入点使用@Lazy