真正调用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应用程序上下文请求Client
bean来执行双重检查锁定
问:是否有一种“spring”方式来推迟客户机的初始化,直到它的任何方法被实际调用为止(例如,hibernate集合中的延迟加载)
我正在使用Spring4
# 1 楼答案
啊,好吧,我应该更仔细地阅读javadoc。。。解决方案似乎添加了一个“每个”自动连线依赖项:
无论如何——如果有人知道是否有可能省略这样的声明,因为它可能容易出错——人们很容易忘记在每个注入点使用@Lazy
# 2 楼答案
编辑:
最简单的方法是@ComponentScan(lazyInit=true,basePackages=…)
之前的答案:
有http://docs.spring.io/spring/docs/3.0.x/javadoc-api/org/springframework/aop/target/LazyInitTargetSource.html 在第一次实际使用之前,不会创建用LazyInitTargetSource包装的bean。 如何用这种包装纸很好地包装大部分豆子?一种可能的方法是创建自己的BeanFactory后处理器