Rob*_*ram 30 java spring lazy-loading
有没有办法通过注释进行仍在工厂中的@Lazy加载?我发现的问题是,通过在工厂中自动装配我的惰性组件,它们将在加载工厂后立即实例化,从而否定惰性注释.@Component@Autowired
我已经定义了几个懒豆,比如
@Component
@Lazy
public final class CloseableChromeWebDriver
extends ChromeDriver
implements DisposableBean {
...
}
@Component
@Lazy
public final class CloseableFirefoxWebDriver
extends FirefoxDriver
implements DisposableBean {
...
}
Run Code Online (Sandbox Code Playgroud)
重要的是他们懒惰,因为
我有一个工厂用于获取所请求的浏览器,但我第一次尝试此操作失败,因为无论何时任何类使用工厂,所有自动装配的bean都会立即实例化,无论它们是否实际被请求.我理解这是因为一旦实例化了类,它必须实例化属于它的所有实例变量.
@Component
public final class WebDriverFactory {
@Autowired
private CloseableChromeWebDriver chromeWebDriver;
@Autowired
private CloseableFirefoxWebDriver firefoxWebDriver;
public synchronized WebDriver getWebDriver(final Browser browser) {
// get whatever webdriver is matched by the enum Browser.
}
}
Run Code Online (Sandbox Code Playgroud)
所以这是我的第二种方法,即通过应用程序上下文请求bean来确保延迟加载:
@Component
public final class WebDriverFactory {
private CloseableChromeWebDriver chromeWebDriver;
private CloseableFirefoxWebDriver firefoxWebDriver;
@Autowired
private ApplicationContext appContext;
public synchronized WebDriver getWebDriver(final Browser browser) {
WebDriver driver = null;
switch (browser) {
case FIREFOX:
if (firefoxRemoteWebDriver == null) {
firefoxRemoteWebDriver = appContext.getBean("closeableRemoteFirefoxWebDriver",
CloseableRemoteFirefoxWebDriver.class);
}
driver = firefoxRemoteWebDriver;
break;
// etc...
return driver;
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法实现了我的目标,但我觉得它确实否定了使用注释的有用性.是否有纯粹基于注释的方法来实现这一目标?
Bij*_*men 51
你必须@Lazy在你的组件上有一个注释@Autowired.这是因为如果你没有@Lazy你的组件,那么它会被急切地创建为一个bean,如果你没有@Lazyon @Autowired然后你再次热切地创造并注入豆子.所以尝试以下它应该只是工作:
@Component
public final class WebDriverFactory {
@Autowired @Lazy
private CloseableChromeWebDriver chromeWebDriver;
@Autowired @Lazy
private CloseableFirefoxWebDriver firefoxWebDriver;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32798 次 |
| 最近记录: |