当前位置: 首页 > 知识库问答 >
问题:

通过注释实现@Autowired@Lazy@组件的最佳方法?

公孙辰龙
2023-03-14

有没有办法让@Lazy通过注释加载工厂中仍然是@Autowired@组件?我发现的问题是,通过在工厂中自动连接我的惰性组件,一旦工厂加载,它们都会立即被实例化,从而否定惰性注释。

我已经定义了几个懒人豆,比如

@Component
@Lazy
public final class CloseableChromeWebDriver
      extends ChromeDriver
      implements DisposableBean {
...
}

@Component
@Lazy
public final class CloseableFirefoxWebDriver
      extends FirefoxDriver
      implements DisposableBean {
...
}

他们懒惰是很重要的,因为

  • 每当创建其中一个时,浏览器窗口就会弹出。
  • 我的数据驱动测试可能需要也可能不需要其中任何一个或全部,即一次运行可能是所有的Firefox,或者可能需要Firefox和Chrome。
  • 这更重要,因为事实上我有六个这样的bean-Firefox,Chrome, IE, Remote Firefox, RemoteChrome, 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

共有1个答案

盖弘毅
2023-03-14

你必须在你的组件上有@Lazy注释,也必须在组件中的@Autowired位置。这是因为如果您的组件上没有@Lazy,那么它会被急切地创建为bean,如果您的@Autowired上没有@Lazy,那么它会被急切地创建并注入bean中。所以,试试下面的方法,它应该就行了:

@Component
public final class WebDriverFactory {
   @Autowired @Lazy
   private CloseableChromeWebDriver chromeWebDriver;
   @Autowired @Lazy
   private CloseableFirefoxWebDriver firefoxWebDriver;
 类似资料:
  • 对于Spring Boot应用程序,我使用注释成功地配置了Spring,包括应用程序中带有s的依赖项。财产。(呜呜!我找不到一个例子,所以这可能会帮助其他人。) 下面的代码片段设置了上下文源,将其插入到中,并将其自动连接到my DirectoryService中。 有没有更好/更干净的方法来设置在Spring Boot应用程序中? 应用属性(在类路径上): MyLdapContextSource.

  • 本文向大家介绍Java注释的最佳做法。,包括了Java注释的最佳做法。的使用技巧和注意事项,需要的朋友参考一下 Java支持单行,多行注释和文档注释。文档注释由javadoc工具理解,可用于创建基于HTML的文档。以下是在Java中使用注释时的最佳实践。 每当您希望生成其文档时,请使用文档注释。  多行注释用于注释掉未使用的代码。 最好在代码中使用单行注释,并且注释应该足够有意义以展示业务逻辑的目

  • 问题内容: 经过研究: 如何创建一个Zip文件 和一些谷歌研究,我想出了这个Java函数: 这段代码可以正常工作…但是它一点也不干净。任何人都有一个不错的主意或示例? 编辑: 如果zip归档文件的结构正确,我希望能够添加某种类型的验证…因此像普通文件一样复制它而不考虑其内容对我来说不起作用…或者您希望以后再检查它…我不确定这个 问题答案: 您只想复制完整的zip文件?不需要打开并阅读zip文件…复

  • 我试图构建我的第一个Spring MVC项目,我一直在阅读大量的教程,观看视频等...但我面临着这个问题: 说明服务器遇到一个内部错误,使其无法满足此请求。 例外 servletException:servlet的servlet.init()springDispatcherServlet抛出异常

  • x、y、类 我如何才能最好地利用这些单个像素注释的知识来执行一个好的语义分割? 之前也有人问过类似的问题,得到的回答是使用图割: 编辑:我的数据集大约有10个不同的类,每个图像大概平均有5个。注释者不能保证注释每一个宗教,但很少会漏掉一个(少数缺失的区域或错误标注的区域是可以容忍的)。每个类对应于纹理一致的区域,纹理是相当恒定的(想想天空,污物,水,山)。你不能从一个点获得纹理,但几乎所有的区域都

  • 问题内容: 我们如何确定用于集合的方法的最佳实现(假设equals方法已被正确覆盖)? 问题答案: 最好的实现?这是一个难题,因为它取决于使用模式。 在几乎所有情况下,Josh Bloch的 有效Java项目8(第二版)中都提出了合理的良好实现。最好的办法是在那里查找,因为作者在那里解释了为什么这种方法很好。 简短版 1. 创建一个并分配一个非零值。 对于在方法中测试的每个字段 f,通过以下equ