Bir fabrikada ek açıklamalarla hala yükleme @Component
yüklüyorsa, @Autowired
var mı? Bulduğum problem, tembel bileşenlerin fabrikada otomatik olarak bağlanmasıyla, fabrika yüklendikten hemen sonra anında temsili açılacak ve bu, tembel bilgi notunu ortadan kaldıracaktır. BöyleAçıklamalarla @Outowired @Lazy @Components'ı elde etmenin en iyi yolu?
@Component
@Lazy
public final class CloseableChromeWebDriver
extends ChromeDriver
implements DisposableBean {
...
}
@Component
@Lazy
public final class CloseableFirefoxWebDriver
extends FirefoxDriver
implements DisposableBean {
...
}
O
bunlardan biri oluşturulduğunda her- , tarayıcı penceresi açılır çünkü tembel olması önemlidir olarak
Ben tanımladığınız birkaç tembel fasulye.
- Veriye dayalı testlerim bunlardan herhangi birine veya tümüne ihtiyaç duyuyor olabilir ya da gerektirmeyebilir, yani bir çalışma Firefox olabilir ya da Firefox ve Chrome gerektirebilir.
- Bu daha önemlidir çünkü aslında altı tane fasulyem var - Firefox, Chrome, IE, Uzak Firefox, Uzak Chrome, Uzak IE.
- Eğer testlerim bunlardan sadece birini kullanıyorsa, o zaman sadece bir tarayıcının göstermesini istiyorum, hepsini değil.
Ben istenen tarayıcı almak için Fabrikası var, ancak herhangi bir sınıf fabrikası kullanılan her, autowired fasulye tüm bakılmaksızın aslında istendi bakılmaksızın, hemen örneğinin oluşturulmasını çünkü bu benim ilk girişimi başarısız oldu. Anlıyorum çünkü sınıf bir kez örneklendiğinde, ona ait tüm örnek değişkenleri örneklendirmelidir. Yani burada
@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.
}
}
uygulama bağlamında yoluyla fasulye isteyerek tembel yükleme sağlamaktır benim ikinci yaklaşımdır:
@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;
}
}
Bu yaklaşım benim hedefe ulaşır, ama gerçekten faydasını olumsuzlar hissetmek ek açıklamaları kullanarak. Bunu başarmak için tamamen ek açıklama yolu var mı?
- JDK 6
- Bahar 3.2.6.RELEASE
- Hiçbir xml, sadece ek açıklamalar.
Şüphesiz '@ Lazy' özniteliği, fasulyenin tanımına değil, fasulyenin kullanıcısına gider. Bu yüzden, o lazerin tembel yüklü olması için ihtiyaç duyduğu her yere 'Lazy'yi koymanızı beklerim. EVERYWHERE ise, ilk kullanıldığında fasulye yaratılacaktır. –
@AshleyFrieze Ne dediğinizi yanlış anlamadıkça, hiçbir "@ Lazy" fasulye kullanıcısına gitmiyor. [@Lazy Javadoc] 'dan (http://docs.spring.io/spring/docs /current/javadoc-api/org/springframework/context/annotation/Lazy.html): _May, @Component ile doğrudan veya dolaylı olarak eklenmiş herhangi bir sınıfta veya @Bean ile açıklamalı yöntemlerde kullanılabilir ....Varsa ve true olarak ayarlanırsa, @Bean veya @Component başka bir fasulye tarafından referans alınana kadar veya BeanFactory._ –
@ AshleyFrieze'den açıkça alınana kadar başlatılmayacaktır, Spring 4'te, Biju'nun yanıtına göre aslında haklısınız demektir. teşekkürler :) –