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

Java 真正调用bean之后的Spring延迟加载,java,spring,lazy-loading,Java,Spring,Lazy Loading,我希望(单例)bean只有在实际使用后才被初始化(而不是只有自动连接时)。假设我有一个客户机,我只想在调用它的任何方法时初始化它 @Component @Lazy(true) public class Client { @PostConstruct void init() {} void action(){} } 我有一个服务类,有时使用它(有时可能不使用) 现在,由于@Autowired和服务被急切加载的事实,客户端在应用程序启动时就被初始化,而没有实际使用 目前我

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

@Component
@Lazy(true)
public class Client {

    @PostConstruct
    void init() {}
    void action(){}
}
我有一个
服务
类,有时使用它(有时可能不使用)

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

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

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


我正在使用Spring4。

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

@Autowired
@Lazy
Client client;

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

编辑:
最简单的方法是@ComponentScan(lazyInit=true,basePackages=…)

先前的答案:
有 在第一次实际使用之前,将不会创建使用LazyInitTargetSource包装的bean。
如何用这种包装纸很好地包装你的大部分豆子?一种可能的方法是创建自己的BeanFactoryPostProcessor…

打开参考文档(单页):。然后按Ctrl-F键,然后键入“lazy”。然后点击F3,直到你在文档中找到你想要的。你也可以阅读你已经在使用的惰性注释的javadoc。
@Autowired
@Lazy
Client client;