通过注释实现@Autowired @Lazy @Components的最佳方式?
2022-09-01 06:42:15
有没有办法通过注释让仍在工厂中的加载?我发现的问题是,通过在工厂中自动连接我的懒惰组件,一旦工厂加载,它们就会立即实例化,从而否定懒惰的注释。@Lazy
@Component
@Autowired
我已经定义了几个懒惰豆,例如
@Component
@Lazy
public final class CloseableChromeWebDriver
extends ChromeDriver
implements DisposableBean {
...
}
@Component
@Lazy
public final class CloseableFirefoxWebDriver
extends FirefoxDriver
implements DisposableBean {
...
}
重要的是,他们要懒惰,因为
- 每当创建其中一个时,都会弹出浏览器窗口。
- 我的数据驱动测试可能需要也可能不需要其中任何一个或全部,即一次运行可能全部是Firefox,或者可能需要Firefox和Chrome。
- 这更重要,因为实际上我有六个这样的豆子 - Firefox,Chrome,IE,Remote Firefox,Remote Chrome,Remote IE。
- 因此,如果我的测试只使用其中一个,那么我只想显示一个浏览器,而不是所有浏览器。
我有一个用于获取请求浏览器的工厂,但我的第一次尝试失败了,因为每当任何类使用工厂时,所有自动连接的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.
}
}
因此,这是我的第二种方法,即通过应用程序上下文请求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;
}
}
这种方法实现了我的目标,但我觉得它确实否定了使用注释的有用性。有没有一种纯粹基于注释的方法来实现这一点?
- JDK 6
- 春季版 3.2.6.发布
- 没有 xml,只有注释。