java-真正调用bean之后的Spring延迟加载
作者:互联网
我想仅在实际使用后(而不是仅自动装配时)初始化一个(单个)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)或(可能更好)进行“手动”操作时,从Spring应用程序上下文中明确要求Client bean.客户端内部的延迟加载.
问题:是否存在“弹簧”方式来推迟客户端的初始化,直到其任何一种方法被实际调用(例如,像惰性加载之类的东西对于休眠集合起作用)?
我正在使用Spring 4.
解决方法:
编辑:
最简单的方法是@ComponentScan(lazyInit = true,basePackages = …).
先前的答案:
有http://docs.spring.io/spring/docs/3.0.x/javadoc-api/org/springframework/aop/target/LazyInitTargetSource.html
在第一次实际使用之前,不会创建由LazyInitTargetSource包裹的bean.
如何用这种包装纸很好地包裹大多数豆子?一种可能的方法是创建自己的BeanFactoryPostProcessor …
标签:lazy-loading,spring,java 来源: https://codeday.me/bug/20191029/1961139.html