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