Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以选择<;T>;和“懒”在春天一起工作? 我必须让我@Component@Lazy,因为它很少使用,并且会产生循环依赖性问题 我必须将它设置为可选的,因为它所代表的功能可以在启动时被禁用(@ConditionalOnProperty),所以它在运行时可能不可用_Java_Spring - Fatal编程技术网

Java 是否可以选择<;T>;和“懒”在春天一起工作? 我必须让我@Component@Lazy,因为它很少使用,并且会产生循环依赖性问题 我必须将它设置为可选的,因为它所代表的功能可以在启动时被禁用(@ConditionalOnProperty),所以它在运行时可能不可用

Java 是否可以选择<;T>;和“懒”在春天一起工作? 我必须让我@Component@Lazy,因为它很少使用,并且会产生循环依赖性问题 我必须将它设置为可选的,因为它所代表的功能可以在启动时被禁用(@ConditionalOnProperty),所以它在运行时可能不可用,java,spring,Java,Spring,问题: 当我使用Optional作为注入点时,bean被急切地初始化。 因此,问题是: 有可能让它像那样工作吗 我可以用提供程序替换可选?如果功能被禁用,它会简单地返回null,还是抛出异常 是否可以将其替换为ObjectProvider 我想坚持使用@Resource或@Inject注释,因此@Autowired(required=false)将是我最后的选择 这里实际上没有可共享的代码(因为只有类和字段声明才相关) 既然你不相信我,代码在这里毫无价值,让我来分享:) 注入点 @Lazy @A

问题: 当我使用
Optional
作为注入点时,bean被急切地初始化。

因此,问题是:

  • 有可能让它像那样工作吗
  • 我可以用
    提供程序
    替换
    可选
    ?如果功能被禁用,它会简单地返回
    null
    ,还是抛出异常
  • 是否可以将其替换为
    ObjectProvider
  • 我想坚持使用
    @Resource
    @Inject
    注释,因此
    @Autowired(required=false)
    将是我最后的选择 这里实际上没有可共享的代码(因为只有类和字段声明才相关)

    既然你不相信我,代码在这里毫无价值,让我来分享:)

    注入点

    @Lazy
    @Autowired
    private Optional<MyType> myType;
    

    Iv在应用程序启动时测试
    可选
    和调试器点击
    MyType
    。当我使用普通字段、提供程序或对象提供程序时,它会被跳过。

    在这种情况下,我不会直接连接
    组件,而是懒洋洋地连接。有不同的选择:

    浏览
    ApplicationContext
    并在需要时检索
    MyType
    。只有当您知道它已启用时,才会检索它:

    @Autowire
    private ApplicationContext context;
    ...
    MyType instance = context.getBean(MyType.class);
    
    提供者或工厂方法,其中您有一个自动连线服务,为您提供
    MyType
    的实例。此服务也仅在启用该功能时调用

    @Autowire
    private MyTypeFactory factory;
    ...
    MyType instance = factory.getMyType();
    

    使用
    提供程序
    需要您在配置中定义一个bean,因此可能更容易使用一个POJO服务,您可以在其上使用
    @service
    ,这也是一样的。

    在这种情况下,我不会直接连接
    组件
    ,而是懒洋洋地连接。有不同的选择:

    浏览
    ApplicationContext
    并在需要时检索
    MyType
    。只有当您知道它已启用时,才会检索它:

    @Autowire
    private ApplicationContext context;
    ...
    MyType instance = context.getBean(MyType.class);
    
    提供者或工厂方法,其中您有一个自动连线服务,为您提供
    MyType
    的实例。此服务也仅在启用该功能时调用

    @Autowire
    private MyTypeFactory factory;
    ...
    MyType instance = factory.getMyType();
    

    使用
    提供程序
    需要在配置中定义一个bean,因此可能更容易使用一个POJO服务,您可以在其上使用
    @service
    ,这也可以做到。

    让我来介绍另一种观点。我认为为此使用可选依赖项是不合理的

    具有自动连线MyType的类可能依赖于此依赖关系(尽管在数据字段中使用Optional是一种不好的做法)

    组件懒惰的原因似乎更多的是“黑客”而不是意图(循环依赖从来都不是一件好事)

    因此,如果我们假设这个类使某些东西“可选可用”,一种方法是为这个
    MyType
    有问题的bean提供一个额外的无操作实现:

    interface MyType {
       void doSomeHeavyStuff();
    }
    
    public class MyTypeRegularImpl() implements MyType {
       public void doSomeHeavyStuff() {
         ....work..work..work..
       }
    }
    
    public class NoOpMyType implements MyType {
       public void doSomeHeavyStuff() {
         // do nothing here
       } 
    }
    
    现在的诀窍是提供两个互斥条件,并确保这两个加载中只有一个bean(否则它将在bean中产生歧义,并可能在应用程序启动期间失败)

    因此,使用MyType的类根本不需要可选的

    关于懒惰。 一般来说,懒惰的bean只得到ini 懒Bean仍然可以使用,因为该Bean将在具有该懒依赖项的类中的第一次调用期间初始化


    对于无操作bean,这一点都不重要。

    让我提出另一种观点。我认为为此使用可选依赖项是不合理的

    具有自动连线MyType的类可能依赖于此依赖关系(尽管在数据字段中使用Optional是一种不好的做法)

    组件懒惰的原因似乎更多的是“黑客”而不是意图(循环依赖从来都不是一件好事)

    因此,如果我们假设这个类使某些东西“可选可用”,一种方法是为这个
    MyType
    有问题的bean提供一个额外的无操作实现:

    interface MyType {
       void doSomeHeavyStuff();
    }
    
    public class MyTypeRegularImpl() implements MyType {
       public void doSomeHeavyStuff() {
         ....work..work..work..
       }
    }
    
    public class NoOpMyType implements MyType {
       public void doSomeHeavyStuff() {
         // do nothing here
       } 
    }
    
    现在的诀窍是提供两个互斥条件,并确保这两个加载中只有一个bean(否则它将在bean中产生歧义,并可能在应用程序启动期间失败)

    因此,使用MyType的类根本不需要可选的

    关于懒惰。 一般来说,懒惰的bean只得到ini 懒Bean仍然可以使用,因为该Bean将在具有该懒依赖项的类中的第一次调用期间初始化


    对于无操作bean来说,这一点都不重要。

    您能展示几行代码吗?
    ObjectProvider`在我看来是一种替代注入可选依赖项的方法,为什么不简单地提供“NULL”MyType实现,它将什么都不做(或者像您的示例中那样抛出异常)在这种情况下,如果相应的功能被关闭。你能显示几行代码吗?
    ObjectProvider`在我看来是一种替代注入可选依赖项的方法,为什么不简单地提供“NULL”MyType实现,它将什么都不做(或者像你的示例中那样抛出异常)如果相应的功能已关闭,则在这种情况下。